https://velog.io/@on8214/WAS-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC
이전글에서 WAS
에 대한 개념을 정리하면서 필연적으로 서블릿 컨테이너에 대한 개념을 짚고 넘어갔어야 했고 간단하게 정리했다. 이제는 스프링 컨테이너에 대한 이해가 필요한 시간이다. 하지만 스프링 컨테이너의 핵심 기술인 IOC와 DI에 대한 지식이 부족하므로 기록하면서 정리해보려 한다.
IOC(Inversion of Control)
는 객체의 생성부터 소멸까지 객체의 모든 생명주기를 개발자가 아닌 컨테이너가 담당하는 것을 의미합니다.
왜 명칭을 제어의 역전
이라고 부르는 것일까?? 그 이유는 통상 제어를 담당하던 개발자가 제어를 맡은 것이 아닌 컨테이너라는 객체를 관리하는 모듈?이 제어를 맡았기에 명칭 그대로 제어의 역전이라 부릅니다.
- 클라이언트가 WAS 웹서버에
request
한다.- WAS의 서블릿 컨테이너에서는 클라이언트의 요청별로 쓰레드를
생성하고 요청 URL에 매핑된 서블릿 객체를 만들어 실행한다.- 실행하여 나온 응답 결과를 서블릿 컨테이너에서 WAS의 웹 서버에 전달한다.
- WAS에서는 클라이언트에 응답 결과를 최종 전달한다.
개발자가 이러한 작업을 직접하지 않고 코드를 짜놓으면 컨테이너가 알아서 동작한다. IOC
는 서블릿 컨테이너뿐만 아니라 스프링 컨테이너 역시 적용되어 있다. 흔히 스프링 컨테이너를 IOC 컨테이너라 부르는 듯 하다.
내가 예전에 만들었던 예시 코드이다.
나는 컨트롤러나 서비스를 구현하고 선언만했을뿐이다. 이러한 컨트롤러,서비스 등의 객체가 생성되고 호출되는 것은 IOC 컨테이너가 알아서 할일이다.
근데 뭔가 갑자기
IOC
개념과DI
개념에 대해 "둘이 뭔가 비슷한 것 같은데??" 라는 생각이 들었다. 찾아보니DI
는IOC
개념을 구현하기 위한 디자인 패턴으로 생각하면 된다고 한다.
그러면 이 IOC
를 구현하는 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
이다. DI
는 IOC
컨테이너가 관리하고 있는 객체들을 내가 사용할 곳에 주입해주는 것이다. 이렇게 하면 코드를 변경하지 않고도 객체 간의 의존성을 유연하게 관리할 수 있다.
그러면 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