-
DAO
- Data Access Object의 약자
- DB의 data에 접근하기 위한 객체로 실제로 DB에 접근하는 객체
- 데이터에 접근하도록 DB접근 관련 로직을 모아둔 객체
- 프로젝트의 서비스 모델과 실제 DB를 연결하는 역할
DAO와 Repository
- DAO와 Repository 모두 퍼시스턴스 로직에 대한 객체지향적인 인터페이스를 제공
- 도메인 로직과 퍼시스턴스 로직을 분리하여 관심의 분리 원칙을 만족시키는 데에 목적이 있음
- DAO의 인터페이스는 DB의 CRUD 쿼리와 1대1 매칭되는 세밀한 단위의 을 제공함
- Repository의 인터페이스는 메모리에 로드된 객체 컬렉션에 대한 집합 처리를 위한 오퍼레이션을 제공함
- DAO가 제공하는 오퍼레이션은 Repository가 제공하는 오퍼레이션보다 세밀함
- Repository애서 제공하는 하나의 오퍼레이션은 DAO의 여러 오퍼레이션에 매핑되는 것이 일반적
DTO
- Data Transfer Object의 약자
- Client와 DB 사이의 여러 계층 간 데이터를 교환 하기 위해 사용하는 객체
- 로직을 가지지 않는 순수한 데이터 객체
- 주로 비동기 처리를 할 때 사용
- 속성과 그 속성에 접근하기 위한 getter, setter 메소드만 가진 클래스
- 추가적으로 toString(), equals()등의 메소드를 작성 할 수 있음
- Controller와 같은 client단과 직접 마주하는 계층에 Entity를 직접 전달하는 대신 DTO를 사용해 데이터를 교환
유저가 입력한 데이터를 DB에 넣는 과정
- 유저가 자신의 브라우저에서 데이터를 입력하여 form에 있는 데이터를 DTO에 넣어서 전송
- 해당 DTO를 받은 서버가 DAO를 이용해 DB로 데이터를 집어넣음
Entity와 DTO
- 데이터의 변경이 많은 DTO 클래스를 분리해주어 DB로의 접근을 보호하기 위해
- Entity 값이 변하면 Repository 클래스의 Entity Manager의 flush가 호출될 때 DB에 값이 반영되고 이것이 다른 로직에 영향을 줌
- Entity의 필드를 모두 공개하지 않고 필요한 부분만 공개하기 위해서 DTO를 사용
- 응답, 요청시 객체의 형태가 바뀔 수 있기 때문에
- 컨트롤러에서 DTO를 통해 다음 계층에서 값에 대한 검증과정이 반복되지 않도록 함
VO
- Value Object의 약자
- 값 오브젝트로써 값을 위해 쓰임
- Read-Only 즉 읽기만 가능한 특징을 가짐
- 데이터 그 자체에 의미를 두고 있음
- 읽기만 가능하기 때문에 setter가 없어 값을 변경할 수 없음
DTO와 VO 차이점
- DTO는 가변의 성격을 가지고, VO는 불변의 성격을 가짐
- DTO는 데이터 전송을 위해 존재하고, VO는 값 그 자체의 의미를 가짐
- DTO는 Layer간의 통신 용도로 오고가는 객체라면, VO는 특정한 비즈니스 값을 담는 객체
- DTO는 인스턴스 개념이라면 VO는 리터럴 개념