스프링 부트로 API 서버를 개발하다보면 자연스럽게 사용하게 되는 DTO(Data Transfer Object).
일반적으로 나는 Class를 이용해 개발했었는데 Java 14 부터 등장한 Record라는 타입이 있어 어떤 특징이 있는지 학습 해보려고 한다.
: 말 그대로 데이터 전송에 사용하는 객체를 뜻하며,
프레젠테이션 계층(Controller) <-> 비즈니스 계층(Service) <-> 데이터 엑세스 계층(Repository)
위 처럼 각 계층간 데이터를 주고 받을때 데이터를 규격화하고 유효성을 검증하는 용도로 사용된다.
: 그럼 DTO를 만들때 각 타입별로 무슨 차이점이 있는지 알아보자
public class UserDTO {
@NotNull
private String name;
@Email
private String email;
@Min(18)
private int age;
// Getter 및 Setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public record UserDTO(
@NotNull String name,
@Email String email,
@Min(18) int age
) {
// 필요한 경우, 생성자에 추가적인 검증 로직을 삽입할 수 있습니다.
public UserDTO {
if (age < 18) {
throw new IllegalArgumentException("Age must be at least 18.");
}
}
}
: Record 타입의 DTO가 자주 쓰는 함수를 알아서 생성해주기 때문에 코드가 확실히 짧아져 작성하기 쉽고 편하다. 하지만 무조건 필드를 불변(final)로 처리하기 때문에 데이터가 변경되는 로직에서는 사용하기 힘들다.
DTO를 만들때 사용할수 있는게 하나 늘었다.
DTO를 이용할때 데이터를 변경할 일이 없다면 되도록이면 Record를 사용해보도록 해봐야겠다.
추후에 사용하면서 느낀점을 다시 다뤄보겠다.