Skip to main content

Command Palette

Search for a command to run...

[Spring] 프로젝트에 의존성 역전 원칙(DIP) 적용해보기

Updated
[Spring] 프로젝트에 의존성 역전 원칙(DIP) 적용해보기
K

backend developer interested in technical problem

의존성 역전 원칙이란

객체 지향 프로그래밍에서 의존관계 역전 원칙은 소프트웨어 모듈들을 분리하는 특정 형식을 지칭한다. 이 원칙을 따르면, 상위 계층(정책 결정)이 하위 계층(세부 사항)에 의존하는 전통적인 의존관계를 반전(역전)시킴으로써 상위 계층이 하위 계층의 구현으로부터 독립되게 할 수 있다. 이 원칙은 '상위와 하위 객체 모두가 동일한 추상화에 의존해야 한다'는 객체 지향적 설계의 대원칙을 제공한다

첫째, 상위 모듈은 하위 모듈에 의존해서는 안된다. 상위 모듈과 하위 모듈 모두 추상화에 의존해야 한다.
둘째, 추상화는 세부 사항에 의존해서는 안된다. 세부사항이 추상화에 의존해야 한다.

테스트 코드를 공부하기 위해 만든 데모프로젝트에 의존성 역전 원칙을 적용시켜 보았다. UserServicePostService에서 Repository를 의존하고 있는데 이 사이에 인터페이스를 적용시켜서 의존성을 역전 시킬 것이다.


프로젝트에 적용해보기

Overview

위에 사진 같은 형태였던 프로젝트 구조를 리팩토링해서 아래와 같은 구조로 바꾼다. UserServiceUserRepository인터페이스를 의존하고 UserRepositoryImpl은 이전에 존재했던 UserJpaRepository를 주입받는다.

Detail

우선 파일에 대해서 간단하게 설명해보자면 기존의 UserJpaRepository외에 UserRepositoryUserRepositoryImpl을 추가했고 여기서 JpaRepository를 주입받고 UserSerivce에서 의존성을 제거하는 방식으로 의존성 역전 원칙을 실현한다.

각 파일을 간단하게 설명해보자면 다음과 같다.

  • UserJpaRepsitory : 기존의 Repository. JpaRepository를 상속받고 있고 의존성이 있기때문에 이를 제거하고자 의존성역전원칙을 적용하는 것이다

  • UserRepository : UserService에서 사용할 인터페이스. JpaRepository에 의존하지 않고 독립적으로 UserSerivce가 작동할 수 있도록 해준다.

  • UserRepositoryImpl : UserRepository의 구현체. 여기서 UserJpaRepository를 주입받기 때문에 UserService에서 주입받지 않아도 된다

  • UserService : Jpa의존성을 제거하고 인터페이스를 의존한다


기존에 UserJpaRepository에서 JpaRepository클래스가 기본적으로 제공하던 메서드(save()등)을 직접적으로 사용하지 못하기 때문에 UserRepositoryImpl에서 해당메서드를 호출해준다.

Test

프로젝트 구조를 바꿨기때문에 기능이 제대로 작동하는지 테스트코드를 실행해본다.

마치며

구조를 리팩터링해도 테스트가 잘 작동하니 안심이 된다. 기능을 추가하거나 리팩터링할 때 테스트코드를 작성해두는게 비용면에서 효율적이라는 것을 체감하게 된다. 다음번엔 도메인과 영속성객체를 구분해 영속성 의존을 제거해 볼 것이다.

4 views

More from this blog

rfc 959 읽어보면서 ftp이해하기

들어가며 프로젝트에서 FTP를 통해 파일을 전송하는 클라이언트를 개발했을 때 이야기입니다. 프로토콜에 대한 이해 없이 개발을 진행하다 보니 불필요하게 시간을 소모한 경험이 있어서 RFC 원문을 읽어보게 되었습니다. 읽게 된 계기 당시 FTP 프로토콜에 대한 이해가 부족한 상태로 개발을 시작했습니다. '제어를 위한 포트와 데이터 전송을 위한 포트가 분리되어 있다' 정도만 알고 있었고 Active 모드와 Passive 모드의 차이를 제대로 이해...

Dec 5, 20256
rfc 959 읽어보면서 ftp이해하기

mapstruct 로 보일러플레이트 코드 줄이기

배경 사내에서 교통 모니터링용 레이더 디바이스를 관리하는 API를 개발했을때 이야기입니다. 반복되는 코드에서 느꼈던 피로를 개선하고자 mapstruct를 적용해봤습니다. 실황 우선 일부 필드만 추출한 Device에 대해 간단히 이야기해야할 것 같습니다. 교통 모니터링용 레이더 디바이스로 신호등이나 가로등에 설치하며 설치된 좌표를 기록하는 위도, 경도와 레이더가 바라보는 방향을 의미하는 heading_angle필드 등이 있습니다. public...

Nov 13, 20259
mapstruct 로 보일러플레이트 코드 줄이기
T

takoyakisoba

38 posts