Spring Container 컨테이너

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

Spring

목록 보기
4/10
post-thumbnail

📌 1. 스프링 IoC 컨테이너


📎 컨테이너란?

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


📎 서블릿 컨테이너란?

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

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

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

📎 스프링 IoC 컨테이너란?

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

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


📎 스프링 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를 더 많이 사용하기 때문이다.


📎 ApplicationContext 특징

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

📎 BeanFactory와 ApplicationContext의 차이점

👉 BeanFactory

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

👉 ApplicationContext

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

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


📖 참고

0개의 댓글