스프링 컨테이너
스프링 컨테이너(Spring Container)공식문서
스프링 컨테이너는 스프링 프레임워크의 핵심 컴포넌트이다.
스프링 컨테이너는 자바 객체의 생명 주기를 관리하며, 생성된 자바 객체들에게 추가적인 기능을 제공한다.
스프링에서는 자바 객체를 빈(Bean)이라 한다.
즉, 스프링 컨테이너는 내부에 존재하는 빈의 생명주기를 관리(빈의 생성, 관리, 제거 등)하며,
생성된 빈에게 추가적인 기능을 제공하는 것이다.
스프링 컨테이너는 XML, 어노테이션 기반의 자바 설정 클래스로 만들 수 있다.
스프링 부트(Spring Boot)를 사용하기 이전에는 xml을 통해 직접적으로 설정해 주어야 했지만,
스프링 부트가 등장하면서 대부분 사용하지 않게 되었다.
스프링 컨테이너는 Beanfactory와 ApplicationContext 두 종류의 인터페이스로 구현되어 있음
ApplicationContext 인터페이스를 일반적으로 스프링 컨테이너라고 부름
좀 더 정확하게는 스프링 컨테이너를 말할 때
ApplicationContext가 상속하고 있는 BeanFactory와 구분해서 사용하지만,
BeanFactory를 직접 사용하는 경우는 거의 없기 때문에
일반적으로 ApplicationContext를 스프링 컨테이너라 함
BeanFactory는 스프링 컨테이너의 최상위 인터페이스로 스프링 빈을 관리하고 조회하는 역할을 담당
ApplicationContext는 빈을 관리하고 조회하는 기능뿐 아니라
웹 애플리케이션을 개발하는 데 필요한 다양한 부가 기능들을 함께 제공
AnnotationConfigApplicationContext는
그 구현 객체이며 매개변수로 구성 정보(AppConfigurer.class)를 넘겨주고 있음
스프링 컨테이너는 빈(Bean)의 인스턴스화, 구성, 전체 생명 주기 및 제거까지 관리함
- 컨테이너는 개발자가 정의한 빈을 객체로 만들어 관리하고 개발자가 필요로 할 때 제공한다.
스프링 컨테이너를 통해 원하는 만큼 많은 객체를 가질 수 있음
의존성 주입(DI)을 통해 애플리케이션의 컴포넌트를 관리할 수 있음
스프링 컨테이너는 서로 다른 빈을 연결하여 애플리케이션 빈을 연결하는 역할을 함
- 개발자는 모듈 간에 의존 및 결합으로 인해 발생하는 문제로부터 자유로울 수 있다.
- 메서드가 언제 어디서 호출되어야 하는지, 메서드를 호출하기 위해 필요한 매개 변수를 준비해서 전달하지 않는다. \
스프링 컨테이너를 사용하는 이유
먼저, 객체를 생성하기 위해서는 new 생성자를 사용해야 한다.
그로 인해 애플리케이션에서는 수많은 객체가 존재하고 서로를 참조하게 된다.
객체 간의 참조가 많으면 많을수록 의존성이 높아지게 된다.
이는 낮은 결합도와 높은 캡슐화를 지향하는 객체지향 프로그래밍의 핵심과는 먼 방식이다.
따라서, 객체 간의 의존성을 낮추어(느슨한 결합) 결합도는 낮추고,
높은 캡슐화를 위해 스프링 컨테이너가 사용된다.
또한, 기존의 방식으로는 새로운 기능이 생기게 되면 변경 사항들을 수작업으로 수정해야 한다.
프로젝트가 커질수록 의존도는 높아질 것이고, 그에 따라 코드의 변경도 많아질 것이다.
하지만, 스프링 컨테이너를 사용하면 구현 클래스에 있는 의존성을 제거하고
인터페이스에만 의존하도록 설계할 수 있다.