DAO, DTO, Entity의 차이

유수민·2022년 7월 11일
0

FoodMall 프로젝트

목록 보기
9/14

출처)https://yeonyeon.tistory.com/163

📌DAO(Data Access Object)

실제로 DB에 접근하는 객체이다. 즉, 데이터베이스에서 데이터를 취득하고 Controller에서 사용하는 데이터로 변환해 주는 작업을 해준다. 또한, Service와 DB를 연결하는 고리의 역활을 한다. 단순히 springMVC를 사용할 때는 DAO를 데이터베이스를 연결하는 객체로 생각하여 여기에 SQL문을 다 넣었었는데, JPA를 사용하게 되면, DB에 데이터를 CRUD 하는 Repository 객체들이 DAO라고 볼 수 있다. 따라서, 현재 이 프로젝트에서는 JPA를 사용하고 있기 때문에, DAO가 아닌 Repository만 존재하는 것이다.

사실 DAO와 Repository의 차이에 대한 논란이 많다. 나도 이 개념에 대해서 찾아보았으나 아직 배경지식이 모자른지 이해가 되지 않았다. 일단, 차이점에 관한 포스팅 게시물을 남겨놓도록 하겠다.

Repository와 DAO 차이?

Repository와 Dao의 차이점.

📖DAO의 필요성

DAO를 왜 쓰는가? DB에 접근하려고? 그냥 접근하면 되지 왜 굳이 DAO를 통해 접근하지?

일반적으로, 웹서버는 DB와 연결하기 위해서 매번 connection 객체를 생성한다. (즉, 웹페이지에서 DB에 있는 자료를 가져올때는 connection 객체를 통해서 가져온다.) 매번 생성하는 것이 비효율적이라는 점을 해결하기 위해, connection객체를 미리 만들어 놓고 필요할때 가져다 쓰고 다 쓰면 반환하는 ConnectionPool이라는 것을 만들었다. 객체를 미리 만들었다가 지울 필요가 없으니 DB를 요청할때마다 connection 객체를 생성하지 않아도 되어 매우 효율적이게 되었다.

그런데,

유저 한명은 웹에 접속해서 한 connection만 이용하고 종료하는 것이 아니고, 여러 행동을 해서 행동하는 모든 것에서 connection이 발생한다. 그렇다보니 컨넥션을 계속 만들게 되는데, ConnectionPool이 결국에는 기존의 있던 connection말고도 또 만들게 되어 오버헤드를 일으키는 것이다. 따라서 이것에 대한 해결책으로 DAO를 만들게 된다. DB에 접속하기 위한 전용 connection을 하나만 만들어서 DB에 접속하는 객체를 제한하고, 모든 페이지에서 그 객체만 호출해서 사용하도록 한것이다. 즉, DB에 대한 접근을 오로지 DAO만 담당하도록 하여 다수의 원격호출을 줄이고, DB의 과부하를 방지하는 것이다.

참고) https://nokmallist.tistory.com/44

📌Entity

Entity Class를 사용하여 그 클래스를 테이블과 1:1 매칭할 수 있다. Entity Class를 Domain이라고 하며, DB와 가장 가까운 클래스이다. 이처럼 DB와 매핑되어 있는 핵심 클래스이기 때문에 요청이나 응답값을 전달하는 클래스로 쓰면 안된다. 만약 요청이나 응답값을 전달하는 클래스로 Entity클래스를 사용한다면, 뷰가 변경될때마다 Entity클래스를 그에 맞춰서 매번 변경해야 한다. 수많은 서비스 클래스나 비즈니스 로직이 Entity클래스 기준으로 동작하는 상황에서 Entity클래스를 변경하면, 이와 얽혀있는 무수히 많은 클래스에 영향을 끼치게 된다. 따라서, 요청이나 응답하는 클래스로 뷰의 변경에 따라 다른 클래스에 영향을 끼치지 않고 자유롭게 변경가능한 DTO클래스가 등장하게 된것이다.
→ DTO의 필요성

참고) 우아한 테크코스 - 10분 테크톡: 인비의 DTO vs VO

📌DTO(Data Transfer Object)

데이터 전송객체이다. 따라서 계층간 데이터 교환이 이루어 질 수 있도록 한다. 즉, DB에서 데이터를 얻어 Service나 Controller에게 전달하는 객체이다.

클라이언트로 부터 요청을 받아 데이터를 처리하고 반환 해주기 위해선 데이터에 접근해야 한다.여기서 Controller(Presentation Layer)의 경우 클라이언트와 직접 맞닿는 부분임에 반하여 DB에서 데이터를 꺼내는 Entity는 Presentation Layer과는 분리되어 있어야 한다. 이 문제 있어서는 DTO가 데이터를 전달해줌으로써 해결해준다.

profile
배우는 것이 즐겁다!

0개의 댓글