Spring Container 컨테이너

코딩하는 포로리·2022년 2월 19일

Spring

목록 보기
4/10
post-thumbnail

📌 1. 스프링 IoC 컨테이너


📎 컨테이너란?

객체의 생명주기를 관리하며, 생성된 인스턴스들에게 추가적인 기능을 제공하는 것이 컨테이너다. 서블릿 컨테이너, EJB 컨테이너, 스프링 IoC 컨테이너 등 다양한 컨테이너가 존재한다.


📎 서블릿 컨테이너란?

스프링의 동작을 보면 클라이언트 → 웹서버 → 서블릿 컨테이너(Tomcat) → 스프링 IoC 컨테이너 순으로 진행된다.

여기서 서블릿 컨테이너는 말 그대로 서블릿을 담고 관리해주는 컨테이너이다. 서블릿 컨테이너는 구현되어 있는 서블릿 클래스의 규칙에 맞게 서블릿을 관리해주며 요청을 하면 컨테이너는 HttpServletRequest, HttpServletResponse 두 객체를 생성하며 post, get여부에 따라 동적인 페이지를 생성하여 응답을 보낸다.

👉서블릿 컨테이너 관련 포스팅 클릭👈

📎 스프링 IoC 컨테이너란?

IoC는 제어의 역전이라는 의미로, 말그대로 메소드나 객체의 호출작업을 개발자가 정하는 것이 아니라 외부에서 결정하는 것을 뜻한다. 그렇게 된다면 객체의 의존성을 역전시켜 객체 간의 결합도를 줄이고 유연한 코드를 작성할 수 있게 하여 가독성 및 코드 중복과 유지 보수를 편하게 할 수 있다.

스프링 IoC 컨테이너 종류는 총 2가지로 BeanFactory와 ApplicationContext가 있다.


📎 스프링 IoC 컨테이너 특징

  • IoC 컨테이너는 객체의 생성을 책임지고, 의존성을 관리한다.
  • POJO의 생성, 초기화, 서비스, 소멸에 대한 권한을 가진다.
  • 개발자들이 직접 POJO를 생성할 수 있지만 IoC 컨테이너에게 그 권한을 맡긴다. 이로 인해 개발자는 비즈니스 로직에 집중할 수 있게 되었다.
  • 객체 생성 코드가 없으므로 TDD가 용이하다.

📎 IoC 컨테이너와 DI(Dependency Injection)의 관계

IoC를 실제로 구현하는 방법으로서 의존성이 있는 컴포넌트들 간의 관계를 개발자가 직접 코드로 명시하지 않고 IoC 컨테이너를 가진 스프링이 런타임 과정에서 찾아서 연결해준다.


📎 스프링 IoC 컨테이너 생성 과정

  1. 스프링 컨테이너 생성: 비어있는 스프링 컨테이너가 생성된다.
  2. 스프링 빈 등록: 스프링 설정 파일(Java, XML...)을 기반으로 컨테이너에 스프링 빈이 등록된다.
  3. 스프링 빈 의존관계 설정: 스프링 설정 파일(Java, XML...)을 기반으로 스프링 빈의 의존관계를 주입(DI)한다.

📎 IOC 동작 순서

👉 기존의 객체 생성 및 실행 순서

  1. 객체 생성
  2. 클래스 내부에 의존성 객체 생성
  3. 의존성 객체 메소드 호출

👉 스프링에서 IoC기반 객체 생성 및 실행 순서

  1. 객체 생성
  2. 의존성 객체 주입 = 스스로 만드는 것이 아니라 제어권을 스프링에게 위임하여 스프링이 만들어놓은 객체를 주입
  3. 의존성 객체 메소드 호출



📌 2. IoC 컨테이너 종류: Bean Factory와 ApplicationContext


📎 BeanFactory란?

객체를 생성하고, 객체 사이의 런타임 의존관계를 맺어주는 역할을 하는 스프링 컨테이너의 최상위 인터페이스이다.


📎 BeanFactory 특징

  • Bean을 등록, 생성, 조회, 반환 관리를 한다.
  • 팩토리 디자인 패턴을 구현한 것으로 BeanFactory는 빈을 생성하고 분배하는 책임을 지는 클래스이다.
  • Bean을 조회할 수 있는 getBean() 메소드가 정의되어 있다. 보통 getBean()이 호출되면, 팩토리는 의존성 주입(DI)을 이용해 빈을 객체로 만들어 빈의 특성을 설정하기 시작한다. 이것을 빈의 일생이 시작된다고 이야기하기도 한다.
  • 보통은 BeanFactory를 바로 사용하지 않고, 이를 확장한 ApplicationContext를 사용한다.

📎 ApplicationContext

Bean Factory를 포함한 여러 인터페이스들을 상속받은 인터페이스로, 스프링 컨테이너라고 하면 일반적으로 ApplicationContext를 가리킨다. BeanFactory보다 ApplicationContext를 더 많이 사용하기 때문이다.

https://dog-developers.tistory.com/12

📎 ApplicationContext 특징

  • Bean을 등록, 생성, 조회, 반환 관리하는 기능은 BeanFactory와 같다. 결국 빈 팩토리를 상속받았기 때문에 빈 팩토리를 확장한 컨테이너라고 생각하면 좋다.
  • 기본적인 기능은 BeanFactory와 동일하고, 스프링이 제공하는 각종 부가 서비스를 추가로 제공한다.
    • 국제화가 지원되는 텍스트 메시지를 관리해준다.
    • 이미지같은 파일 자원을 로드 할 수 있는 포괄적인 방법을 제공해준다.
    • 리너스로 등록된 빈에게 이벤트 발생을 알려준다.
  • ApplicationContext 종류에는 2가지가 있다. root-applicationContext와 servlet-applicationContext이다.

📎 BeanFactory와 ApplicationContext의 차이점

👉 BeanFactory

처음으로 getBean()이 호출된 시점에서야 해당 빈을 생성한다.

👉 ApplicationContext

컨텍스트 초기화 시점에 모든 싱글톤 빈을 미리 로드한 후 애플리케이션 기동 후에는 빈을 지연 없이 얻을 수 있다. 즉, 미리 빈을 생성해 높아서 빈이 필요할 떄 즉시 사용할 수 있도록 보장하는 것이다.

때문에 대부분의 애플리케이션에서는 빈팩토리 보다는 ApplicationContext를 더 많이 사용한다.


📖 참고

0개의 댓글