DTO를 구현하기 위해서는 getter, setter, equals, hashCode, toString 같은 데이터 처리 혹은 특정 연산을 수행하기 위해 오버라이드된 메소드를 반복해서 작성하게 된다.
📌 Record는 Entity가 아닌 DTO로 사용하자
record는 엔티티가 될 수 없는 이유는 다음과 같다.
hibernate와 같은 jpa는 프록시 생성을 위해 인수 생성자, non-final 필드, setter 및 non-final 클래스가 없는 엔티티에 의존한다. 즉, 프록시를 생성하기 위해서 entity는 불변이면 안된다.
(jpa의 프록시는 일대일 매핑 시 지연 로딩 제공 등 다양하게 쓰인다.)
쿼리 결과를 매핑할 때 객체를 인스턴스화 할 수 있도록 매개변수가 없는 생성자가 필요하다.
→ record는 매개변수가 없는 생성자를 제공하지 않는다. (record는 불변 객체이기 때문에 setter를 사용할 수 없다. 이로 인해 모든 필드의 값을 입력한 후에 생성할 수 있다)
접근자 메소드인 getter가 필수 명명 규칙을 따르지 않는다. record의 getter는 필드명을 그대로 사용하고 있다.(name(), pilot() …)
→ 쿼리 결과 처리 후 수행할 getter, setter에 접근할 수 없다.
위의 이유로 record는 엔티티가 되기 위한 조건을 만족하지 않는다. 결국 entity는 표준 java 클래스로 구현해야 해당 기준을 쉽게 충족할 수 있습니다.