DAO, DTO 정리

2021. 7. 18. 15:36·Web/정리글

DAO

DAO : Data Access Object의 약어로 DB에 접근하여 조회, 조작을 담당하는 것들을 통칭한다.

  • DAO를 이용해서 Service와 DB를 이어주는 중간다리 역활을 한다.
  • Persistence Layer이다. (DB에 직접 CRUD를 하는 계층)

왜 DAO로 구분하는 것일까?

HTTP Request를 Web App이 받게 되면 매 Req마다 WAS에 전달이되면 매칭되는 Servelt이 메모리에 적재되고, servlet내 Service() 메소드가 호출되어 Thread Pool에 있는 쓰레드를 할당받아서 처리된다.
|
이때, 비즈니스 로직이 DB로부터 데이터를 얻어오기 위해 매번 Driver를 로드하고 Connection 객체를 생성하게 되면 엄청 많은 커넥션이 일어나므로 DB에 전담하는 DAO를 따로 빼서 전담 객체로 만들어 두는 것이다. 이렇게 함으로서 부담을 줄일 수 있다.

  • Java의 DB연결을 위한 JDBC 드라이버 로딩 참고 : [https://allg.tistory.com/20]

예시

유저 객체에 관련해서 DB를 관리하는 DAO

유저 DAO 인터페이스
public interface MemberDao {

    /*
    유저 저장
     */
    void save(Member member);

    /*
    유저 고유 아이디로 검색 후 반환
     */
    Member findOne(Long id);

    /*
    모든 유저 반환
     */
    List<Member> findAll();

    /*
    이름으로 유저 검색 후 반환
     */
    List<Member> findByName(String name);

    /*
    이메일로 유저 검색 후 반환
     */
    List<Member> findByEmail(@Email String email);
}

유저 DAO 인터페이스 구현 클래스

@Repository("MemberDao")
@RequiredArgsConstructor
public class MemberDaoImpl implements MemberDao {

    private final EntityManager em;

    public void save(Member member) {
        em.persist(member);
    }

    public Member findOne(Long id) {
        return em.find(Member.class, id);
    }

    public List<Member> findAll() {
        return em.createQuery("select m from Member m", Member.class)
                .getResultList();
    }

    public List<Member> findByName(String name) {
        return em.createQuery("select m from Member m where m.name = :name", Member.class)
                .setParameter("name", name)
                .getResultList();
    }

    public List<Member> findByEmail(@Email String email) {
        return em.createQuery("select m from Member m where m.email = :email", Member.class)
                .setParameter("email", email)
                .getResultList();
    }
}

DTO

DTO : Data Transfer Object의 약자로 VO(Value Obejct)라고도 한다. 계층간 데이터 교환을 위한 자바 빈즈(java beans)이다.

  • 데이터베이스 레코드의 데이터를 매핑하기 위한 데이터 객체이다.
  • 보통 DTO는 비지니스 로직을 갖지 않고 Getter, Setter만을 갖는다.
  • DB에서 data를 얻어서 Service나 Controller로 보낼 때 사용하는 객체이다.
  • 계층간 데이터를 주고받을 포맷을 정하는 것이다.
    • DB 레코드란? (파란색)
      : DB 테이블에서 Row를 가리키는 것으로 하나의 Entity를 지칭한다. 일반적으로 복수의 속성값을 갖고 있다.
    • DB 필드란? (빨간색)
      : DB 테이블에서 Column을 가리키는 것으로 Entity의 Attribute(속성)값을 말한다

DTO를 구현하기 위해서는 Entity를 DTO로 변환하고, DTO를 Entity로 변환해서 사용해야하는데 이를 위해서 mapStruct를 사용하면 좋다. 기존의 model mapper가 존재하지만 추세가 map struct의 사용이 증가하는 추세이고, 속도도 더욱 빠르다.

  • 참고 : [https://meetup.toast.com/posts/213]

DTO를 왜 사용하는 것일까?

목적 : "VIEW 와 Model 영역에서의 데이타전달객체는 반드시 분리한다" 이 것을 지키기 위한 개념이다.
이를 위해 DAO와 DTO라는 개념이 나온 이유일 것이다. DAO는 영속성 영역에서의 Model의 Entity클래스를 의미하고, DTO는 View와 Controller간의 영역에서 사용되는 객체라고 보면 된다.

view에서 표현하는 속성값들은 요청에 따라 계속 달라질 수 있는데, 이에 맞춰 entity의 속성값이 변하면 영속성 모델을 포현한 Entity 클래스의 순수성이 모호해진다.

1) 학생 Entity에 [학번, 아이디, 이름, 이메일, 생일, 주소]가 존재한다고 해보자. 이때 학생을 조회하면 반환값으로 원하는 값이 [이름, 이메일] 이라면, 학생 Entity를 그대로 넘겨줄 경우 필요없는 정보도 같이 넘어 오게된다.

2) 학생 이메일을 변경하는 요청을 고려한다면, originEmail, afterEmail값을 받아야 할 것인데, 이를 Entity에 갖게하는 것은 동일 속성값(이메일)을 두개 갖게 되는 것이다. 따라서 Entity와 DTO로 구분하여 구현하도록 하는 것이다.

 

Entity와 DTO 사용 구분

반응형
저작자표시 (새창열림)

'Web > 정리글' 카테고리의 다른 글

JPA 정리  (0) 2021.08.04
Servlet 정리  (1) 2021.07.28
Spring MVC Architecture 정리  (1) 2021.07.27
Junit Test 환경  (1) 2021.07.12
Junit5 테스트  (0) 2021.07.12
'Web/정리글' 카테고리의 다른 글
  • Servlet 정리
  • Spring MVC Architecture 정리
  • Junit Test 환경
  • Junit5 테스트
구름뭉치
구름뭉치
구름의 개발일기장
    반응형
  • 구름뭉치
    구름 개발일기장
    구름뭉치
  • 전체
    오늘
    어제
    • ALL (284)
      • 프로젝트 (23)
        • 토스페이먼츠 PG 연동 시리즈 (12)
        • JWT 방식 인증&인가 시리즈 (6)
        • 스우미 웹 애플리케이션 프로젝트 (1)
        • 스프링부트 기본 보일러 플레이트 구축 시리즈 (2)
        • 마이크로서비스 아키텍쳐 시리즈 (1)
      • 스프링 (43)
        • 스프링부트 API 설계 정리 (8)
        • 스프링부트 RestAPI 프로젝트 (18)
        • 스프링부트 WebSocket 적용기 (3)
        • 스프링 JPA 정리 시리즈 (5)
        • 스프링 MVC (5)
        • 스프링 배치 (2)
        • 토비의 스프링 정리 (2)
      • 기술 학습 (29)
        • 아파치 카프카 (9)
        • 클린 코드 (4)
        • 디자인 패턴의 아름다움 (2)
        • 모던 자바 인 액션 (7)
        • JVM 스레드 딥다이브 (7)
      • Web (25)
        • 정리글 (20)
        • GraphQL 정리글 (2)
        • Jenkins 정리글 (3)
      • 취업 (6)
      • CS (77)
        • 네트워크 전공 수업 정리 (11)
        • OSI 7계층 정리 (12)
        • 운영체제 정리 (19)
        • 데이터베이스 정리 (5)
        • MySql 정리 (17)
        • GoF의 Design Pattern 정리 (12)
      • 알고리즘 (70)
        • 백준 (56)
        • 프로그래머스 (12)
        • 알고리즘 정리본 (1)
      • 기초 지식 정리 (2)
      • 일상 (8)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    부다페스트
    키보드 손목 받침대
    레이저
    동유럽
    크로아티아
    mx master s3 for mac
    마우스
    류블라냐
    마우스 패드
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
구름뭉치
DAO, DTO 정리
상단으로

티스토리툴바