들어가면서..
Spring 하면 떠오르는 3 대장 IoC, DI, POJO가 있다. 이 중에서도 핵심 of 핵심 IoC 컨테이너가 무엇인지 오늘 알아보려고 한다.
우선 IoC 컨테이너가 무엇인지 알아보기에 앞서 컨테이너가 무엇인지부터 살펴보도록 하자.
컨테이너란?
한 가지 예시로 우리가 컴퓨터를 조립하는 회사에 다닌다고 하자.
고객에게 주문서가 들어오면 우리는 주문서대로 컴퓨터를 만들기 위한 부품들을 박스에 담게 되는데 그것을 컨테이너라고 한다.
마찬가지로 우리가 스프링을 사용할 때 만들어야 할 주문서대로 객체를 담아야 하는데, 소프트웨어상 그 객체들을 담는 공간을 일반적으로 컨테이너라고 한다.
그리고 컨테이너는 보통 인스턴스의 생명주기를 관리, 생성된 인스턴스들에게 추가적인 기능을 제공하도록 하는 것이다.
SpringMVC를 사용 중이라면 자주 만나는 용어가 Servlet Container(서블릿 컨테이너)와 IoC Container (IoC 컨테이너 혹은 Spring Container, DI Container라고도 불린다 여기선 IoC Container로 통일해서 사용하겠다)이다.
여기서는 IoC Container에 대해 설명할 예정이므로 Servlet Container가 궁금하다면 여기를 보면 된다.
IoC 컨테이너란?
Inversion of Control의 줄임말로 한글로 번역하면 제어의 역전이라고 한다.
"제어의 역전"이라는 의미는 말 그대로 메소드나 객체의 호출 작업을 개발자가 결정하는 것이 아니라,
외부에서 결정되는 것을 의미한다.
이 방식은 대부분의 프레임워크에서 사용하는 방법으로, 개발자는 필요한 부분을 개발해서 끼워 넣기의 형태로 개발하고 실행하게 된다.
프레임워크가 이러한 구조를 가지기 때문에, 개발자는 프레임워크에 필요한 부품을 개발하고 조립하는 방식의 개발을 하게 된다.
이렇게 조립된 코드의 최종 호출은 개발자에 의해서 제어되는 것이 아니라, 프레임워크의 내부에서 결정된 대로 이뤄지게 되는데, 이러한 현상을 "제어의 역전"이라고 표현한다.
💡 여기서 잠깐! 자바와 스프링의 객체가 생성 및 실행되는 순서를 비교해보면 다음과 같다.
자바
1. 객체 생성
2. 의존성 객체 생성 (클래스 내부에서 생성)
3. 의존성 객체 메소드 호출
스프링
1. 객체 생성
2. 의존성 객체 주입 (스스로 만드는 것이 아니라, 제어권을 스프링에게 위임하여 스프링이 만들어 놓은 객체를 주입한다)
3. 의존성 객체 메소드 호출
따라서 스프링이 모든 의존성 객체를 스프링이 실행될 때 다 만들어주고 필요한 곳에 주입시켜줌으로써 Bean들은 싱글톤 패턴의 특징을 가지며, 제어의 흐름을 사용자가 컨트롤하는 것이 아니라 스프링에게 맡겨 작업을 처리하게 된다.
IoC 컨테이너의 종류
IoC 컨테이너의 종류로는 BeanFactory와 ApplicationContext로 나뉜다.
① BeanFactory
BeanFactory는 IoC Container의 기본이 되는 인터페이스인데(IoC컨테이너 == BeanFactory),
Bean을 관리하는 역할을 하는 인터페이스이다.
② ApplicationContext
ApplicationContext는 BeanFactory를 상속받고 있기 때문에 BeanFactory와 같은 기능을 한다고 볼 수 있다.
또한 BeanFactory 외에도 다양한 클래스들을 상속받고 있기 때문에 더 많은 기능을 제공하고 있기 때문에
주로 Spring 프로젝트의 대부분은 ApplicationContext을 통해 Bean(스프링 객체)을 관리한다.
💡 여기서 잠깐! BeanFactory 보다 더 추가적으로 제공하는 기능
1. 국제화가 지원되는 텍스트 메시지를 관리해 준다.
2. 이미지 같은 파일 자원을 로드할 수 있는 포괄적인 방법을 제공해준다.
3. 리너스로 등록된 빈에게 이벤트 발생을 알려준다.
[ Reference ]
https://docs.spring.io/spring-framework/docs/current/javadoc-api/
https://jjunii486.tistory.com/84
'Spring' 카테고리의 다른 글
[JPA] @Transactional 멀티스레드 테스트 및 동시성 이슈 돌파 (0) | 2024.03.11 |
---|---|
[Spring] 스프링 빈(Bean)이란? (0) | 2021.09.24 |
[Spring] MVC 패턴 & Spring MVC Architecture & Spring 설정 파일 (0) | 2021.09.06 |
댓글