250x250
반응형
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
Today
Total
관리 메뉴

재 현

의존성, 의존성 주입, 제어의 역전 본문

Development

의존성, 의존성 주입, 제어의 역전

본명은이점례 2023. 11. 4. 21:55
728x90

의존성이란?

소프트웨어 개발에서 한 요소나 컴포넌트가 다른 요소나 컴포넌트에 의존하는 관계를 가리킨다. 어떤 요소나 모듈이 다른 요소의 기능, 데이터, 또는 서비스를 필요로 하는 경우 그것을 "의존성"이라고 한다.

 

쉽게 말해서 그냥 "나, 너 알고 있어"다.

 

의존성의 핵심은 '변경'이다. 같이 변경되는 코드를 같은 곳에 넣어야 한다. 그게 의존성이라고 할 수 있다.

 

 

 

의존성은 다양한 관계를 이루고 있다.

 

  • 클래스 간의 관계: 클래스 A가 클래스 B를 사용하면 클래스 A는 클래스 B에 의존성을 가진다. 이것은 클래스 A가 클래스 B의 메서드나 속성을 호출하거나 클래스 B의 객체를 생성하거나 사용할 때 발생한다.

 

  • 모듈 간의 의존성: 소프트웨어 시스템이 여러 모듈로 구성되어 있을 때, 모듈 X가 모듈 Y의 기능을 사용하면 모듈 X는 모듈 Y에 의존성을 가진다.

 

  • 라이브러리 또는 외부 서비스 의존성: 소프트웨어가 외부 라이브러리나 웹 서비스를 사용할 때, 해당 라이브러리나 서비스에 대한 의존성이 발생한다.

 

 

 

의존성 주입(Dependency Injection)

의존성 주입은 소프트웨어 개발에서 객체 간의 의존성을 관리하는 디자인 패턴 중 하나다. 이 패턴은 객체가 필요로 하는 의존 객체를 직접 생성하는 대신, 외부에서 주입받도록 하는 것을 의미한다. 이를 통해 코드의 결합도를 낮추고, 코드의 재사용성을 높이는 이점을 얻을 수 있습니다.

 

다음과 같은 코드를 보자.

 

 

 

메뉴는 여러 가지 요리 객체들을 알고 있다. 생성자에서 요리 객체들을 List로 인스턴스 필드 초기화해주고 있다. 이런 경우 어떤 일이 발생할까? 우리는 인터페이스, 즉 추상화에 의존하며 객체지향원칙인 DIP를 지켜야 한다.

 

만약에 메뉴에, 새로운 요리가 등장했다면?

 

 

이런 식으로 메뉴에 또 추가해야 할 것이다. 그렇다면 우린 DIP 원칙을 어기게 된다. 매번 요리가 생기면 Menu Item에 추가해줘야 할 것이다. 이는 Menu의 책임이 아니다.

 

그렇다면 어떻게 할까?

 

 

생성자를 통해 넣어준다. 그렇다면 Menu는 더 이상 Dish가 추가되든 삭제되든 신경 쓰지 않아도 된다. 그냥 주는 대로 받고서 나중에 메뉴를 고를 때 이름만 비교하면 된다. Dish List에 관한 정보는 appConfig 클래스가 알아서 하도록 내버려두는 것이다.

 

의존성 주입의 장점

의존성 주입을 사용하면 다음과 같은 이점을 얻을 수 있다:

  • 코드의 결합도를 낮추어 모듈성과 유연성을 향상시킨다.
  • 테스트 용이성을 높여 단위 테스트(Unit Test)를 수행하기 쉬워진다.
  • 객체 간의 의존 관계를 명시적으로 정의하고 관리할 수 있다.

 

 

 

 

 

제어의 역전(IoC, Inversion of Control)

제어의 역전은 소프트웨어의 제어 흐름을 바꾸는 개념으로, 프레임워크나 컨테이너에 의해 객체의 생명주기와 의존성 관리가 이루어진다. 이로써 개발자는 객체의 생성과 관리에 대한 제어권을 프레임워크나 컨테이너에 넘김으로써 코드의 품질을 향상할 수 있습니다.

 

 

 

우리(개발자)가 Menu의 생성자에 이런 식으로 의존 객체들을 넣어주는 것이 아니라

 

 

 

appConfig란 녀석이 나타나, 의존성 관리를 대신해주는 거다. 우리 입장에선 Dish List가 어떻게 되었든 간에 그냥 쓰기만 하면 되는 거고, 이에 대한 책임 AppConfig가 설정해 주는 거다. 

 

 

 

 

 

왜 사용해야 하나?

의존성 주입제어의 역전은 코드의 품질과 유지보수성을 향상하는 데 중요한 역할을 한다. 코드의 결합도를 낮추고, 유연한 코드를 작성할 수 있게 함으로써 소프트웨어 개발을 보다 효율적으로 진행할 수 있다. 또한, 단위 테스트를 수행하기 쉽게 만들어 버그를 빨리 발견하고 해결할 수 있다.

 

 

 

 

 

 

참고


https://blog.naver.com/mindalpong_/222280700011

https://github.com/songjayhyun/orderDish

https://velog.io/@think2wice/Spring-%EC%9D%98%EC%A1%B4%EC%84%B1-%EC%A3%BC%EC%9E%85DI%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC

 

728x90

'Development' 카테고리의 다른 글

TDD 학습과 후기  (0) 2023.11.08
getter 사용  (0) 2023.11.08
원시값 포장이란?  (1) 2023.11.02
정적 팩토리 메서드  (0) 2023.11.02
JUnit 4와 JUnit 5에서 제공하는 Assertions(번역)  (1) 2023.11.01