본문 바로가기
Spring

[Spring] DTO 란? (Data Transfer Object)

by jungha_k 2022. 10. 21.

https://velog.io/@tjdud3550/Spring-DAO-DTO-VO-Entity

DTO란? (Data Transfer Object)

: 엔터프라이즈 애플리케이션 아키텍처 패턴 중 하나 by 마틴 파울러 

: 데이터를 전송(transfer)하기 위한 용도의 객체

 

클라이언트 ➡ 서버 쪽으로 전송하는 요청 데이터

서버 ➡ 클라이언트 쪽으로 전송하는 응답 데이터

 

 

= 클라이언트 ↔ 서버 간 데이터 전송이 이루어질 때 사용됨 


DTO가 필요한 이유

 

1. 코드의 간결성

컨트롤러에서 @RequestParam을 이용할 경우 가져올 객체 하나하나를 모두 작성해줘야 한다!

➡ 이 데이터들을 하나의 객체로 모두 전달 받을 수 있다면..? 코드 간결!

 

= 요청 데이터를 하나의 객체로 전달 받는다.

(데이터들을 Map에 담지 않아도 되고, 

memberDto 객체를 ResponseEntity 클래스의 생성자 파라미터로 전달받을 수 있게 된다.)

 

 

2. 데이터 유효성(Validation) 검증의 단순화

 

유효성 검증 ? : 서버에서 유효한 데이터를 전달 받기 위해 검증하는 것

( ex) 이메일 입력 칸에 wlikeoxy.com 같이 엉터리 데이터가 들어와서는 안됨)

 

컨트롤러의 핸들러메서드 내에 유효성 검증 로직을 직접 넣어줘도 되지만,

컨트롤러 코드가 복잡하고 길어지고, 역할도 흐려지게 된다.

Dto에서 미리 유효성 검사를 해준다면, 

코드도 깔끔해지고 핸들러 메서드 역할도 잘 살릴 수 있다!

 

Dto 멤버 변수 위에 @Email, @Notblank.. 등 어노테이션을 달아서 유효성 검증

핸들러 메서드 파라미터에 @Valid 달아서 유효성 검증 적용하게 해줌 

 

(* 컨트롤러 핸들러 메서드 안의 변수에 @PathVariable 달렸다면

클래스 레벨에 @Validated 도 추가해 줄것!) 

 

 

3. HTTP 요청의 수를 줄이기 위해

4. 도메인 객체와의 분리 

 


DTO 클래스 적용을 위한 코드 리팩토링 절차 

 

  • 회원 정보를 전달 받을 DTO 클래스를 생성
    • MemberCotroller에서 현재 회원 정보로 전달 받는 각 데이터 항목(email, name, phone)들을 DTO 클래스의 멤버 변수로 추가한다.
  • 클라이언트 쪽에서 전달하는 요청 데이터를 @RequestParam 애너테이션으로 전달 받는 핸들러 메서드를 찾는다.
    • Request Body가 필요한 핸들러는 HTTP POST, PATCH, PUT 같이 리소스의 추가나 변경이 발생할 때 입니다. HTTP GET은 리소스를 조회하는 용도이기 때문에 Request Body는 필요가 없다.
    • 결국 @PostMapping, @PatchMapping 애너테이션이 붙은 핸들러 메서드를 찾는것과 동일하다.
  • @RequestParam 쪽 코드를 DTO 클래스의 객체로 수정한다.
  • Map 객체로 작성되어 있는 Response Body를 DTO 클래스의 객체로 변경한다.

 

 

차이점 ? = 주고 받을 때의 데이터 형식이 다르다!

@RequestParam : http://hello.com/name=example&age=13...

@RequestBody : JSON 형식 ({"key":"value"})

 

JSON 형태로 가져와서 데이터 처리를 하기 때문에

@RequestParam으로 하나씩 가져와서 Map에 넣어주기 보다 @RequestBody를 달아 매핑을 해준다.

 

 

@ResponseBody : JSON 형식으로 전달하기 위해서는 달아줘야 함

but ResponseEntity 객체를 리턴값으로 사용한다? ➡ 생략 가능!

 

 

JSON 직렬화(Serialization): Java 객체 → JSON (클라이언트 → 서버 로 데이터 전송 경우)

JSON 역직렬화(Deserialization): JSON → Java 객체 (서버 → 클라이언트 로 데이터 전송 경우)

 

+

 

차이점 ? = RestController는 ResponseEntity 를 받는다!

@Controller

@RestController

 

 

자바 빈(게터 세터) != 스프링 빈

댓글