Entity는 데이터베이스의 테이블과 매핑되는 클래스로, JPA를 사용해서 데이터베이스와 객체간의 매핑을 관리한다.
Entity 관련 어노테이션으로 해당 클래스가 JPA의 Entity임을 명시할 수 있고, 테이블이나 컬럼명을 지정하는 @Table, @Column, 그리고 식별자를 지정하기 위한 @Id, 식별자 자동 생성을 위한 @generatedValue 등 여러 어노테이션이 존재한다.
DTO는 Data Transfer Object로 데이터 전달을 목적으로 하는 객체이다.
일반적으로 서비스 계층과 클라이언트 간의 데이터 전송에 사용되고, 로직을 가지지 않은 순수한 데이터 객체를 나타낸다. DTO에는 @Data나 @Getter, @Setter와 같은 어노테이션을 주로 사용하고, 구현방식에 따라 가변객체, 혹은 불변객체로 활용할 수 있다.
DAO는 Data Access Object로 데이터베이스의 CRUD 작업을 처리하는 객체이다. 데이터베이스와의 상호작용을 담당하며, 비즈니스 로직과 데이터 액세스를 분리하는 역할을 한다.
@Repository 어노테이션으로 해당 클래스가 데이터베이스와의 상호작용을 담당하는 컴포넌트임을 나타낼 수 있다.
VO는 Value Object, 값 객체라는 뜻으로, 변경 불가능한 객체를 의미한다.
DTO와 유사하지만, DTO는 setter 메서드로 값 변경이 가능하다. VO는 getter 메서드를 포함해서 비즈니스 로직도 포함이 가능하고, setter 메서드는 가지지 않아서 오로지 읽기만 가능하다.
또한, VO는 두 객체의 모든 필드 값이 동일하면 두 객체는 같은 것으로 인식하고, 그렇기 때문에 equals와 hashCode를 오버라이딩하는 것이 좋다.
VO는 lombok의 @Value 어노테이션을 사용할 수 있는데, 이 어노테이션을 사용하면 모든 필드가 private final으로 선언되어 클래스가 자동으로 불변속성을 가지게 되고, 모든 필드를 인자로 받는 생성자가 자동 생성된다. 그리고 equals, hashCode, toString 메서드 또한 자동 생성된다.
Java 14버전부터는 record라는 불변 데이터 클래스를 지원하기 때문에 VO를 보다 간단하게 만들 수 있다. record는 선언만으로도 equals, hashCode, toString 메서드가 자동 생성된다.
🌟 추가 질문
📍 요청을 처리하는 과정 중 DTO를 Entity로 변환하거나, Entity를 DTO로 변환하는 로직은 어디에 존재하며, 어느 시점에 해주어야 할까?
처음에는 각각 DTO에선 Entity를 DTO로 변환해주는 toDTO를 만들고, Entity에서는 DTO를 Entity로 만들어주는 toEntity를 만들면 어떨까 생각했다.
이 방법이 틀린 것은 아니지만, 단점이 존재한다.
우선, 서로 의존관계가 생겨버린다는 것이다. 즉, 결합도가 높아진다는 단점이 있다. Entity에서는 DTO를 import 해올 것이고, DTO에서는 Entity를 import 해온다. 이렇게 되면 추후에 Entity가 변하면 DTO도 변해야 하고 DTO가 변하면 Entity도 변해야 한다.
그래서 보통 외부에 Mapper 클래스나 Converter 클래스를 만들어 어뎁터처럼 중간에서 서로 변형을 시켜주는 클래스를 사용하기도 한다.
그렇다면 변형을 시켜주는 시점은 언제가 좋을까?
DAO는 데이터 베이스와 상호작용을 하면서, 비즈니스 로직과 데이터 액세스 부분을 분리해주는 역할을 한다. 그런데 만약 Service 단에서 DTO를 Entity로 변형 후 DAO에게 전달을 한다면, 추후 데이터베이스 액세스 로직을 변경하면 Service 부분도 수정을 해야 할 것이다.
즉, Servie는 DTO를 전달하고 데이터베이스와 관련된 작업은 어떤 방식으로 수행을 하던 몰라야 하는게 맞다.
DAO에게 DTO를 그대로 전달하고 받을 때도 DTO를 받아야 추후 Entity를 사용하지 않는 로직으로 변경이 되더라도 Service를 수정할 일이 없어진다.
또한 DTO 자체가 데이터 전송을 목적으로 하는 클래스이기 때문에 모든 서비스에서 옮겨갈 때마다 최대한 DTO를 사용하는 것이 맞다.
참고 자료
[JAVA] - DAO, DTO, VO, Entity 간단하고 쉽게 이해하기
VO와 DTO 그리고 VO로 쓰기 딱 좋은 record