개발자의 공부방/자바

자바] record를 써보자 feat. DTO

  • -
728x90
반응형

서론

최근(?) 자바 & 스프링의 업데이트로 인해서 기본적인 환경이 변화되고 있습니다.

스프링부트3.0가 되면서 자바의 기본버전도 17부터로 변경됐고

자바 17에서는 기존에 람다와 var와 같은 각종 추가된 새로운 기능도 추가됐습니다.

 

클론 코딩 및 토이 프로젝트를 진행하다 기본적인 DTO 생성 시 Class 에서 record로 변경을 해봤는데

기본적인 이해를 해보고 적용해본 후기를 적어보고자 합니다.

 

레코드의 문법 설명은 건너뛰겠습니다.

문법 참고 사이트

 

레코드 기본적인 형태

public record Person (String name, String age) { }

 

DTO객체의 Class 적용과 record 적용 비교

예시 코드의 설명

ArticleReposne DTO입니다.

Article객체를 매개변수(인자값)로 받는 생성자

 

Class 형태

@Getter
public class ArticleReposne {
    
    private final String title;
    private final String content;

    public ArticleReposne(Article article) {
        this.title = article.getTitle();
        this.content = article.getContent();
    }
}

 

record 형태

public record ArticleResponse(String title, String content) {

    public ArticleResponse(Article article) {
        this(article.getTitle(), article.getContent());
    }
}

 

 

두 소스의 차이점

class형태인 경우 lombok(@Getter)을 사용하고 있으며, 변경될 일이 없을 title, content와 같은 변수를 final로 처리했습니다.

또한 파라미터를 갖는 생성자를 하나 만들었습니다.

 

record는 class와 다르게 lombok을 사용하지 않고 레코드의 특성상 title, content는 불변이기때문에 final을 사용하지 않습니다.

또한 생성자에서 필드 초기화를 자동으로 처리하고 있어 class보다 간결한 형태로 작성할 수 있습니다.

 

 

후기

openjdk에서도 요약 설명을 보면 불변의 데이터에 대한 전달자 역할을 한다고 합니다.

Enhance the Java programming language with records, which are classes that act as transparent carriers for immutable data. Records can be thought of as nominal tuples.

 

레코드는 데이터 전송을 위한 객체로 만들어졌다고 생각하는데요

lombok의 완벽한 대체로 사용하기에는 조금 무리가 있을 수도 있지만

단순한 데이터 전달 클래스로 사용하기에는 더 없이 뛰어나다고 생각하는 바입니다.

 

 

아래는 우연히 유튜브 알고리즘에서 본 record 소개를 해주신 개발자분이 계신데요 한번 보시면 상당히 도움되는 영상이라 링크해봤습니다!

클린아키텍처를 위한 데이터 객체를 record로 표현하였습니다. - YouTube

 

 

 

참고

JEP 395: Records (openjdk.org)

 

JEP 395: Records

JEP 395: Records OwnerGavin BiermanTypeFeatureScopeSEStatusClosed / DeliveredRelease16Componentspecification / languageDiscussionamber dash dev at openjdk dot java dot netRelates toJEP 359: Records (Preview)JEP 384: Records (Second Preview)Reviewed

openjdk.org

 

 

 

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.