Spring DI/IoC는 어떻게 동작하나요?
어떻게 동작하는지 알기 전에 얘네가 무엇인지를 먼저 알아야 하는데
DI(Dependency Injection)/IoC(Inversion of Control)란?
DI는 말 그대로 '의존성 주입'이고, IoC는 '제어의 역전'이다.
Spring 프레임 워크를 사용하기 전에 쌩 자바로 코딩을 하면 무언가(메서드나 객체)를 가져다 쓸 때 그 무언가가 있는 라이브러리 등을 가져다 쓴다고 미리 알려주고 써야된다.
예를 들면 자바 프로그램은 main() 에서부터 시작을 하는데 그 안에 있는 애들을 어디서 가지고 와서 사용하는지 명시해줘야 한다.
IoC는 이렇게 메서드나 호출 작업을 개발자가 결정하는 것이 아니라 외부에서 결정되는 것을 의미한다!
- 객체 지향 언어에서 Object 간의 연결 관계를 런타임에 결정
- 객체 간의 관계가 느슨하게 연결됨(loose coupling)
- IoC의 구현 방법 중 하나가 DI(다른 하나는 DL(Dependency Lookup))
그니까 Spring이 개발자가 할 일의 일부분을 대신 해주니까 편한거임
DI는 IoC가 일어날 때 Spring이 내부에 있는 객체들 간의 관계를 관리할 때 사용하는 기법이다.
자바에서는 일반적으로 인터페이스를 이용해서 의존적인 객체의 관계를 최대한 유연하게 처리할 수 있도록 한다.
- Object에 lookup 코드를 사용하지 않고 컨테이너가 직접 의존 구조를 Object에 설정할 수 있도록 저징해주는 방식
- Object가 컨테이너의 존재 여부를 알 필요가 없음
- Setter 주입과 Constructor 주입이 있음
DI는 유연하게 확장 가능한 객체를 만들어 두고 객체 간의 의존관계는 외부에서 다이나믹하게 설정함!
이런 DI를 통해서 모듈 간의 결합도를 낮추고 유연성을 높일 수 있다. 그렇기에 당연히 코드의 재사용성이 높아지고, 가독성이 좋아짐
Spring Bean이란 무엇인가요?
Spring에서는 객체를 Bean이라 부른다.
여기서 객체는 보통의 자바 객체 POJO(Plain Old Java Object, 게터와 세터같은 기본적인 기능만 가지고 있는 Java 객체)를 말함
자바의 보통 객체가 스프링 컨테이너에 의해서 관리되면 그게 스프링 빈이 되는거임!
(스프링 컨테이너란 프로젝트가 실행될 때 사용자가 Bean으로 관리하는 객체들의 생성과 소멸에 관련된 작업을 자동적으로 수행해주는데, 이때 객체가 생성되는 곳을 스프링에서는 스프링 빈 컨테이너라고 함)
Spring Bean의 생성 과정은?
Spring Bean은 객체 생성 -> 의존 설정 -> 초기화 -> 사용 -> 소멸 순서의 생성 주기를 가진다.
스프링 컨테이너가 초기화될 때 빈 객체를 설정 정보에 맞추어 생성하고, 의존 관계를 설정한 뒤에 해당 프로세스가 완료되면 빈 객체가 지정한 메소드를 호출해 소멸 과정을 진행함
Spring Bean의 Scope란?
말 그대로 빈의 범위이다. 빈이 사용되어지는 범위???
예를 들면 빈을 한개만 만들어서 그 한개로 여러 개의 인스턴스를 만들어서 사용할 것인지(Singleton, 싱글톤), 매번 사용할 때마다 빈을 생성해서 쓸 것인지(Prototype, 프로토타입) 등이 있다. 얘네는 스프링 설정에서 설정해줄 수 있음!
- 싱글톤: 기본 스코프, 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프이다.
- 프로토타입: 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프이다.(따라서 빈 콜백중 종료메서드가 호출이 안된다.)
- 웹 관련 스코프
- request: 웹 요청이 들어오고 나갈때 까지 유지되는 스코프이다.
- session: 웹 세션이 생성되고 종료될 때 까지 유지되는 스코프이다.
- application: 웹의 서블릿 컨텍스와 같은 범위로 유지되는 스코프이다.
IoC 컨테이너의 역할은?
- 얘는 오브젝트의 생성과 관계 설정, 사용, 제거 등의 작업을 애플리케이션 코드 대신 독립된 컨테이너가 담당
- 컨테이너가 코드 대신 오브젝트에 대한 제어권을 가지고 있어서 IoC라고 부름
- 이렇기 때문에 위에서 언급한 스프링 빈 컨테이너를 IoC 컨테이너라고도 부르는거임!
- Spring에서 IoC를 담당하는 컨테이너에는 BeanFactory, ApplicationContext(BeanFactory에 여러 기능을 추가한 것)가 있음
Spring Bean의 생성부터 소멸까지의 과정을 관리해주는 역할을 한다고 보면 됨!