의존성 역전 원칙이란
객체 지향 프로그래밍에서 의존관계 역전 원칙은 소프트웨어 모듈들을 분리하는 특정 형식을 지칭한다. 이 원칙을 따르면, 상위 계층(정책 결정)이 하위 계층(세부 사항)에 의존하는 전통적인 의존관계를 반전(역전)시킴으로써 상위 계층이 하위 계층의 구현으로부터 독립되게 할 수 있다. 이 원칙은 '상위와 하위 객체 모두가 동일한 추상화에 의존해야 한다'는 객체 지향적 설계의 대원칙을 제공한다
- 첫째, 상위 모듈은 하위 모듈에 의존해서는 안된다. 상위 모듈과 하위 모듈 모두 추상화에 의존해야 한다.
- 둘째, 추상화는 세부 사항에 의존해서는 안된다. 세부사항이 추상화에 의존해야 한다.
테스트 코드를 공부하기 위해 만든 데모프로젝트에 의존성 역전 원칙을 적용시켜 보았다. UserService
와 PostService
에서 Repository
를 의존하고 있는데 이 사이에 인터페이스를 적용시켜서 의존성을 역전 시킬 것이다.
프로젝트에 적용해보기
Overview
위에 사진 같은 형태였던 프로젝트 구조를 리팩토링해서 아래와 같은 구조로 바꾼다. UserService
는 UserRepository
인터페이스를 의존하고 UserRepositoryImpl
은 이전에 존재했던 UserJpaRepository
를 주입받는다.
Detail
우선 파일에 대해서 간단하게 설명해보자면 기존의 UserJpaRepository
외에 UserRepository
와 UserRepositoryImpl
을 추가했고 여기서 JpaRepository
를 주입받고 UserSerivce
에서 의존성을 제거하는 방식으로 의존성 역전 원칙을 실현한다.
각 파일을 간단하게 설명해보자면 다음과 같다.
UserJpaRepsitory
: 기존의Repository
.JpaRepository
를 상속받고 있고 의존성이 있기때문에 이를 제거하고자 의존성역전원칙을 적용하는 것이다UserRepository
:UserService
에서 사용할 인터페이스.JpaRepository
에 의존하지 않고 독립적으로 UserSerivce가 작동할 수 있도록 해준다.UserRepositoryImpl
:UserRepository
의 구현체. 여기서UserJpaRepository
를 주입받기 때문에UserService
에서 주입받지 않아도 된다UserService : Jpa의존성을 제거하고 인터페이스를 의존한다
기존에 UserJpaRepository에서 JpaRepository클래스가 기본적으로 제공하던 메서드(save()
등)을 직접적으로 사용하지 못하기 때문에 UserRepositoryImpl에서 해당메서드를 호출해준다.
Test
프로젝트 구조를 바꿨기때문에 기능이 제대로 작동하는지 테스트코드를 실행해본다.
마치며
구조를 리팩터링해도 테스트가 잘 작동하니 안심이 된다. 기능을 추가하거나 리팩터링할 때 테스트코드를 작성해두는게 비용면에서 효율적이라는 것을 새삼 체감하게 된다. 다음번엔 도메인과 영속성객체를 구분해 영속성 의존을 제거해 볼 것이다.