[Spring Boot] DTO 적용과 유효성 검증 방법

Lundy·2023년 5월 9일
0

Spring Boot

목록 보기
5/6
post-thumbnail

DTO(Data Transfer Object) 란?

말 그대로 데이터 전송 용도의 객체를 의미한다.

DTO는 보통 여러 필드로 구성되어 있고 비즈니스 로직을 포함하지 않으며, 오직 데이터만을 저장하고 전달하는 객체이다.

따라서 서로 다른 객체 간의 데이터 교환을 용이하게 해 준다는 특징이 있다.

DTO의 필요성

// 레거시 코드
@PostMapping
public ResponseEntity postMember(@RequestParam("email") String email,
                                 @RequestParam("name") String name,
                                 @RequestParam("phone") String phone) {
		// 유효성 검증
		// 데이터 객체 생성
		...
}

// DTO 적용
@PostMapping
public ResponseEntity postMember(@Valid MemberDto memberDto) {
}
  • DTO 클래스를 따로 만듦으로써 @RequestParam 등의 파라미터를 줄일 수 있음
  • DTO 클래스 하나가 요청 데이터를 하나의 객체로 전달받는 역할을 해 줌
    • HTTP 요청을 전달받는 핸들러 메서드 코드의 간결성 ⬆️
  • 유효성 검증 코드를 DTO 클래스로 빼서 validation 을 단순화할 수 있음
  • HTTP 요청의 수를 줄일 수 있음
  • Entity, API 계층 등의 관심사를 서로 분리할 수 있음
    • DTO 클래스는 비즈니스 로직을 가지지 않으므로 유지 보수가 편리함
  • REST API 스펙의 독립성 확보
    • 회원의 로그인 정보 등을 클라이언트에 노출하지 않고 원하는 정보만 제공할 수 있음

DTO 사용 방법

  1. DTO 클래스 생성
@Getter
@Setter
public class MemberPostDto {
    private String email;
    private String name;
    private String phone;
}
  1. Controller에 DTO 적용
@PostMapping
public ResponseEntity postMember(@RequestBody MemberPostDto memberPostDto) {
    return new ResponseEntity<>(memberPostDto, HttpStatus.CREATED);
}
  • @RequestBody
    • 클라이언트에서 전송한 JSON 형식의 Request Body를 MemberPostDto 클래스의 객체로 변환시킴
  • @ResponseBody
    • JSON 형식의 Response Body를 클라이언트에 전달하기 위해 DTO 클래서의 객체를 Response Body로 변환시킴
    • ⭐️ 위 예시에서는 핸들러 메서드의 리턴 값이 ResponseEntity 클래서의 객체이므로 @ResponseBody 를 사용하지 않음

DTO 유효성 검증 적용 방법

  1. build.gradle 라이브러리 추가

    dependencies {
    	implementation 'org.springframework.boot:spring-boot-starter-validation'
    	...
    	...
    }
  2. DTO 클래스에 유효성 검증 코드 추가

    @Getter
    @Setter
    public class MemberPostDto {
    		@NotBlank  // null, 공백, 스페이스 등의 값을 하용하지 않음 
    		@Email     // 유효한 이메일 주소인지 검증
        private String email;
    
    		// 유효성 검증에 실패하면 message가 콘솔에 출력됨
    		@NotBlank(message = "이름은 공백이 아니어야 합니다.")
        private String name;
    
    		// 정규표현식에 매치되는 유효한 번호인지 검증
    		@Pattern(regexp = "^010-\\d{3,4}-\\d{4}$",
    							message = "휴대폰 번호는 010으로 시작하는 11자리 숫자와 하이픈으로 구성되어야 합니다."))
        private String phone;
    }

    💡 정규표현식 테스트 사이트 👉🏻 https://regexr.com/

  3. Controller에 @Valid 애너테이션 추가

    @PostMapping
    public ResponseEntity postMember(@Valid @RequestBody MemberPostDto memberPostDto) {
        return new ResponseEntity<>(memberPostDto, HttpStatus.CREATED);
    }

DTO 단점

  • Controller 클래스가 증가하면 DTO 클래스가 몇 배씩 증가함

더 알아두면 좋은 것

JSON의 직렬화, 역직렬화

직렬화(Serialization)

  • 객체 ➡️ JSON
  • 서버가 클라이언트에 응답 데이터를 전송하기 위해 DTO와 같은 Java 객체를 JSON 형식으로 변환하는 것

역직렬화(Deserialization)

  • JSON ➡️ 객체
  • 서버가 클라이언트에게서 전달받은 JSON 형식의 데이터를 DTO와 같은 Java 객체로 변환하는 것

JSON 포맷 ↔ Java 클래스 변경 온라인 툴
https://jsonformatter.org/json-to-java

profile
아주 사소하더라도

0개의 댓글