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
자바 빈(게터 세터) != 스프링 빈
'Spring' 카테고리의 다른 글
[Spring] 스프링 예외처리 (@ExceptionHandler, @RestControllerAdvice) (0) | 2022.10.25 |
---|---|
[Spring] 서비스 계층 (Service Layer) @Service, @Mapper (0) | 2022.10.24 |
[Spring] Controller 구조 및 핸들러 메서드(Handler Method) (0) | 2022.10.21 |
[Spring] Spring MVC란? (0) | 2022.10.21 |
[Spring] AOP가 필요한 이유, AOP 용어 / Advice, Pointcut, JointPoint (0) | 2022.10.18 |
댓글