Table of Contents

Spring Boot 가이드: DTO

Table of Contents

이번 포스트에서는 Spring Boot에서 DTO의 사용법에 대해 알아보겠습니다.

Github에서 샘플 프로젝트의 전체 코드를 확인할 수 있습니다.

GitHub - xvzc/spring-test: spring test repo


요청 DTO

요청과 응답에 관련된 DTO의 경우, 메인 DTO 클래스의 서브 클래스로 정의하면 DTO 클래스들을 조금 더 깔끔하게 관리할 수 있습니다. Post 요청의 DTO는 추가적으로 DTO를 Entity로 변환하는 로직을 toEntity() 메서드로 감싸주면 더욱 보기좋은 코드를 작성할 수 있습니다.

Mockito 기반의 Unit Test를 진행할 때 Equals를 사용해서 Assertion을 하는 경우가 많기 때문에 equals()와 hashcode()를 오버라이드 합니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package com.example.project.domain.user.dto;

import com.example.project.domain.user.entity.Email;
import com.example.project.domain.user.entity.User;
import lombok.*;

public class UserDto {

    @Getter
    @Builder
    @EqualsAndHashCode
    public static class AddRequest {
        private String username;
        private String password;
        private String nickname;
        private String bio;
        private String email;

        public User toEntity() {
            return User.builder()
                    .username(username)
                    .password(password)
                    .nickname(nickname)
                    .bio(bio)
                    .email(Email.of(email))
                    .build();
        }
    }

	... // 생략

}

응답 DTO

응답 DTO의 경우 엔티티를 인자로 받아 응답 객체로 반환하는 of() 메서드를 구현하면 서비스 레이어에서 더욱 보기좋은 코드를 작성할 수 있습니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package com.example.project.domain.user.dto;

import com.example.project.domain.user.entity.Email;
import com.example.project.domain.user.entity.User;
import lombok.*;

public class UserDto {
		... // 생략

    @Getter
    @Builder
    @EqualsAndHashCode
    public static class Response {
        private String username;
        private String nickname;
        private String bio;
        private String email;

        public static Response of(final User user) {
            return Response.builder()
                    .username(user.getUsername())
                    .nickname(user.getNickname())
                    .bio(user.getBio())
                    .email(user.getEmail().getValue())
                    .build();
        }
    }
}