DAO(Data Access Object)와 Repository는 모두 데이터를 다루는 디자인 패턴으로, 처음 개발을 시작할 때 헷갈리기 쉽습니다. 이 글에서는 두 개념의 차이점과 이름이 다르게 사용되는 이유, 그리고 실제 프로젝트에서의 활용 방법을 간단히 정리해보겠습니다.
DAO 패턴: 데이터 접근의 추상화
DAO 패턴은 데이터베이스와의 상호작용을 추상화합니다.
즉, 데이터베이스의 구조(테이블)를 직접 다루지 않고, 데이터 접근을 전담하는 객체를 만들어 복잡한 쿼리를 숨깁니다.
주요 특징
- 데이터베이스 중심: DAO는 데이터베이스 테이블에 초점이 맞춰져 있습니다.
- SQL 쿼리 사용: 데이터를 읽고 쓰는 작업에 SQL 또는 이를 추상화한 기술(MyBatis, JPA 등)을 사용합니다.
- 단순한 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 패턴은 데이터를 다루는 더 높은 수준의 추상화를 제공합니다.
주요 목표는 데이터를 도메인 객체 관점에서 다루고, 비즈니스 로직과 데이터 접근 로직 간의 중간 계층 역할을 하는 것입니다.
주요 특징
- 도메인 중심: Repository는 데이터를 비즈니스 관점에서 관리하며, 데이터를 모은 컬렉션처럼 동작합니다.
- 다양한 데이터 소스: 반드시 데이터베이스만 다루는 것이 아니라 API, 캐시, 파일 시스템 등 다양한 데이터 소스와 상호작용할 수 있습니다.
- 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를 내부적으로 사용할 수 있음 |
설계 철학 | 데이터 중심의 설계 | 도메인 중심의 설계 |
왜 이름이 다를까요?
이름이 다르게 사용되는 이유는 주로 역사적인 배경과 철학의 차이 때문입니다.
- DAO: 전통적인 데이터 접근 방식
DAO는 데이터베이스 중심의 애플리케이션에서 오랫동안 사용되어 왔습니다. SQL 기반 코드가 주를 이루던 시절에는 DAO 패턴이 적합했습니다. - Repository: 도메인 주도 설계(DDD)
Repository는 도메인 중심 설계를 지원하며, 데이터 소스를 감추고 비즈니스 로직에 집중하도록 도와줍니다. 따라서 더 높은 수준의 추상화를 제공합니다.
언제 어떤 것을 사용할까요?
- SQL 중심의 프로젝트: MyBatis, JDBC 등을 사용하는 경우 DAO를 선호합니다.
- ORM 기반의 프로젝트: JPA, Hibernate를 사용할 때 Repository 패턴이 일반적입니다.
- 복잡한 비즈니스 로직: 여러 데이터 소스를 조합하거나 데이터를 도메인 객체로 가공해야 할 때 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
'IT' 카테고리의 다른 글
자바 람다식과 스트림: 사용법, 연습법, 그리고 Optional까지 (0) | 2024.12.01 |
---|---|
Spring Boot 프로젝트를 GitHub에 업로드하는 방법 (1) | 2024.11.23 |
메시지 브로커: RabbitMQ와 Kafka?? (1) | 2024.11.21 |
코틀린이란 무엇인가, 그리고 왜 필요한가? (1) | 2024.11.20 |
완벽한 세상을 위한 한걸음 패스키란? (1) | 2024.11.20 |