개발을 하다보니 자꾸 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


oksusutea's blog

꾸준히 기록하려고 만든 블로그