[SEB BE] Section 3. DTO(Data Transfer Object)?

박두팔이·2023년 2월 14일
0

스프링프레임워크

목록 보기
8/18

DTO란?

DTO(Data Transfer Object)?

엔터프라이즈 애플리케이션 아키텍처 패턴의 하나다.
(마틴 파울러가 처음 책에서 소개하였다.)

  • 클라이언트와 서버 간에 데이터 전송이 이루어 지는 구간에서 DTO를 사용할 수 있다.

    • 요청 데이터 (클라이언트 -> 서버)
    • 응답 데이터 (서버 -> 클라이언트)

DTO 아키텍처 패턴의 장점?

1. 코드의 간결화
: 데이터를 일괄적으로 DTO객체를 통해 받기 때문!

예를들어 @RequestParam 애너테이션을 통해 여러개의 값을 http에 요청한다면 그 메서드에 파라미터로 추가되는 @RequestParam은 계속 늘어날 수 밖에 없을 것이다.

따라서, DTO클래스를 통하여 클라이언트의 요청 데이터를 하나의 객체로 모두 전달 받을 수 있도록한다.

@RestController
@RequestMapping("/v1/members")
public class MemberController {
    @PostMapping
    public ResponseEntity postMember(MemberDto memberDto) {
        return new ResponseEntity<MemberDto>(memberDto, HttpStatus.CREATED);
    }

		...
		...
}

2. 데이터 유효성(Validation) 검증의 단순화
예를들어 고객의 이메일형식이 올바르게 적힌 데이터값인지 확인하고자 할 때, DTO클래스의 email변수명에 @email 애너테이션을 붙여주고 MemberDto객체를 사용하는 곳에 @valid 애너테이션을 꼭! 붙여주어야만 유효성을 검증할 수 있다.

3. ⭐️ 비용이 많이드는 HTTP요청의 수를 줄이는 최대장점!!

💡 DTO클래스를 만들 때 주의해야할 점!💡
1. 각 멤버 변수에 해당하는 getter메서드가 있어야 한다.
2. getter메서드가 없으면 Response Body에 해당 멤버 변수의 값이 포함되지 않는 문제가 발생한다.
3. setter메서드는 필수 항목은 아니지만 개발자의 필요에 의해 있을수도, 없을 수도 있다.

@PostMapping
    public ResponseEntity 
    //@RequestBody가 추가된 것을 알 수 있음
    postMember(@RequestBody MemberPostDto memberPostDto) {
        return new ResponseEntity<>(memberPostDto, HttpStatus.CREATED);
    }

JSON 직렬화(Serialization)와 역직렬화(Deserialization)

JSON 직렬화 (Serialization): Java 객체 → JSON

@RequestBody: 클라이언트 쪽에서 전송한 JSON형식의 {Request Body}를 DTO클래스의 객체로 변환하는 것.(클라이언트 -> DTO)

JSON 역직렬화(Deserialization): JSON → Java 객체

@ResponseBody: DTO클래스의 객체를 JSON형식의 {@Response Body}를 클라이언트에게 전달하는 역할. (DTO -> 클라이언트)

Spring MVC에서는 핸들러 메서드에 @ResponseBody 애너테이션이 붙거나 핸들러 메서드의 리턴 값이 ResponseEntity일 경우, 내부적으로 HttpMessageConverter가 동작하게 되어 응답 객체(여기서는 DTO 클래스의 객체)를 JSON 형식으로 바꿔주기때문에 ResponseBody를 사용하지 않아도 된다.

profile
기억을 위한 기록 :>

0개의 댓글