📝 스프링 컨테이너와 빈 에 추가적으로 학습한 내용
스프링 컨테이너
: 빈(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
를 사용하는 것을 권장한다.