📝 스프링 컨테이너와 빈 에 추가적으로 학습한 내용
스프링 컨테이너
: 빈(bean)들의 생명주기(생성, 관리, 소멸)를 관리하는 것
- IoC 컨테이너, DI 컨테이너, 외의 컨테이너들은 넓은 개념에서 다 같은 것을 의미한다.
- 스프링 컨테이너를 통해 빈을 관리하기 위해 IoC(역제어)개념, DI를 사용한다.
ApplicationContext
💡IoC 컨테이너인 BeanFactory의 하위 인터페이스이며, 빈의 생명주기를 관리하는 기본적인 기능만 가진 BeanFactory에 추가적인 부가 기능을 가지고 있어 주로 사용되고 있는 스프링 컨테이너이다.
BeanFactory는 스프링 컨테이너의 최상위 인터페이스이다.
ApplicationContext는 인터페이스이기 때문에 별도의 구현체가 필요하다.
AnnotationConfigApplicationContext - XML 방식
- 파라미터로 넘어온 설정 클래스 정보를 사용해 스프링 빈을 등록한다.
new AnnotationConfigApplicationContext(구성정보.class)
- DI를 위한 객체를 생성하고 의존성을 주입하는 역할을 한다.

💡 현재 ApplicationContext 구현하여 사용하는 XML방식 보다는 애너테이션 기반 설정을 주로 사용한다.
애너테이션 기반 설정(스프링에게 정보를 전달) : @Configuration, @Bean
빈(Bean)
Java Bean VS Spring Bean
: 두 가지는 엄연히 다른 의미를 가진다.
Java Bean
- 단순하게 클래스에 메서드를 getter/setter만 가지고 있는 클래스를 칭한다.
Spring Bean
- 스프링 컨테이너 관리 하에 있는 객체로 애플리케이션에서 사용된다.
- 설정 정보와 함께 스프링 컨테이너에 등록된 객체
빈 디피니션(Bean Definition)
- 빈 설정 메타정보 인터페이스
- 스프링 컨테이너는 추상화 된 빈 디피니션을 바탕으로 메타정보를 설정한다.
@Configuration 어노테이션을 통해 스프링 설정 클래스를 정의하고 빈들의 정보, 의존성 관계를 스프링에 등록한다.
@빈과 @컴포넌트(👊중요)
둘은 사용되는 레벨이 다르다.
@Bean

- 생성자(메서드)에 단다.
- 개발자가 관여할 수 없는 외부 라이브러리를 빈으로 등록하고 싶은 경우 사용
@Component

- 개발자가 직접 관여할 수 있는 클래스인 경우
- 외부 라이브러리는 개발자가 사용권한이 없기 때문에
@Component를 사용할 수 없다.
스프링 컨테이너 설정
Java기반 컨테이너 설정
: 실행 파일과 같은 위치에 설정 파일(config.class)을 만드는 방법
@Configuration와 @Bean
- @Configuration : 스프링 설정 클래스 정의 어노테이션
- @Bean : 스프링에 해당 메서드를 등록한다.
Component Scan과 자동 의존 관계 설정
: 설정 정보 없이 자동으로 스프링 빈을 등록하는 방법
@ComponentScan
- @ComponentScan 자동으로 스프링 빈에 등록해준다.
- @Component 어노테이션이 포함되어 있지 않으면 스캔되지 않는다.
@Component
- @Component는 다음 어노테이션을 포함한다.
- @Controller
- @Service
- @Repository
- @Configuration
💡 스프링 컨테이너는 실제로 동작할 때 의존되어야 하는 작은 객체부터 의존하는 큰 객체 순으로 생성한다. 그렇기 때문에 @Component를 전반적으로 사용하는 것 보다 스프링이 바로 인지할 수 있도록 @Controller, @Service, @Repository를 사용하는 것을 권장한다.