스프링 컨테이너를 위한 IOC와 DI 개념

큰모래·2023년 3월 16일
0
post-custom-banner

이전글

https://velog.io/@on8214/WAS-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC

서론

이전글에서 WAS에 대한 개념을 정리하면서 필연적으로 서블릿 컨테이너에 대한 개념을 짚고 넘어갔어야 했고 간단하게 정리했다. 이제는 스프링 컨테이너에 대한 이해가 필요한 시간이다. 하지만 스프링 컨테이너의 핵심 기술인 IOC와 DI에 대한 지식이 부족하므로 기록하면서 정리해보려 한다.


IOC (제어의 역전)

IOC(Inversion of Control)는 객체의 생성부터 소멸까지 객체의 모든 생명주기를 개발자가 아닌 컨테이너가 담당하는 것을 의미합니다.
왜 명칭을 제어의 역전이라고 부르는 것일까?? 그 이유는 통상 제어를 담당하던 개발자가 제어를 맡은 것이 아닌 컨테이너라는 객체를 관리하는 모듈?이 제어를 맡았기에 명칭 그대로 제어의 역전이라 부릅니다.

서블릿 컨테이너 동작 흐름

  1. 클라이언트가 WAS 웹서버에 request한다.
  2. WAS의 서블릿 컨테이너에서는 클라이언트의 요청별로 쓰레드를
    생성하고 요청 URL에 매핑된 서블릿 객체를 만들어 실행한다.
  3. 실행하여 나온 응답 결과를 서블릿 컨테이너에서 WAS의 웹 서버에 전달한다.
  4. WAS에서는 클라이언트에 응답 결과를 최종 전달한다.

개발자가 이러한 작업을 직접하지 않고 코드를 짜놓으면 컨테이너가 알아서 동작한다. IOC는 서블릿 컨테이너뿐만 아니라 스프링 컨테이너 역시 적용되어 있다. 흔히 스프링 컨테이너를 IOC 컨테이너라 부르는 듯 하다.

내가 예전에 만들었던 예시 코드이다.
나는 컨트롤러나 서비스를 구현하고 선언만했을뿐이다. 이러한 컨트롤러,서비스 등의 객체가 생성되고 호출되는 것은 IOC 컨테이너가 알아서 할일이다.

근데 뭔가 갑자기 IOC 개념과 DI 개념에 대해 "둘이 뭔가 비슷한 것 같은데??" 라는 생각이 들었다. 찾아보니 DIIOC 개념을 구현하기 위한 디자인 패턴으로 생각하면 된다고 한다.

그러면 이 IOC를 구현하는 DI에 대해 알아보자


DI (의존성 주입)

DI(Dependency Injection)는 컨테이너에서 관리할 객체를 지정하고, 코드내에서는 컨테이너에서 객체를 받아 사용하는 방식이다.

스프링 컨테이너는 IOC를 적용해 어플리케이션 작동 과정에서 필요한 여러 객체들을 알아서 관리(생성,삭제)해준다. DI는 개발자가 컨테이너에서 관리될 객체를 지정할 때 의존할 객체를 지정해주는 작업이다.


만약 A클래스와 B클래스가 있고 A클래스 내부에서 B클래스의 객체를 만들었을때A클래스는 B클래스에 의존하게 된다. 개발자는 A클래스 객체를 생성해서 사용하려면 B클래스 객체도 같이 만들어서 A클래스에 주입해줘야된다.

// A가 B를 의존하는 관계
class A {
	B b = new B();
}

스프링을 예시로 들어보면 스프링 컨테이너에서 이 의존관계를 미리 스프링 빈(Bean)으로 등록한다. 이때 개발자가 A클래스 객체를 요청하면 컨테이너에서 자동으로 B클래스 객체도 생성해 A클래스에 주입한 뒤, 개발자에게 전달해준다. 이를 의존성 주입 (DI)라고 부릅니다.


// 여전히 A는 B에 의존하고 있다.
// 하지만, b 객체를 직접 생성하는 것이 아닌 외부로부터 주입받고 있다.
class A {
	B b;
    
    A(B b) {
    	this.b = b;
    }
}

결론

IOC는 객체를 만들고 삭제하는 생명주기를 개발자가 아닌 IOC 컨테이너가 관리해주는 것이고, 이러한 IOC 개념을 구현한 것 중 하나가 DI이다. DIIOC 컨테이너가 관리하고 있는 객체들을 내가 사용할 곳에 주입해주는 것이다. 이렇게 하면 코드를 변경하지 않고도 객체 간의 의존성을 유연하게 관리할 수 있다.

그러면 DI 말고 IOC 개념을 구현하는 디자인 패턴이 뭐가 있는지 궁금해졌네...


참고

https://velog.io/@rocknzero/%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC%EC%97%90%EC%84%9C-IoC-DI-%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80
https://codevang.tistory.com/241
https://roadofdevelopment.tistory.com/56

profile
큰모래
post-custom-banner

0개의 댓글