일반적으로 DAO (Data Access Object)와 Repository의 역할은 비슷한 데이터 액세스 작업을 수행하지만, 목적과 사용 방법에 약간의 차이가 있습니다. 아래에서 각각의 역할을 설명하겠습니다:
DAO (Data Access Object)
목적: DAO는 데이터베이스와 상호 작용하기 위한 데이터 액세스 계층을 나타내는 디자인 패턴입니다. 주요 목적은 데이터베이스에 대한 저수준 데이터 액세스를 캡슐화하고 추상화하는 것입니다. DAO는 데이터베이스 연결, 쿼리 작성, 데이터 검색 및 업데이트와 같은 데이터 액세스 작업을 처리합니다.
직접적인 구현: 개발자가 데이터베이스 연결을 열고 닫는 등의 로우 레벨 작업을 수동으로 처리해야 합니다.
Repository
목적: Repository는 데이터베이스 액세스를 추상화하고 도메인 객체(Entity)를 저장하고 검색하는 데 사용됩니다. 주로 스프링 데이터 JPA와 같은 ORM(Object-Relational Mapping) 기술과 함께 사용됩니다. Repository는 도메인 모델을 지원하며, 보다 객체 지향적인 방식으로 데이터 액세스를 수행합니다.
자동화된 구현: 스프링 데이터 JPA와 같은 프레임워크를 사용하면 Repository 인터페이스를 정의하고 구현하지 않아도 됩니다. 프레임워크가 자동으로 CRUD(Create, Read, Update, Delete) 메서드를 생성하고 도메인 객체(Entity)와 상호 작용합니다.
일반적으로 스프링과 JPA를 사용하는 경우, Repository 패턴이 더 선호됩니다. Repository 패턴은 ORM 기술과 통합하여 객체 관계 매핑을 제공하므로 데이터베이스 스키마와 도메인 모델 사이의 매핑을 처리하고, SQL 쿼리 대신 메서드 호출을 통해 데이터베이스 액세스를 추상화합니다. 이로써 개발자는 보다 객체 지향적인 방식으로 데이터 액세스 코드를 작성할 수 있습니다.
또한, Repository는 스프링 데이터 JPA와 함께 사용될 때 자동으로 구현 클래스를 생성하므로 개발자는 별도의 데이터 액세스 코드를 작성할 필요가 없습니다. Repository 인터페이스를 정의하면 스프링 데이터 JPA가 이를 스캔하여 자동으로 데이터 액세스 메서드를 생성하고 관리합니다.
참고 : DAO와 Repository의 차이점 (https://code-lab1.tistory.com/201)
DAO와 REPOSITORY 모두 퍼시스턴스 로직에 대한 객체-지향적인 인터페이스를 제공하고 도메인 로직과 퍼시스턴스 로직을 분리하여 관심의 분리(separation of concerns) 원리를 만족시키는데 목적이 있다. 그러나 비록 의도와 인터페이스의 메서드 시그니처에 유사성이 존재한다고 해서 DAO와 REPOSITORY를 동일한 패턴으로 취급하는 것은 성급한 일반화의 오류를 범하는 것이다.
DAO는 퍼시스턴스 로직인 Entity Bean을 대체하기 위해 만들어진 개념이다. DAO가 비록 객체-지향적인 인터페이스를 제공하려는 의도를 가지고 있다고 하더라도 실제 개발 시에는 하부의 퍼시스턴스 메커니즘이 데이터베이스라는 사실을 숨기려고 하지 않는다. DAO의 인터페이스는 데이터베이스의 CRUD 쿼리와 1:1 매칭 되는 세밀한 단위의 오퍼레이션을 제공한다.
반면 REPOSITORY는 메모리에 로드된 객체 컬렉션에 대한 집합 처리를 위한 인터페이스를 제공한다. DAO가 제공하는 오퍼레이션이 REPOSITORY 가 제공하는 오퍼레이션보다 더 세밀하며, 결과적으로 REPOSITORY에서 제공하는 하나의 오퍼레이션이 DAO의 여러 오퍼레이션에 매핑되는 것이 일반적이다. 따라서 하나의 REPOSITORY 내부에서 다수의 DAO를 호출하는 방식으로 REPOSITORY를 구현할 수 있다.