not bad 한 개발

[Spring] DAO , Repository에 대하여 본문

Web/Spring

[Spring] DAO , Repository에 대하여

leebean 2024. 10. 27. 18:07

프로젝트를 개발하면서 나는 DB Table CRUD처리를 주로 DAO보다 Repository를 선호하는데. 막상 두가지의 차이점을 말하라고하면 바로 고장날것이다. 예전에는 DAO와 Repository는 데이터를 저장하는 점에서보면 같고 명칭만 다를 뿐이라고 생각했다, 단순히 DB에 데이터를 저장한다는 관점에서 보면 맞는 말이지만 또 그렇지도 않았다, 이번에는 DAO와 Repository의 특징을 보고 두 개의 방식의 차이점을 비교해볼 생각이다.

일단 DAO와 Repository는 하나의 기능으로보기 보다는 패턴으로 보는 것이 바람직할 것이다. 

 DAO, Repository 패턴 등장배경 

두 패턴이 등장한 것은 간단히 말하면 영구 저장소 API 즉 DB의 문제에서 시작한다. 현재는 보편적으로 myBatis 혹은 JPA를 사용해 DB에 접근하지만 예전에는 DB에서 제공하는 API를 사용해서 DB에 접근을 했다. 하지만 이과정에서 문제가 생겼는데 아래의 문제가 생겼다.

  • 구현체와 로직의 강한 결합의 문제
    • 만약 MySQL과 같은 특정 벤더의 영구 저장소를 사용할 때 만약 Oracle로 변경해야한다면 MySQL을 사용하는 부분을 모두 변경해야하는 번거로움이 생긴다.
  • 계층간섭 문제
    • 레이어드 아키텍처가 깨지는 문제는 결합도가 높아지는 문제가 되는데 MySQL의 API를 서비스 로직에서 사용했을 경우, 서비스 로직과 DB와 관련된 API가 강한 결합을 가지게 되어 영속성과 관련된 로직이 서비스 로직에 영향을 미치는 문제가 발생한다. 즉, 서비스 계층과 인프라 계층(영속성 계층)간의 결합이 강해지는 문제가 생긴다는 것이다.
  • 개발자의 학습 영역 증가
    • 각 저장소 별로 구현방식이 모두 다르기 때문에 개발자의 학습영역이 증가한다.

이제 DAO와 Repository를 설명해야하는데 설명하기 앞서 DDD(Domain-Driven Design) 계층에 대해 설명하는 것이 좋을거 같다. 이걸 알기전까지 내가아는 DDD는 별의 커비 디디디 대왕 밖에 없었다.

DDD 계층 설명 이미지

계층 설명
Presentation (표현 계층) (Controller) 사용자 요청에 대해 해석하고 응답하는 일을 책임지는 계층이다. 
Application (응용 계층) (Serice) 비즈니스 로직을 정의하고 정상적으로 수행될 수 있도록 도메인 계층과 인프라스트럭쳐 계층을 연결해주는 역할을 하는 계층이다. 
Domain (도메인 계층) (Model) 비즈니스 규칙, 정보에 대한 실질적인 도메인에 대한 정보를 가지고 있으며 이 모든 것을 책임지는 계층이다.
Infra (인프라 계층) (Repository) 외부와의 통신(DB, 메시징 시스템 등)을 담당하는 계층이다.

 

 DAO (Data Access Object) 

  • DAO는 데이터베이스와 상호 작용하기 위한 데이터 액세스 계층을 나타내는 디자인 패턴이다.
  • DAO는 데이터베이스 연결, 쿼리 작성, 데이터 검색 및 업데이트와 같은 데이터 액세스 작업을 처리
  • 구현 방식 :  개발자가 데이터베이스 연결을 열고 닫는 등의 로우 레벨 작업을 수동으로 처리해야 한다.

 Repository 

  • Repository는 데이터베이스 액세스를 추상화하고 도메인 객체(Entity)를 저장하고 검색하는 데 사용
  • Repository는 도메인 모델을 지원하며, 객체 지향적인 방식으로 데이터 액세스를 수행
  • 구현 방식 :  Spring Data JPA와 같은 프레임워크를 사용하면 Repository 인터페이스를 정의하고 구현하지 않고 프레임워크가 자동으로 CRUD 메서드를 생성하고 도메인 객체(Entity)와 상호 작용

 DAO, Repository 차이점 

이렇게 DAO와 Repository의 특징을 작성해봤지만 솔직히 차이점을 아래에 적었지만 아직은 해석이 어렵다, 그래도 앞으로 프로젝트를 구성할 때 조금이나마 도움이 될 거 같다.

  • DAO는 데이터 지속성의 추상화 이고 Repository는 객체 컬렉션의 추상화이다.
  • DAO는 데이터 소스에 가깝고 Repoeitory는 도메인 개체에 가깝다.
  • DAO는 영속성 개체임을 숨기지 않고 구현체가 인프라 계층에 있는 것을 숨기지 않는다.
  • Repository는 영속성 개체임을 숨기고 구현체가 인프라 계층에 있지만 숨겨져 있다.

 

참고 게시글

https://velog.io/@maketheworldwise/DAO%EC%99%80-Repository%EC%9D%98-%EC%B0%A8%EC%9D%B4

https://dev-coco.tistory.com/166

https://velog.io/@mercurios0603/DAO%EC%99%80-Repository%EC%9D%98-%EC%B0%A8%EC%9D%B4

https://devlopsquare.tistory.com/106

Comments