본문 바로가기
Study/고민

[비교] DTO Class vs Record

by DevJaewoo 2022. 11. 30.
반응형

Intro

기존에 Java 11만 쓰다가 이번 프로젝트에서 Java 17을 처음 써보는데, 클래스 생성 중 Record라는 메뉴가 생겨서 찾아보니 DTO로 쓰기 딱이라는 생각이 들었다.

Record는 Java 16에서 정식 출시된 새 유형의 클래스로, 불변 객체를 생성할 때 사용한다. java.lang.Record를 상속받는다고 한다.

기존에 사용하던 Class 방식에 Record으로 변경했을 때의 장단점을 비교해보자.

Record 생성


Record 특징

1. 보일러 플레이트 코드 제거

다양한 함수를 기본적으로 제공해주기 때문에 보일러 플레이트 코드가 많이 빠진다.

예를 들어 Class를 썼을 때 아래와 같이 선언된 코드가,

public class TestClassDto {

    private final Long id;
    private final String name;
    private final String email;

    public Long getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getEmail() {
        return email;
    }

    public TestClassDto(Long id, String name, String email) {
        this.id = id;
        this.name = name;
        this.email = email;
    }
}

 

Record로는 아래와 같이 선언된다.

위의 코드에는 없지만, equalshashcode, toString도 기본으로 제공해준다.

public record TestRecordDto(Long id, String name, String email) {
}

 

toString의 경우 Class@Hash 형태가 아닌 실제 값을 출력해준다.

System.out.println(new TestClassDto(1L, "name", "email@email.com"));
System.out.println(new TestRecordDto(1L, "name", "email@email.com"));

// 출력 결과
TestClassDto@37918c79
TestRecordDto[id=1, name=name, email=email@email.com]

 

물론 Lombok의 @Getter, @AllArgsConstructor, @EqualsAndHashCode @ToString를 사용하면 줄일 수 있다.

하지만 몇십 개나 되는 DTO 클래스에 위의 어노테이션을 일일이 달아주는 게 상당히 번거로울 것이라고 생각된다.

 

2. final 필드

모든 필드가 final이라 변경을 못하지만, 데이터 변질에 대해 걱정하지 않아도 된다.

애초에 DTO는 말 그대로 데이터를 전송하기 위한 Object이기 때문에 수정을 못하는 건 큰 문제가 되지 않을 것 같다.

Record는 Jackson이 json으로 변환하지 못한다는 글이 몇몇 있었는데, Jackson 2.12.0 버전부터 된다고 한다.

https://carloschac.in/2021/03/04/jacksonrecords/


결론

장점

  • 필드 값 변질의 우려가 없음
  • 대부분의 보일러 플레이트 코드가 사라짐

단점

  • 필드 값 수정 불가
  • 상속 불가 (final 클래스)
  • abstract 선언 불가 (final 클래스)
  • static이 아닌 멤버 변수 선언 불가

 

단점은 대부분 선언의 제약조건이기 때문에 익숙해지면 큰 문제없을 것 같다.

오히려 DTO의 역할을 수행하는 데 있어 장점이 훨씬 크다고 판단했다.

결과적으로 이번 프로젝트의 DTO들은 모두 Record로 만드는 것을 선택했다.

Record 사용 중 다른 이슈가 생기면 이 글에 덧붙이도록 하겠다.


참고자료

 

이 글은 고민을 정리한 글이기 때문에 주관적인 생각이 다소 포함되어있으며, 잘못된 내용이 포함되어있을 수 있습니다.

잘못된 부분이나 해결방안은 댓글로 남겨주시면 감사하겠습니다.

반응형

'Study > 고민' 카테고리의 다른 글

[비교] Tree 구조 API 디자인  (0) 2022.10.29
[비교] Session vs JWT  (0) 2022.10.28