DAO vs Repository

데브코스에서 JPA 강의를 듣기 시작했다. 강의를 복습하면서 관련 자료를 공부하는 중 DAO라는 단어에 꽂히게 되었다. 이전에 Spring 관련 공부를 하면서 많이 봤었지만 ‘Repository와 똑같은 거 아냐?‘하고 넘어갔었는데, 오늘은 뭔가 그렇게 넘어가기 싫었다. 여러 글들을 찾아 읽어보던 중 자세히 설명해 놓은 글이 있어 읽고 간단하게 정리해보았다.


DAO는 비즈니스 로직과 퍼시스턴스 로직의 명확한 분리를 위해 퍼시스턴스 로직을 캡슐화하고 도메인 레이어에 객체 지향적인 인터페이스를 제공하는 객체이다. (도메인 레이어와 비즈니스 레이어를 명확하기 분리하기 위함)

Repository는 DDD의 기본 빌딩 블록 중 하나이다. 도메인 레이어에 객체 지향적인 컬렉션 관리 인터페이스를 제공하기 위해 사용되는 Pure Fabrication이다. 특정 객체 집합의 가상적인 메모리 컬렉션을 관리한다. Repository 자체는 퍼시스턴스 메커니즘에 대한 어떤 가정도 하지 않는다. Repository를 사용할 때는 이미 모든 객체가 메모리에 로드되어 있다고 가정하고 메모리에 로드된 특정 객체, 객체 집합, 전체 객체에 접근하기 위해 Repository를 사용한다. (객체 컬렉션 처리에 관한 책임만 가지고 있다.)

DAO와 Repository 모두 퍼시스턴스 로직에 대한 객체 지향적인 인터페이스를 제공하고 도메인 로직과 퍼시스턴스 로직을 분리하여 관심의 분리 원칙을 만족시키는데 목적이 있다. 그러나 유사성이 존재한다고 해서 DAO와 Repository를 동일한 패턴으로 취급하는 것은 일반화의 오류를 범하는 것이다.

DAO의 인터페이스는 데이터베이스의 CRUD 쿼리와 1:1 매칭되는 세밀한 단위의 오퍼레이션을 제공한다. 반면 Repository는 메모리에 로드된 객체 컬렉션에 대한 집합 처리를 위한 인터페이스를 제공한다. DAO가 제공하는 오퍼레이션이 Repository가 제공하는 오퍼레이션보다 더 세밀하며, 결과적으로 Repository에서 제공하는 하나의 오퍼레이션이 DAO의 여러 오퍼레이션에 매핑되는 것이 일반적이다. 따라서 하나의 Repository 내부에서 다수의 DAO를 호출하는 방식으로 Repository를 구현할 수 있다.

DAO는 퍼시스턴스 레이어에 속한다. Repository의 인터페이스는 도메인 레이어에 속한다.

출처

http://egloos.zum.com/aeternum/v/1160846


Written by@Myunghwan
Nothing changes if nothing changes

GitHub