June
10th,
2021
개발을 하다보니 자꾸 DAO, DTO, 그리고 entity의 경계선이 모호해서 포스트를 작성하며 정리해보기로 하였다.
VO
- DB View에 해당되는 개념이 아니다.
- 도메인의 특정 개념을 나타내기 위해서 사용한다. 설계에 따라 특정 테이블을 담고 있기도 한다.
- 자바에서 정의해서 사용하는 이유 :
- 특정 개념을 나타내기 위해서 사용한다. 예를 들어 상품 entity 안에 판매가, 할인률, 할인가격 등등 price와 관련된 필드들이 있고 그 안에 고유한 개념이 담겨져 있다면 그것을 Price VO로 분리하여 좀 더 명확하게 도메인에 대한 개념을 표현하고, 다른 코드에서도 Price라는 개념을 통해 객체를 캡슐화하여 사용할 수 있다.
DAO란?
- Data Access Object이다. 데이터에 접근하고 다루는 것을 담당하는 객체이다.
- 직접 DB에 쿼리를 보내고, entity, vo, dto를 얻어오는 영역이라고 볼 수 있다.
- MyBatis에서는 커넥션 풀을 제공하기 때문에 DAO를 별도로 만드는 경우는 드물다.
- mapper를 DAO로 사용한다.
- SQL을 사용하여 DB에 접근한 후 적절한 CRUD API를 제공한다.
- JPA 대부분은 기본적인 CRUD를 제공한다.
public interface UserRepository extends CrudReposity<User, Long> {
}
public interface MemberDAO {
public String getTime();
public void insertMember(MemberVO vo);
public MemberVO selectMember(String userid);
}
DTO란 ?
- 계층간(MVC) 데이터 교환을 위한 자바 빈즈를 의미한다.
- 로직을 가지지 않는 데이터 객체이며, getter/setter만 가진 클래스이다.
- 즉, DB의 데이터를 service 혹은 controller등으로 보낼 때 사용하는 객체를 말한다.
- 데이터의 전송과 계층의 분리를 위해 사용한다.
- toEntity() 메소드를 통해 DTO에서 필요한 부분을 이용해 Entity로 만든다.
DTO와 VO의 차이 ?
- DTO는 가변적인 성격을 가지고 데이터의 전송과 계층의 분리를 위해 사용된다.
- VO는 특정 엔티티의 의미를 담기 위해 사용되며 Read-Only이다.
Entity
- 보통 DB 테이블과 같다고 생각하면 될 것 같다.
- DB Layer와 밀접하기에 Setter 접근을 금지하고 기본 생성자 사용을 제한해 일관성을 유지해야 한다.
전체 구조
클라이언트 <- dto -> Controller <- dto -> Service <- dto -> repository <- entity -> db