본문 바로가기
JavaScript/Spring

[Spring framework] 스프링 의존성과 DI

by Alkaloid 2022. 1. 26.
반응형

오늘도 코드로 직접 보면서 공부하기 전에 이론을 알고 가야합니다.

오늘 설명할 것은 의존관계입니다. 우리는 spring framework를 사용중입니다. 스프링의 특징은 객체 생명주기와 의존관계를 컨테이너가 직접 관리 한다는 것입니다. 즉, 컨테이너가 자동으로 관리해주죠. 

이것이. [IoC] 제어의 역전입니다.

 

스프링은 IoC를 크게 두가지 형태로 관리합니다.

DL과 DI.

그럼 각각 무엇일까요? 

DL은 컨테이너가 객체를 생성하면 사용자가 컨테이너에게 객체를 검색하여 사용하는 방법입니다.

이전에 저희가 해봤던 방법이 DL이라고 생각하시면 됩니다.

DI는 객체간 의존관계를 설정파일에 등록된걸 바탕으로 컨테이너가 알아서 처리해 줍니다. 그럼 의존 관계를 바꾸려면? 설정파일만 수정하면 됩니다.

 

그럼 의존관계를 한번 코드로 보겠습니다.

 

아래와 같이 하나의 클래스를 추가합시다.

그후 SamsungTV에서 Sony메소드를 이용해 SonySpeaker기능을 수행하게 하려 합니다.

그러기 위해서는 SamsungTV에서는 SonySpeaker타입의 speaker를 멤버변수로 가지고 있어야 합니다.

SamsungTV 클래스에 해당코드 한줄을 추가해줍니다.

위에서 말씀드렸듯이, 우리는 speaker변수가 SonySpeaker객체를 참조하도록 했습니다.

 

위와 같이 두줄을 추가한 이유는 SonySpeaker에서 [객체 생성]이라는 출력을 보기 위함입니다.

확실히 객체를 생성하고 사용하는지! 보기 위함입니다.

 

 

이때!!! 우리 앞에서 했던걸 생각해 봅시다. 위의 코드는 정상적으로 돌아갑니다. 하지만 문제가 있죠..

무슨 문제일까요?

1. sony가 아닌 다른 speaker로 교체하기 위해서는 메소드를 바꿔야합니다. -> 한번해봤죠? SamsungTV를 쓰다가 LgTV를 쓰고싶을때와 같은 상황입니다.

2. 객체를 두번이나 생성합니다. (바로 위그림에서 말이죠)

 

이런 상황이 발생하는 근본적인 이유는 객체생성코드를 SamsungTV에 작성했기 때문에 나타납니다. 이 문제를 해결하려고 DI를 이용하려 합니다.

 

=>DI는 컨테이너가 객체 사이의 의존관계를 처리하는 것을 의미합니다.

 

반응형