DTO(Data Transfer Object)
- 계층(View, Controller, Service)간 데이터 교환을 위한 객체
- DTO는 로직을 가지지 않고, Getter 및 Setter 메소드만 가진다.
- 주로 요청이나 응답 값을 전달하기 위해 사용
VO(Value Object)
- VO는 값 자체를 표현하기 위한 객체
- 객체의 불변성(Read-Only)를 보장하며, Getter 기능만 존재한다.
- 안에 로직을 포함할 수 있다.
- 이름이 다른 VO 인스턴스라도, 내부에 모든 속성 값이 같다면 두 인스턴스는 동일 객체
- 그러므로 Object클래스의 equals()와 hasCode() 메소드를 오버라이딩해서 사용하는 것이 핵심
- 여러 테이블에 대한 공통 속성을 모아서 만든 BaseVo 클래스를 상속받아 사용할 수도 있음
DAO(Data Access Object)
- 데이터베이스의 데이터를 접근하기 위한 객체로, DB에 접근하여 데이터를 삽입, 삭제, 조회 등의 조작을 할 수 있다.
- 비지니스 로직과 데이터 접근 로직을 분리하기 위해 사용
- JPA에서의 Repository와 동일한 역할
Entity
- 실제 데이터베이스 테이블과 1:1로 매핑되는 객체로, DB에 존재하는 테이블 컬럼만을 속성(필드)로 가진다.
- Entity 클래스는 상속을 받거나 구현체여서는 안되며, 테이블에 존재하지 않는 컬럼을 속성으로 가져서도 안됨
- Entity와 DTO를 분리하는 주요 이유는 DB Layer와 View Layer 사이의 역할을 분리하기 위함이다.
- Entity는 실제 테이블과 매핑되기 때문에 만일 View Layer에서 변경되면 다른 로직에도 영향을 끼칠 수 있음
<참고 URL>
https://velog.io/@maketheworldwise/DAO-DTO-VO-ENTITY