DTO ( Data Transfer Object )

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

[서버에서 클라이언트 쪽으로 전송하는 응답 데이터 ] 의 형식으로 클라이언트와 서버 간에 데이터 전송이 이뤄집니다.

 

 

DTO 를 왜 사용하는가?

 

1. 코드의 간결성

 

ResponseEntity 를 통해 데이터를 저장하는 곳에는 @RequestParam 애노테이션이 사용됩니다.

그런데 프로젝트의 규모가 커질 수록 RequestParam 의 개수는 늘어날 수 밖에 없습니다.

만약, 클라이언트와 요청 데이터를 하나의 객체로 모두 전달 받을 수 있다면 코드 자체가 아주 간결해질 것입니다.

DTO 클래스가 바로 요청 데이터를 하나의 객체로 전달 받는 역할을 해줍니다.

 

 

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

 

이메일이 유효한 입력 값인지 확인하려면 email.matches("^[~~$") 와 같이 복잡한 정규 표현식으로 코드를 작성하게 됩니다.

하지만 HTTP 요청을 전달 받는 핸들러 메서드는 요청을 받는 것이 주목적이기 때문에 최대한 간결하게 작성되는 것이 좋습니다.

 

그래서 DTO 클래스에 이러한 유효성 검증을 작성하면 핸들러 메서드에는 아주 간결하게 표현될 수 있습니다.

 

 

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

  • 회원 정보를 전달 받을 DTO 클래스를 생성합니다.

컨트롤러에서 현재 회원 정보로 전달 받는 각 데이터 항복을 DTO 클래스의 멤버 변수로 추가해줍니다.

 

  • 클라이언트 쪽에서 전달하는 요청 데이터를 @RequestParam 애너테이션으로 전달 받는 핸들러 메서드를 찾습니다.

RequestBody 가 필요한 핸들러는 POST, PATCH, PUT 과 같이 리소스 수정/추가 발생할 때 입니다.

GET 은 조회하는 용도이기 때문에 Body 는 필요 없습니다.

 

  • @RequestParam 코드를 DTO 클래스의 객체로 수정합니다.

Map 객체로 JSON 을 받아오는 객체 였다면 Reponse Body 를 DTO 클래스 객체로 변경해줍니다.

 

 

 

 

DTO 클래스에 유효성 검증 적용하기

org.springframework.boot:spring-boot-starter-validation 이라는 디펜던시 항목을 추가해줘야 합니다.

 

[ DTO 내부 멤버에서 검증 애노테이션 ]

@NotBlank : 정보가 비어있지 않은지를 검증

@Email : 이메일 주소인지 검증

@Pattern : 정규표현식에 매치되는 유효한 번호인지 검증

 

[ 유효성 검증 시작 ]

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

@Valid 애노테이션을 추가해줍니다.

 

[ @PathVariable 이 추가된 유효성 검증하기 ]

@RestController
@RequestMapping("/v1/members")
@Validated   // (1)
public class MemberController {
		...
		...

    @PatchMapping("/{member-id}")
    public ResponseEntity patchMember(@PathVariable("member-id") @Min(1) long memberId,
                                    @Valid @RequestBody MemberPatchDto memberPatchDto) {
        memberPatchDto.setMemberId(memberId);

        // No need Business logic

        return new ResponseEntity<>(memberPatchDto, HttpStatus.OK);
    }
}

- @Min(1) : memberId 가 1 이상의 숫자일 경우에만 검증에 통과하도록 해줍니다.

- @Validated : @PathVariable 이 추가된 변수에 유효성 검증이 정상적으로 수행되려면 해당 애노테이션이 필수입니다.

'HTTP' 카테고리의 다른 글

JSON 형식으로 받은 데이터를 객체로 변환하기  (0) 2022.11.26
HTTP 요청 데이터 작성하기  (0) 2022.11.26
RestAPI 활용하기  (0) 2022.08.22
Message States Server  (0) 2022.08.19
HTTP 메서드와 속성  (0) 2022.08.18

+ Recent posts