팀프로젝트의 시작단계에서 DTO에 관한 컨벤션을 정하는데 팀원이 "DTO는 Record로 만드는 게 어때?"라며 운을 띄우더라구요. 그때만해도 Record가 무엇인지 몰랐으나 Record의 장점에 대해 나열하는 근거들이 매력적으로 느껴져 Record에 대해 알아보게 되었습니다.
3.x.x 대의 SpringBoot가 필수적으로 Java17 이상을 요구함에 따라 Java11을 뒤로하고 Java17을 선택하여 사용하게 되었죠. Record는 Java14부터 처음 포함되어 새롭게 추가된 내용인데, 무엇에 쓰는 물건인고하니 기존의 코드를 간결하게 만들어줄만한 부분이 있는 유용한 점이 있다고 여겨지더라구요. 함께 Record에 대해 정리해봅시다.
Record란?
먼저 Java 공식문서에서의 서술은 다음과 같습니다.
출처: https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Record.html
Record (Java SE 17 & JDK 17)
Direct Known Subclasses: UnixDomainPrincipal public abstract class Record extends Object This is the common base class of all Java language record classes. More information about records, including descriptions of the implicitly declared methods synthesize
docs.oracle.com
간단하게 말하자면, '불변의 데이터들을 간단하게 전달하는 데 쓰이는 클래스'라고 할 수 있겠습니다. carrier라는 단어가 눈에 띄는데요. DTO(Data Transfer Object)에 유용하게 쓰일 것 같은 냄새가 여기서부터 나죠.
Record의 특징
보다 구체적으로 Record가 가지고 있는 특징들에 대해 살펴보겠습니다.
1. 멤버변수를 private final 로 선언한다.
- 따라서 클래스 정의 시 따로 접근 제어자를 명시하지 않아요.
2. 모든 필드에 대한 getter를 자동생성한다.
- 단 자동생성되는 메서드 이름이 기대와 다를 수 있습니다..! 메서드명에 get이라는 키워드가 없이 그저 필드의 이름 그대로.
- getXX()가 아니라 XX()인 것.
3. 모든 필드를 인자로 갖는 생성자를 자동생성한다.
- 다른 유형의 생성자(기본 생성자 등)에 대해서는 개발자가 직접 정의해야 합니다.
4. equals(), hashcode(), toString()을 자동생성한다.
Record 사용법
Record에 대해 열심히 떠들었으니 이제 코드로 보겠습니다.
DTO를 만드는 데 사용해볼건데, DTO라는 게 뭐냐. Data Transfer Object 잖아요.
말그대로, 프로세스 간에 데이터를 전달하는 캐리어. 여기엔 어떠한 비즈니스 로직 없이 그저 데이터를 '담는' 역할이기에 불변성을 보장하는 것이 그 역할에 충실하는 것이겠죠.
먼저 기존의 일반 클래스로 만들어진 DTO를 보겠습니다.
@Getter와 생성자를 직접 작성해놓은 것을 볼 수 있습니다.
이제 Record 버전으로 바꿔보겠습니다.
다이어트가 좀 됐죠? 한결 간결해진 코드입니다.
우선 @Getter 어노테이션이 생략되었습니다. 소괄호 안에 필드들이 정의되었구요. 접근제어자도 생략되었습니다. 생성자 또한 생략되었습니다. 만약 메서드를 정의하고자 한다면 중괄호 내에 위치시키면 됩니다.
실제 프로젝트에서 사용해본 후기
진행 중인 프로젝트에서 DTO를 생성하는 데 모두 record를 사용해보았습니다.
기존의 클래스를 사용했을 때는 @AllArgConstructor, @Getter 등의 어노테이션 등을 DTO마다 모두 중복적으로 선언해주었어야 했는데 이러한 보일러플레이트 코드를 줄일 수 있어서 좋았습니다. 또 이로써 필드와 같은 핵심적인 구성요소만 남으니 가독성에도 좋더라구요. 앞으로도 필요한 곳에 유용하게 활용할 것 같습니다.
'Java' 카테고리의 다른 글
[Java] 추상 클래스와 인터페이스 비교 (0) | 2023.08.02 |
---|---|
[Java] 생성자 라는 이름이 불러온 오해 (0) | 2023.07.19 |
[Java] 예외 발생 시 무한반복하기 (0) | 2023.01.08 |
Object 클래스 (1) | 2022.10.04 |