DDD(도메인 주도 설계)와 Repository 패턴에서의 DIP 적용

0

TIL

목록 보기
165/183

도메인 주도 설계(DDD)에서 JpaRepository와 같은 영속성 계층의 위치와 의존성 관리에 대해 특강에서 배우게되었다.

DDD에서는 비즈니스 로직과 데이터 접근 로직을 명확히 분리하는 것이 중요하다. 이를 위해 일반적으로 Repository 인터페이스는 도메인 영역에 위치시키고, 도메인 모델은 데이터베이스와 같은 인프라 기술에 의존하지 않고 비즈니스 로직에만 집중할 수 있다.

하지만, JpaRepository와 같은 구현체는 데이터베이스와 밀접하게 연관되어 있기 때문에 인프라스트럭처 영역에 두는 것이 일반적인 설계 방식이다. 이때, JpaRepository는 도메인 영역의 Repository 인터페이스를 참조하도록 하여 의존성을 역전시키고, DIP를 적용할 수 있다.

의존성 역전 원칙(DIP)은 고수준 모듈이 저수준 모듈에 의존하는 것이 아니라, 둘 다 추상화된 인터페이스에 의존해야 한다는 원칙이다. DDD에서 이를 적용하는 방법은 도메인 영역에서 Repository 인터페이스를 정의하고, 인프라스트럭처 영역에서 해당 인터페이스를 구현하는 것이다.

// 도메인 영역
public interface OrderRepository {
    Optional<Order> findById(Long id);
    Order save(Order order);
}
// 인프라스트럭처 영역
@Repository
public interface JpaOrderRepository extends JpaRepository<Order, Long>, OrderRepository {}

위와 같은 방식으로 DIP를 적용하면, 도메인 모델은 구체적인 DB 구현체에 의존하지 않게 된다. 도메인 레이어는 순수하게 비즈니스 로직을 처리하며, 데이터 저장소와의 세부 사항은 인프라스트럭처 레이어에서 처리된다.

하지만 현실적으로는 JpaRepository와 같은 기술 스택이 쉽게 바뀌지 않는 경우가 많다. 실제 프로젝트에서는 구현 기술의 변화가 거의 없기 때문에, 굳이 DIP를 엄격하게 적용하지 않고 JpaRepository를 도메인 영역에 위치시키는 것도 합리적인 선택일 수 있다.

// 도메인 영역
public interface OrderRepository extends JpaRepository<Order, Long> {}

이렇게 하면 개발이 좀 더 간편해지고, 코드가 간결해진다. 또한, JpaRepository 자체가 기본적인 CRUD 기능을 제공하기 때문에 중복 코드 작성이 줄어드는 장점도 있다. 다만, 이렇게 할 경우 도메인 계층이 영속성 기술에 대한 의존성을 가지게 되어, 특정 기술에 종속될 수 있다는 점을 고려해야 한다.

0개의 댓글

관련 채용 정보