/////
Search
Duplicate
7️⃣

도메인 구현과 DIP

: 엔티티는 구현 기술인 JPA에 특화된 @Entity, @Table, @Id, @Column 등의 애너테이션을 사용하고 있다.
⇒ 어? DIP를 위반하고 있는 것 아닌가?
: DIP에 따르면 @Entity, @Table은 구현 기술에 속하므로 도메인 모델이 의존하기에 적합하지 않다.
: 리포지터리 인터페이스도 마찬가진데 리포지터리 인터페이스 또한 JPA의 구현기술을 상속하고 있다. 즉 도메인이 인프라에 의존하는 것이다.
: 구현 기술에 대한 의존 없이 도메인을 순수하게 유지하려면 스프링 데이터 JPA의 Repository 인터페이스를 상속받지 않게하고 인터페이스를 구현한 클래스를 인프라에 위치시켜야 한다.
: 또한 Entity에서도 JPA에 특화된 애너테이션을 모두 지우고 인프라에 JPA를 연동하기 위한 클래스를 추가해야 한다.
: DIP를 적용하는 주된 이유는 저수준 구현이 변경되더라도 고수준이 영향을 받지 않도록 하기 위함이다.
: 더욱이 리포지터리와 도메인 모델의 구현 기술은 영속적인 성격을 가지므로 이에 대해서 DIP를 지키는 것은 과도하다고 생각하여 필자는 애그리거트, 리포지터리 등 도메인 모델을 구현할 때 타협을 했다.
: DIP를 완전히 지키면 좋지만 개발 편의성과 실용성을 가져가면서 구조적인 유연함은 어느정도 유지했으면 복잡도를 높이지 않으면서 구현 기술에 따른 제약이 낮다면 합리적인 선택이라고 생각한다.