최근 DTO를 record 타입으로 사용하면 좋다고 어디선가 듣고 사용중인데 편해서 잘 쓰고 있다. 그래서 DTO를 record 타입으로 설정하면 좋은 이유에 짤막하게 소개해보려 한다.
record 타입은 자바 14 버전에 처음 소개된 클래스 타입으로, 16버전에서 정식 스텍이 됐다. 자바 17을 쓴다면 사용할 수 있다. (8 버전이라면… 고멘)
기본적으로 필드값이 바뀌지 않는 불변 객체이며, 메서드나 생성자를 자동으로 만들어줘서 간결하고 효율적인 데이터 객체를 만들 수 있다.
즉, 계층간 데이터 교환을 위해 사용하는 객체인 DTO(Data Transfer Object)를 만드는데 특화되어있는 클래스 타입이다.
public record MemberRequest(
String nickname,
String password,
String githubUrl,
JobRole favoriteJob) {
}
record 레코드명(컴포넌트1, 컴포넌트2, ...) { }
record는 변수 선언을 위 예시와 같이 생성자 매개변수 나열하듯 써주면 된다. 이렇게 헤더에 나열되는 필드를 컴포넌트라고 부르며, 반대로 레코드 내부에는 멤버 변수를 선언할 수 없다.
@Builder
public record QuestionDto(
Long id,
String content,
String standardAnswer,
Long answerCount,
Long challengeCount,
Double answerAverage
) {
public static QuestionDto from(Question question) {
return QuestionDto.builder()
.id(question.getId())
.content(question.getContent())
.standardAnswer(question.getStandardAnswer())
.answerCount(question.getAnswerCount())
.answerAverage(question.getAnswerAverage())
.challengeCount(question.getChallengeCount())
.build();
}
}
아래 세 가지 경우라면 DTO를 생성할 때 record로 생성하는 것을 추천한다!!
1. 간결하고 불변성을 가진 데이터 전달 객체가 필요한 경우
2. 읽기 전용 데이터 전송이 필요한 경우
3. 최신 Java 애플리케이션(Java 16 이상)에서