1. DAO(Data Access Object)란?
DB에 직접적으로 접근하기 위한 객체이다.
Service와 DB를 연결하는 연결 고리 역할을 한다.
DB에 접근하기 위한 로직을 분리하기 위해 사용한다.
DB에 접근하여 CRUD 기능을 수행한다.
2. DTO(Data Transfer Object)
DTO는 계층(Controller, View, Business Layer) 간의 데이터 전달을 위한 객체이다.
비즈니스 로직을 갖고 있지 않으며, getter/setter
메서드만을 갖는다.
toEntity()
메서드를 통해서 DTO에 필요한 부분을 이용하여 Entity로 만든다.
또한 Controller Layer에서 Response DTO 형태로 Client에 전달할 때 활용성이 제일 높다.
@Getter
@Setter
public class SignUpDTO {
private String userId;
private String userPassword;
private String userName;
private String userEmail;
}
3. VO(Value Object)
값 그 자체를 나타내는 객체이다.
DTO와 동일한 개념으로 같지만, Read-Only(불변성) 속성을 갖는다.
보통 VO는 특정한 비즈니스 값을 담는 객체이고 비즈니스 로직도 포함 가능하다. 모든 레이어에서 사용 가능하다.
VO는 Getter
와 Setter
를 모두 가질 수 있으나, equals()
와 hashCode()
를 오버라이딩하여 자주 사용한다. 따라서 value가 같으면 같은 객체라고 본다.
4. Entity Class
흔히 아키텍처를 설명할 때 Domain 클래스로 불리기도 한다.
Spring 3 Tier인 Persistence
, Business
, Presentation
Tier 중 Persistence Tier
에서 사용된다.
실제 DB 테이블과 1:1로 매핑(Mapping)되는 핵심 클래스(Class)로, DB 테이블에 존재하는 칼럼(Column)들을 필드(Field)로 가지는 객체다.
Entity는 데이터베이스 영속성(Persistent)의 목적으로 사용되는 객체이며, 때문에 요청이나 응답으로 바로 값을 전달하는 클래스로 사용하는 것은 좋지 않다. 이러한 경우에는 DTO를 사용하여 값을 전달하는 게 맞다. 느낀 바로는 Entity 클래스와 DTO 클래스를 분류하여 설계하였을 때 유지보수면에서 확실히 자유로워질 수 있다.(많은 서비스 클래스와 비즈니스 로직들이 Entity 클래스를 기준으로 동작하기 때문에 Entity 클래스가 변경되면 좋지 않다는 말과 일맥상통하다.)
Entity 클래스에서는 Setter 메서드 사용을 지양해야 한다. Setter로 접근하여 변경되는 순간 객체의 일관성, 안정성을 보장하기 힘들어지기 때문이다. 따라서 Setter 대신 Constructor(생성자)나 Builder Pattern을 사용해야 한다.
Link
https://choitaetae.tistory.com/97,
http://melonicedlatte.com/2021/07/24/231500.html,
https://gmlwjd9405.github.io/2018/12/25/difference-dao-dto-entity.html,
https://wildeveloperetrain.tistory.com/101,
https://velog.io/@gillog/Entity-DTO-VO-%EB%B0%94%EB%A1%9C-%EC%95%8C%EA%B8%B0,
https://velog.io/@ha0kim/DAO-DTO-VO-%EC%B0%A8%EC%9D%B4,