Java record 활용한 DTO 만들기

o_z·2024년 2월 3일
post-thumbnail

현재 팀 프로젝트에서 일정 관련 서비스를 구축하고 있다. 일정 CRUD를 구현하고 있는거라고 보면 되는데, 일정 생성으로 들어오는 request에 대해 DTO를 만들어야 한다.

record의 존재를 몰랐어서 처음엔 class를 사용해서 DTO를 생성했다. 그러다 백엔드 팀원한테서 java 14부터 도입된 record 를 써보라는 추천을 받았다.


record ?

record가 나오기 이전에는 데이터 저장/조회를 위한 클래스를 만들려면 필드와 메서드를 모두 포함시키는 클래스를 만들어야 했다.
record는 이러한 반복적인 데이터 클래스를 대체할 수 있도록 나온 불변 데이터 클래스이다. class 대신 더 간결한 구조를 갖기 위해 사용되는데, record라고 쓰고 필드 유형, 이름만 넣으면 된다.

record로 선언했을 때 기본적으로 생성되는 메서드들은 아래와 같다.

  1. constructor (모든 필드를 사용한 생성자)
  2. getter
  3. equals()
  4. hashCode()
  5. toString()

class로 DTO 구현하기

record를 도입하기 전 일정 생성 request DTO는 아래처럼 클래스로 만들었었다.

@Getter
public class CreateScheduleRequestDTO {

	@NotNull(message = "일정 제목은 필수 입력 값입니다.")
	private String title;
	@NotNull(message = "일정 국가는 필수 입력 값입니다.")
	private Country country;
	@NotNull(message = "일정 지역은 필수 입력 값입니다.")
	private City city;
	@NotNull(message = "시작 날짜는 필수 입력 값입니다.")
	private LocalDate startDate;
	@NotNull(message = "끝 날짜는 필수 입력 값입니다.")
	private LocalDate endDate;
	String memo;
   
	public CreateScheduleRequestDTO(String title, Country country, City city, LocalDate startDate, LocalDate endDate,
		String memo) {
		this.title = title;
		this.country = country;
		this.city = city;
		this.startDate = startDate;
		this.endDate = endDate;
		this.memo = memo;
	}
}

이번 DTO의 경우 모든 인자를 생성자에 넣어야 하므로 @AllArgsConstructor로 대체할 순 있긴 한데 너무 길다.


record로 DTO 구현하기

아래가 record를 사용한 후 DTO의 모습이다.

public record CreateScheduleRequestDTO(
									   @NotNull(message = "일정 제목은 필수 입력 값입니다.") String title,
									   @NotNull(message = "일정 국가는 필수 입력 값입니다.") Country country,
									   @NotNull(message = "일정 지역은 필수 입력 값입니다.") City city,
									   @NotNull(message = "시작 날짜는 필수 입력 값입니다.") LocalDate startDate,
									   @NotNull(message = "끝 날짜는 필수 입력 값입니다.") LocalDate endDate,
									   String memo){}

벌써 엄청 간단해졌다. getter, builder 등 애노테이션을 따로 쓸 필요도 없고 원하는 필드 추가해서 쓰면 끝! 안에 자신이 필요한 메서드는 추가해서 쓰면 되고 기존 DTO 생성에서 필요했던 기본적인 메서드들은 직접 생성할 게 없어서 너무 편하다.

profile
트러블슈팅과 구현기를 위주로 기록합니다-

0개의 댓글