1 minute read

0. 서론

이전에는 DTO vs VO vs Entity 그리고 POJO 의 차이에 대해 알아봤었다.

이번에는 REPOSITORY 와 DAO의 차이에 대해 알아보려 한다.

이전 Spring MVC 를 사용할 때는 DAO는 데이터베이스를 연결하는 개체 정도로만 알고 사용하여, 이곳에 SQL문을 넣어 사용하였다.

하지만 JPA를 익히면서 DAO 와 차이에 대해 의문을 가지게 되었다.

사실, 두 객체의 인터페이스의 차이는 크게 없다고 한다.(그렇게 생각 됌). 하지만 혼용을 하여 사용하는것은 논쟁의 불씨를 남기는것이기에,,

그래서 이번장에 다시한번 이걸 정리하고 넘어가려 한다.

1. DAO VS REPOSITORY

DAO / REPOSITORY 정리

  • DAO는 data persistence의 추상화.
  • DAO는 데이터베이스와 관련이 많으며 Table 중심
  • REPOSITORY는 Collection of Objects의 추상화
  • REPOSITORY는 도메인과 관련이 있으며, Arggregate Roots만을 다룬다.
  • REPOSITORY는 여러 DAO를 통해 구현이 가능하지만, 그 반대는 불가.
  • REPOSITORY는 보통 한정된 인터페이스이다. 단순히 Get(id), Find(Specification), Add(Entity) 와 같은 객체들의 Collection이다.
  • UPDATE 같은 메서드는 DAO에 적합하며 REPOSITORY와는 맞지 않는다.
  • 실제로 흔히 REPOSITORY라고 부르지만 DAO에 가까운 것들이 많다.
  • 둘다 쿼리를 다룬다는것에 비슷하지만 DAO가 REPOSITORY보다 조금 더 유연한 패턴이다. 만약 둘다 사용하고 싶다면 DAO에서 REPOSITORY를 사용한다.

  • REPOSITORY 는 특정 타입의 저장소이다 , 특정 타입의 객체들을 찾을수 있고 저장할 수 있다. 보통 객체들의 한가지 타입만을 다룬다.
    List<User> findAll(Creteria creteria);
    User save(User user);
    
  • DAO는 데이터를 저장한다. 같은 데이터 타입인지 아닌지는 크게 상관하지 않는다 , 따라서 관련된 데이터를 저장하는 DAO를 별 제약없이 쉽게 생성하는 것이 가능하다.
    // UserDao
    Collection<Permission> findPermissionsForUser(String userId)
    User findUser(String userId)
    Collection<User> findUsersForPermission(Permission permission)
    
  • DAO와 REPOSITORY 모두 DAL(DATA ACCESS LAYER) 의 구현체 ``` DAL(Data Access Layer).

DB와 연결된 객체지향 어플리케이션들은 반드시 DB관련 정보들을 처리해야함 그러기 위해선 그 코드들을 깔끔하게 모듈화 해야한다.

Layerd Architecture에서 이 모듈이 DAL 이다.

스프링은 Hibernate를 사용하여 이 DAL를 모듈화 하고 그것이 바로 DAO ㅠㅐ턴이다.

그럼 Repository는 어떨까? DAO와 비슷하게, Repository 또한 DAL를 구현하는 방법 중 하나이다. 이 패턴의 중요한 점은 사용자의 관점에서의 collection처럼, 보고 행동해야 한다는 것이다. ```

  • 즉 DAO와 Repository의 차이는 DAL를 구현하는 방식의 차이 이다.

Categories:

Updated: