유데미 스타터스 취업 부트캠프 3기 - 백엔드 8주차 학습 일지: 의존성 주입

joon·2023년 1월 14일
0

이번주는 서블릿과 jsp를 마무리하고 스프링과 스프링 MVC에 대해 공부했다. 이번주는 다른 주들에 비해 익숙해져야 할 것들이 많아 쉽지 않았다.
우선, 자바의 디자인 패턴도 잘 모르는 초짜 개발자가 스프링을 배우기 전에 넘어야 하는 큰 산이 있다. 바로 DI와 IoC를 이해하는 것이다. 고백하자면 인터넷과 책에 있는 여러 설명을 보고 들은 지금도 완벽하게 체득하지 못했다. 일단 나만의 언어로 간략하게 설명한 뒤, 틈틈이 고쳐나가기로 했다.

목표: 느슨한 결합을 가진 코드를 만들자

우선 DI와 IoC가 해결하고자 하는 문제를 이야기하는 것이 설명하기에 쉬울 것 같다. 강한 결합은 코드의 한 부분을 수정해야 할 때 다른 부분의 코드를 수정해야하는 경우를 일컫고, 느슨한 결합은 코드의 한 부분을 수정해야 할 때 다른 부분의 수정이 매우 적거나 거의 없는 경우를 일컫는다. 관련성이 강한 부분은 강하게 결합되고, 관련성이 적은 부분은 느슨하게 결합되는 것이 일반적으로 바람직하다. DI와 IoC는 지나치게 강한 결합을 가진 코드의 문제점을 해결하기 위해 사용될 수 있는 개념이다.
지나치게 강한 결합을 가진 코드는 어떤 문제점이 있을까? 우선 코드의 한 부분을 수정하면 관련성이 적은 다른 부분도 다소 수정이 필요하다는 문제점이 있다. 그러면 어떻게 이 부분을 해소할 수 있을까?

Step1. 느슨한 결합을 만드는 원칙들

결합을 느슨하게 하기 위해 참고하는 원칙으로 아래의 두 가지가 있다.

  1. 클래스의 핵심 부분만 유지하고 이외의 부수적 역할(control이라고 한다)(예를 들어 타 클래스의 객체 생성)은 다른 부분에 맡기자 -> Inversion of Control(IoC) 원칙
  2. 상위 레벨 모듈은 하위 레벨 모듈에 의존해서는 안된다. 상위, 하위 레벨 모듈 모두 추상성에 의지해야 한다. 추상화된 것은 구체적인 것에 의존해선 안되고, 구체적인 것은 추상적인 것에 의존해야 한다. -> Dependency Inversion Principle (DIP) 원칙
    출처:https://www.tutorialsteacher.com/ioc/introduction

우선 1번 원칙을 구현하기 위해 클라이언트 객체는 서비스 객체의 생성을 담당하는 factory 객체를 이용해 서비스 객체를 생성할 수 있다. 그리고 2번 원칙을 구현하기 위해 각 서비스 객체는 서비스 인터페이스를 구현하고, 클라이언트 객체는 인터페이스를 통해 각 서비스 객체의 메소드를 수정없이 이용할 수 있다.

step2. 더 느슨하게 만들기-의존성 주입하기

그래도 여전히 클라이언트 클래스는 클래스 내에서 구체적인 서비스 객체를 명시해야 하는 한계점이 있다. step1의 과정을 통해 상당 부분 좋아졌지만 사용할 서비스 클래스가 바뀌면 클라이언트 클래스의 코드를 고쳐야하는 불편함이 있다. 서비스 객체를 사용하는 클라이언트 클래스의 수가 많다면 사용할 서비스 객체 명을 바꾸는 작업만 해도 시간이 오래 걸릴 수 있다.

이때 의존성 주입이 사용된다. 클라이언트 객체가 필요로 하는 객체를 클라이언트 객체가 생성하는 것이 아니라 외부에서 필요 객체를 생성자나 setter 등의 인자를 통해 클라이언트 객체로 주입하는 것이다. 이렇게 되면 나중에 사용할 서비스 클래스 자체나 클래스명 등이 바뀌어도 클라이언트 객체의 코드는 수정할 필요가 없게 된다.

step3. DI Container 이용하기

step2에서 필요 객체를 '외부'에서 클라이언트 객체로 주입한다는 이야기를 했다. 그러면 그 '외부'에 해당하는 주입용 객체나 개발자가 직접 의존 관계와 factory 관리를 해야하기 때문에 의존성 주입은 다소 번거로운 면이 있다. 그래서 의존성 주입을 쉽게 해주는 프레임워크들이 등장했는데 이들을 DI Container라고 부른다. 자바에서는 Spring이 대표적이다.

자료 및 이미지 출처:
https://tecoble.techcourse.co.kr/post/2021-04-27-dependency-injection/
https://www.tutorialsteacher.com/ioc

——————————————————————————

0개의 댓글