실무에선 DTO객체를 POJO 클래스로 사용했지만, 그 때마다 생각했던 반복되는 코드에서 오는 피로감을 줄이고 싶다는 생각을 했다. 하지만 팀내의 관성이 있었고 또한, JAVA 11을 사용했기에 Record 클래스를 사용하기는 무리가 있었다.
하지만 개인 사이드 프로젝트에선 이런 제약없이 반복되는 코드의 피로감을 줄이기 위해 DTO는 Record클래스를 사용했다.
DTO란 Data Transfer Object
의 약자로 데이터를 요청, 반환 할 때 사용하는 JAVA 객체다. DTO객체는 보통 데이터를 담고, 조회하기 위한 용도로 getter, setter, 생성자를 추가해서 사용한다.
@Getter
@AllArgsConstructor
@NoArgsConstructor
@ToString
@EqualsAndHashCode
public class XxxDto {
...
}
Lombok을 사용한다면 보통 위와 비슷한 형태로 사용할 텐데 DTO가 많아 진다면 위와 같이 어노테이션 어러게를 사용한 것도 반복되는 코드가 되고 무엇보다 귀찮다고 생각했다. 때문에 이러한 반복된 코드를 줄이는 방법으로 Record 클래스를 사용하기로 결정 했다.
@Data 어노테이션를 사용할 수도 있지만 이 방법은 지양하도록 하자.
Record 클래스는 자바17부터 정식 제공되는 특수한 class다. Record 클래스는 특수한 class 답게 생성자, getter, hashCode(), equals() ,toString()를 기본적으로 제공해준다. 필요한 메서드가 있다면 추가해서 사용하면 된다.
하지만 잘 보면 setter클래스는 제공해주지 않는데 Record 클래스는 기본적으로 불변객체
를 지향하기 때문에 객체를 생성할 땐 생성자를 통해 만들고 값이 변한다면 새로운 객체로 바꿔서 사용해야한다.
setter는 기본적으로 안티패턴으로 지양해야하는 것 중 하나다.
Record 클래스를 사용한다면 필드 값을 수정할 수 없다는 단점이 있지만 반복되는 코드량의 감소, 코드의 명확성, 불변성 같은 장점들이 DTO객체로 사용할 때 더욱 큰 장점으로 작용한다고 생각하였다.
// 기존 POJO 방식의 DTO
@Getter
@AllArgsConstructor
@NoArgsConstructor
@ToString
@EqualsAndHashCode
public class XxxDto {
private Long id;
private String name;
private String age;
...
public void custom(){
...
...
...
};
}
// Record 클래스를 사용한 DTO
public record XxxDto(Long id, String name, String age, ...) {
public void custom(){
...
...
...
};
}
Lombock을 사용했어도 Record 클래스의 간결함을 따라갈 순 없다.