Java의 리포지토리 패턴과 DAO의 차이점 - 2020 - 다른 사람

Mehvish Ashiq 2024년2월15일
  1. 데이터 액세스 개체 패턴
  2. 리포지토리 패턴
  3. Java의 데이터 액세스 개체(DAO)와 리포지토리 패턴의 차이점 - 2020 - 다른 사람
  4. DAO와 리포지토리 패턴 구현의 차이점
Java의 리포지토리 패턴과 DAO의 차이점 - 2020 - 다른 사람

오늘은 DAO(Data Access Object)와 리포지토리 패턴에 대해 알아보겠습니다. 이 기사에서는 이들 간의 차이점에 대해서도 설명합니다.

데이터 액세스 개체 패턴

이 패턴은 데이터 지속성의 추상화이며, 대부분 테이블 중심인 기본 스토리지에 더 가깝습니다. 그렇기 때문에 대부분의 경우 데이터 액세스 개체(DAO)가 데이터베이스 테이블과 일치하므로 추악한 쿼리를 숨기면서 저장소에서 데이터를 검색하고 보내는 가장 간단한 방법이 허용됩니다.

리포지토리 패턴

리포지토리 패턴은 데이터 스토리지 시스템의 모든 측면을 숨기는 애플리케이션에서 저장된 데이터를 검색하는 절차입니다. 다음은 username으로 하나의 user를 조회할 수 있는 저장소 인터페이스입니다.

interface UserRepository {
  User findUserByUsername(Username name);
}

여기에는 MySQL, Amazon DynamoDB, Web Service, Oracle 등의 스토리지 기술을 기반으로 하나 이상의 구현이 있을 수 있습니다.

또한 저장소 패턴은 애플리케이션의 나머지 부분에서 데이터 소스를 격리하는 디자인 패턴이라고 말할 수 있습니다. 저장소는 데이터 소스(예: 웹 서비스 및 영구 모델)와 나머지 애플리케이션 사이를 중재합니다.

다음은 저장소 패턴의 사용을 그래픽으로 나타낸 것입니다.

자바에서 리포지토리 패턴과 dao의 차이점 - 리포지토리 시각화

저장소가 Data Access Object(DAO)와 유사하지만 비즈니스 로직에서 데이터를 검색하는 데 사용되는 모든 로직을 숨기는 추상화라는 것을 이해하고 계십니다.

모델 주변의 래퍼처럼 작동하며 영구 저장소에서 데이터에 액세스하는 역할을 합니다. 리포지토리를 사용하는 이점은 그것을 사용하는 응용 프로그램에서 우리 항목이 저장되는 방법에 대한 정확한 세부 정보를 분리한다는 것입니다.

이것은 항상 User를 반환하지만 데이터베이스에 액세스하지 않는 스텁 코드를 작성할 수 있기 때문에 테스트에 매우 중요합니다. 다양한 문제에서 해방되고 저장된 데이터에 의존하지 않는 애플리케이션 코드에 대한 빠른 단위 테스트를 작성할 수 있습니다.

Java의 데이터 액세스 개체(DAO)와 리포지토리 패턴의 차이점 - 2020 - 다른 사람

주요 차이점은 리포지토리가 호출 계층에서 이해할 수 있는 개체만 반환한다는 것입니다. 대부분의 저장소는 비즈니스 계층에서 사용하므로 비즈니스 개체를 출력합니다.

반면에 데이터 액세스 개체는 전체 비즈니스 개체일 수도 있고 아닐 수도 있는 데이터를 반환합니다. 이는 데이터가 유효한 비즈니스 개념이 아님을 의미합니다.

비즈니스 개체가 데이터 구조일 경우 모델링 문제가 있음을 암시할 수 있습니다. 저장소가 최소한 캡슐화된 개체를 적절하게 사용하면 더 의미가 있는 반면 나쁜 디자인을 의미합니다.

데이터 구조만 로드하거나 저장하는 경우 저장소가 필요하지 않을 가능성이 큽니다. [객체 관계형 매핑] (ORM)이면 충분합니다.

다양한 다른 개체(집계)로 구성된 비즈니스 개체를 처리해야 하는 경우 저장소 패턴이 최상의 솔루션이며 이 특정 개체는 모든 부분이 일관성을 유지해야 합니다(집계 루트).

완전한 지속성 정보를 추상화하기 때문입니다. 우리 애플리케이션은 Product만 요청하고 저장소는 전체를 반환합니다. 개체를 복원하는 데 필요한 쿼리/테이블 수는 중요하지 않습니다.

비즈니스 오브젝트는 ORM(Object Relational Mapping) 엔티티가 아님을 기억하십시오. 기술적 인 관점에서 볼 수 있지만 디자인을 고려할 때 하나는 비즈니스를 모델링하고 다른 하나는 지속성을 모델링합니다.

대부분의 경우 직접적인 호환성은 없습니다.

다음은 리포지토리 패턴을 사용하는 것을 선호하는 몇 가지 상황입니다.

  • 무거운 쿼리가 많은 시스템에서 사용됩니다.
  • 중복 쿼리를 피하기 위해 저장소 패턴을 사용합니다.
  • Data Storage와 도메인(엔티티) 사이에서 사용됩니다.
  • 저장소가 생성된 개체의 사양을 사용하여 요소를 검색하고 제거하는 데에도 사용됩니다.

이제 코드 구현을 통해 이 차이점을 이해해 보겠습니다.

DAO와 리포지토리 패턴 구현의 차이점

데이터 액세스 개체 패턴의 구현부터 시작하겠습니다.

데이터 액세스 개체 패턴 구현

여기에 아래 나열된 세 가지 클래스가 필요합니다.

  1. 기본 Employee 도메인 클래스
  2. Employee 도메인에 대한 쉬운 CRUD 작업을 제공하는 EmployeeDAO 인터페이스
  3. EmployeeDAO 인터페이스를 구현하는 EmployeeDAOImplementation 클래스

예제 코드(Employee 클래스):

public class Employee {
  private Long id;
  private String employeeCode;
  private String firstName;
  private String email;

  // write your getters/setters
}

예제 코드(EmployeeDAO 인터페이스):

public interface EmployeeDAO {
  void create(Employee employee);
  Employee read(Long id);
  void update(Employee employee);
  void delete(String employeeCode);
}

예제 코드(EmployeeDAOImplementation 클래스):

public class EmployeeDAOImplementation implements EmployeeDAO {
  private final EntityManager entityManager;

  @Override
  public void create(Employee employee) {
    entityManager.persist(employee);
  }

  @Override
  public Employee read(long id) {
    return entityManager.find(Employee.class, id);
  }

  // ... continue with remaining code
}

기본 스토리지와 통신하기 위해 JPA EntityManager 인터페이스를 사용하고 있습니다. 또한 Employee 도메인에 대한 데이터 액세스 메커니즘을 제공합니다.

리포지토리 패턴 구현

이 패턴은 저장, 검색 동작 및 검색을 캡슐화하여 개체 컬렉션을 시뮬레이션합니다. DAO와 마찬가지로 쿼리를 숨기고 데이터를 처리하지만 응용 프로그램의 비즈니스 논리에 더 가까운 상위 수준에 있습니다.

리포지토리는 DAO를 사용하여 데이터베이스에서 데이터를 가져올 수도 있습니다. 또한 도메인 개체를 채우거나 도메인에서 데이터를 준비한 다음 지속성을 위해 DAO를 사용하여 스토리지 시스템으로 보낼 수 있습니다.

여기에 다음 클래스가 필요합니다.

  1. EmployeeRepository 인터페이스
  2. EmployeeRepositoryImplementation 클래스

예제 코드(EmployeeRepository 인터페이스):

public interface EmployeeRepository {
  Employee get(Long id);
  void add(Employee employee);
  void update(Employee employee);
  void remove(Employee employee);
}

예제 코드(EmployeeRepositoryImplementation 클래스):

public class EmployeeRepositoryImplementation implements EmployeeRepository {
  private EmployeeDAOImplementation employeeDAOImplementation;

  @Override
  public Employee get(Long id) {
    Employee employee = employeeDAOImplementation.read(id);
    return employee;
  }

  @Override
  public void add(Employee employee) {
    employeeDAOImplementation.create(employee);
  }

  // ... continue with remaining code
}

여기에서 EmployeeDAOImplementation을 사용하여 데이터베이스에서 데이터를 검색/전송합니다. 따라서 저장소와 DAO의 구현이 비슷해 보인다고 할 수 있습니다.

Employee 클래스는 빈약한 도메인이고 저장소는 DAO(데이터 액세스 계층) 위의 또 다른 계층일 뿐입니다. 그러나 저장소는 비즈니스 사용 사례를 구현하는 가장 좋은 방법입니다. 이에 비해 데이터 액세스 개체는 데이터 액세스에 적합한 후보로 보입니다.

Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook