쏭의 개발 블로그
DAO, DTO, VO, Domain 차이 본문
1. DAO : Data Access Object (= Repository)
DB의 데이터에 접근하기 위한 객체로 DB에 접근하기 위한 로직과 비즈니스 로직을 분리
- repository 패키지
- 실제로 DB에 접근하여 데이터를 CRUD하는 객체로 Service와 DB를 연결해주는 역할
- 인터페이스와 구현체를 만들어 CRUD 관련 기능을 구현하고 DI 해줌
- SQL을 사용하여 DB에 접근한 후 적절한 CRUD API를 제공
- MyBatis 등을 사용할 경우 커넥션 풀까지 제공되므로 별도로 만드는 경우는 적음
2. DTO : Data Transfer Object
계층 간 데이터 교환을 하기 위해 사용하는 객체로 로직을 가지지 않는 순수한 데이터 객체
- DTO 패키지
- getter, setter만 가짐
- DB에서 데이터를 받고 Service나 Controller로 넘겨줌
- DB의 데이터가 Presentation Logic Tier로 넘어올 때 DTO의 모습으로 바뀌어서 오고
- view와 통신하기 위한 클래스
- 자주 변경이 필요한 클래스로 Presentation Model
- Controller 계층에서 Response DTO형태로 Client에 전달
- 브라우저에서 입력한 데이터 Form → DTO → DAO → DB
3. VO : Value Object
값을 위해 쓰이며 read-only로 값 타입을 표현하기 위한 불변 클래스
- DTO와 비슷하지만 getter만을 사용(setter는 사용X)
4. Domain (= Entity)
실제 DB의 테이블과 매칭시키는 클래스
- Domain 패키지
- @Entity, @Column, @Id 등의 annotation 사용
- 최대한 외부에서 Entity 클래스의 getter method를 사용하지 않도록 해당 클래스 안에서 필요한 로직 메소드를 구현
- Domain Logic만 가지고 있어야하며 Presentation Logic을 가지고 있어서는 안됨
- Service 계층에서 사용됨
💜 Domain와 DTO를 분리하는 이유
(1) Domain은 DB계층, DTO는 View 계층을 위한 것
➡️ 역할을 철저히 분리하기 위해
(2) Domain은 테이블 매핑 클래스로 변경사항이 생기면 다른 클래스에 영향을 주므로 신중히 설계하지만 변경사항이 상대적으로 적은 클래스
(3) DTO는 request/response에 대한 부분 혹은 view 관련 Presentation 로직을 가지는 자주 변경되는 클래스
➡️ Domain과 DTO를 분리할 필요가 있음
https://woogienote.tistory.com/88
https://melonicedlatte.com/2021/07/24/231500.html
https://velog.io/@linger0310/DDD
https://jihoon2723.tistory.com/entry/VO-DAODTO-Entity-Domain-클래스-비교하기
'Back-end > Spring' 카테고리의 다른 글
WebFlux에 대해서 (0) | 2023.11.07 |
---|---|
@Controller와 @RestController 차이 (0) | 2023.10.07 |
Spring AOP (0) | 2023.10.07 |
[Spring] Spring이란? (0) | 2023.02.07 |