[Java] DTO Class vs Record

node·2024년 8월 13일
1

VS 시리즈

목록 보기
3/3
post-thumbnail

들어가며


스프링 부트로 API 서버를 개발하다보면 자연스럽게 사용하게 되는 DTO(Data Transfer Object).
일반적으로 나는 Class를 이용해 개발했었는데 Java 14 부터 등장한 Record라는 타입이 있어 어떤 특징이 있는지 학습 해보려고 한다.

본론


DTO(Data Transfer Object)란?

: 말 그대로 데이터 전송에 사용하는 객체를 뜻하며,

프레젠테이션 계층(Controller) <-> 비즈니스 계층(Service) <-> 데이터 엑세스 계층(Repository)

위 처럼 각 계층간 데이터를 주고 받을때 데이터를 규격화하고 유효성을 검증하는 용도로 사용된다.

Class vs Record

: 그럼 DTO를 만들때 각 타입별로 무슨 차이점이 있는지 알아보자

  • Class를 사용한 DTO
    • 필드를 컨트롤 할 함수들을 직접 작성하거나 Lombok 어노테이션을 이용해 선언을 해줘야 한다.
    • 유동적으로 필드 별로 불변(final) 속성을 선택적으로 줄 수 있다.
public class UserDTO {

    @NotNull
    private String name;

    @Email
    private String email;

    @Min(18)
    private int age;
    
    // Getter 및 Setter
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
  • Record를 이용한 DTO
    • 생성자, getter, equals, hashcode, toString 메서드를 자동으로 생성되어 코드가 단순하다.
    • 필드로 지정한 모든 데이터들은 불변(final) 속성을 가진다.
    • 필드 값이 final 이기 때문에 선언 이후 데이터 변경이 불가능하다.
public record UserDTO(
    @NotNull String name,
    @Email String email,
    @Min(18) int age
) {
    // 필요한 경우, 생성자에 추가적인 검증 로직을 삽입할 수 있습니다.
    public UserDTO {
        if (age < 18) {
            throw new IllegalArgumentException("Age must be at least 18.");
        }
    }
}

그래서 Record가 무조건 좋다?

: Record 타입의 DTO가 자주 쓰는 함수를 알아서 생성해주기 때문에 코드가 확실히 짧아져 작성하기 쉽고 편하다. 하지만 무조건 필드를 불변(final)로 처리하기 때문에 데이터가 변경되는 로직에서는 사용하기 힘들다.

결론


DTO를 만들때 사용할수 있는게 하나 늘었다.
DTO를 이용할때 데이터를 변경할 일이 없다면 되도록이면 Record를 사용해보도록 해봐야겠다.
추후에 사용하면서 느낀점을 다시 다뤄보겠다.

profile
NOvice + DEveloper

0개의 댓글