IT

DAO와 Repository: 차이점과 함께 사용하는 이유는 무엇일까요?

0and24 2024. 11. 24. 13:18

DAO(Data Access Object)와 Repository는 모두 데이터를 다루는 디자인 패턴으로, 처음 개발을 시작할 때 헷갈리기 쉽습니다. 이 글에서는 두 개념의 차이점과 이름이 다르게 사용되는 이유, 그리고 실제 프로젝트에서의 활용 방법을 간단히 정리해보겠습니다.

DAO 패턴: 데이터 접근의 추상화

DAO 패턴은 데이터베이스와의 상호작용을 추상화합니다.
즉, 데이터베이스의 구조(테이블)를 직접 다루지 않고, 데이터 접근을 전담하는 객체를 만들어 복잡한 쿼리를 숨깁니다.

주요 특징

  1. 데이터베이스 중심: DAO는 데이터베이스 테이블에 초점이 맞춰져 있습니다.
  2. SQL 쿼리 사용: 데이터를 읽고 쓰는 작업에 SQL 또는 이를 추상화한 기술(MyBatis, JPA 등)을 사용합니다.
  3. 단순한 CRUD 작업: 데이터의 생성(Create), 읽기(Read), 수정(Update), 삭제(Delete)을 수행합니다.

DAO 패턴 예제

public class UserDao {
    private final EntityManager entityManager;

    public void create(User user) {
        entityManager.persist(user);
    }

    public User read(Long id) {
        return entityManager.find(User.class, id);
    }

    public void update(User user) {
        entityManager.merge(user);
    }

    public void delete(Long id) {
        User user = entityManager.find(User.class, id);
        if (user != null) {
            entityManager.remove(user);
        }
    }
}

👉 요약: DAO는 데이터베이스와 밀접하게 연관되어, 데이터 저장소와의 직접적인 소통을 단순화합니다.

 

Repository 패턴: 비즈니스 로직 중심의 데이터 관리

Repository 패턴은 데이터를 다루는 더 높은 수준의 추상화를 제공합니다.
주요 목표는 데이터를 도메인 객체 관점에서 다루고, 비즈니스 로직과 데이터 접근 로직 간의 중간 계층 역할을 하는 것입니다.

주요 특징

  1. 도메인 중심: Repository는 데이터를 비즈니스 관점에서 관리하며, 데이터를 모은 컬렉션처럼 동작합니다.
  2. 다양한 데이터 소스: 반드시 데이터베이스만 다루는 것이 아니라 API, 캐시, 파일 시스템 등 다양한 데이터 소스와 상호작용할 수 있습니다.
  3. DAO를 활용: DAO를 내부적으로 사용해 데이터베이스 접근을 위임할 수 있습니다.

Repository 패턴 예제

public interface UserRepository {
    User get(Long id);
    void add(User user);
    void update(User user);
    void remove(Long id);
}

public class UserRepositoryImpl implements UserRepository {
    private final UserDao userDao;

    @Override
    public User get(Long id) {
        return userDao.read(id);
    }

    @Override
    public void add(User user) {
        userDao.create(user);
    }

    @Override
    public void update(User user) {
        userDao.update(user);
    }

    @Override
    public void remove(Long id) {
        userDao.delete(id);
    }
}

👉 요약: Repository는 데이터를 도메인 객체로 추상화하여, 데이터 접근 로직과 비즈니스 로직을 분리합니다.

DAO와 Repository의 차이점

역할 데이터 접근 추상화 도메인 객체 관점에서 데이터 관리
초점 데이터베이스와의 상호작용 비즈니스 로직과 데이터 접근 로직의 분리
적용 범위 주로 데이터베이스 다양한 데이터 소스(API, 캐시 등)
의존성 독립적 사용 가능 DAO를 내부적으로 사용할 수 있음
설계 철학 데이터 중심의 설계 도메인 중심의 설계

왜 이름이 다를까요?

이름이 다르게 사용되는 이유는 주로 역사적인 배경철학의 차이 때문입니다.

  1. DAO: 전통적인 데이터 접근 방식
    DAO는 데이터베이스 중심의 애플리케이션에서 오랫동안 사용되어 왔습니다. SQL 기반 코드가 주를 이루던 시절에는 DAO 패턴이 적합했습니다.
  2. Repository: 도메인 주도 설계(DDD)
    Repository는 도메인 중심 설계를 지원하며, 데이터 소스를 감추고 비즈니스 로직에 집중하도록 도와줍니다. 따라서 더 높은 수준의 추상화를 제공합니다.

 

언제 어떤 것을 사용할까요?

  1. SQL 중심의 프로젝트: MyBatis, JDBC 등을 사용하는 경우 DAO를 선호합니다.
  2. ORM 기반의 프로젝트: JPA, Hibernate를 사용할 때 Repository 패턴이 일반적입니다.
  3. 복잡한 비즈니스 로직: 여러 데이터 소스를 조합하거나 데이터를 도메인 객체로 가공해야 할 때 Repository가 적합합니다.

 

결론: DAO와 Repository는 상호 보완적이다!

  • DAO: 데이터 접근에 초점, 데이터베이스와의 직접적인 소통을 캡슐화.
  • Repository: 도메인 객체 중심, 비즈니스 로직과 데이터 접근 로직의 중간 계층.

두 패턴은 같은 목적을 가지고 있지만, 사용되는 철학과 기술 스택에 따라 다르게 적용됩니다. 프로젝트의 성격과 요구사항에 따라 적절히 선택하면 됩니다.

 

추가 학습 자료 추천

Repository와 DAO에 대한 더 많은 정보를 원하신다면 아래 문서를 확인해보세요.

https://www.linkedin.com/pulse/what-difference-between-dao-repository-patterns-abid-anjum

 

What is the difference between DAO and Repository patterns?

DAO Pattern DAO is an abstraction of data persistence. Repository is an abstraction of a collection of objects.

www.linkedin.com