[Spring] 스프링 빈(Bean)의 개념과 생성 원리빈(Bean)Spring IoC 컨테이너가 관리하는 자바 객체를 빈(Bean)이라는 용어로 부른다. Show 우리가 new 연산자로 어떤 객체를 생성했을 때 그 객체는 빈이 아니다. ApplicationContext.getBean()으로 얻어질 수 있는 객체는 빈이다. 즉 Spring에서의 빈은 ApplicationContext가 알고있는 객체, 즉 ApplicationContext가 만들어서 그 안에 담고있는 객체를 의미한다. 어떻게 Spring IoC 컨테이너에 빈을 등록할까?빈을 만드는 방법은 다양하지만 기본적으로 크게 두가지 방법이 있다. ① Component Scanning ② 빈 설정파일에 직접 빈을 등록 Component Scan@ComponentScan 어노테이션과 @Component 어노테이션을 사용해서 빈을 등록하도록 하는 방법이다. 간단히 말하면 @ComponentScan 어노테이션은 어느 지점부터 컴포넌트를 찾으라고 알려주는 역할을 하고 @Component는 실제로 찾아서 빈으로 등록할 클래스를 의미한다. Spring IoC 컨테이너가 IoC 컨테이너를 만들고 그 안에 빈을 등록할때 사용하는 인터페이스들을 라이프 사이클 콜백이라고 부른다. 라이프 사이클 콜백 중에는 @Component 애노테이션을 찾아서 이 애노테이션이 붙어있는 모든 클래스의 인스턴스를 생성해 빈으로 등록하는 작업을 수행하는 어노테이션 프로세서가 등록돼있다. Spring Boot 프로젝트에서 @ComonentScan 애노테이션이 붙어있는 클래스가 이에 해당한다. 다음은 Spring의 PetClinic 예제 소스이다. PetClinicApplication 클래스에 @SpringBootApplication 애노테이션이 붙어있는데 이 애노테이션은 내부적으로 @ComponentScan 애노테이션을 사용한다. 이 @ComponentScan 애노테이션은 어디서부터 컴포넌트를 찾아볼 것인지 알려주는 역할을 한다. @ComponentScan이 붙어있는 클래스가 있는 패키지에서부터 모든 하위 패키지의 모든 클래스를 훑어보며 @Component 애노테이션(또는 @Component 애노테이션을 사용하는 다른 애노테이션)이 붙은 클래스를 찾는다. Spring이 IoC 컨테이너를 만들때 위와 같은 과정을 거쳐 빈으로 등록해주는 것이다. Spring의 PetClinic 예제에서 위의 클래스는 @Controller 애노테이션이 붙어있는데 내부적으로 @Component 애노테이션을 사용한다. 즉 OwnerController는 Spring에 의해 IoC 컨테이너에 빈으로 등록된다. 빈 설정파일에 직접 빈을 등록하는 방법위와 같이 @Component 애노테이션을 사용하는 방법 말고도 빈 설정파일에 직접 빈으로 등록할 수 있다. 빈 설정파일은 XML과 자바 설정파일로 작성할 수 있는데 최근 추세는 자바 설정파일을 좀 더 많이 사용한다. 자바 설정파일은 자바 클래스를 생성해서 작성할 수 있으며 일반적으로 xxxxConfiguration와 같이 명명한다. 그리고 클래스에 @Configuration 애노테이션을 붙인다. 그 안에 @Bean 애노테이션을 사용해 직접 빈을 정의한다.
sampleController()에서 리턴되는 객체가 IoC 컨테이너 안에 빈으로 등록된다. 물론 이렇게 빈을 직접 정의해서 등록하면 @Component 애노테이션을 붙이지 않아도 된다. @Configuration 애노테이션을 보면 이 애노테이션도 @Component를 사용하기 때문에 @ComponentScan의 스캔 대상이 되고 그에 따라 빈 설정파일이 읽힐때 그 안에 정의한 빈들이 IoC 컨테이너에 등록되는 것이다. References인프런 - 백기선님의 예제로 배우는 스프링 입문(개정판)을 수강하며 정리한 포스팅입니다. Spring Boot를 사용하면 자연스럽게 Spring Bean을 직접 생성하고 사용할 일이 많아진다. 따라서 우리는 Spring Bean을 생성하는 방법은 당연히 알고 있어야 하고 더 나아가 어떠한 방식으로 등록되는지 알고 있어야 한다. 이 글에서 개발자가 생성하거나 Spring Boot가 제공하는 Spring Bean을 어떻게 사용할 수 있게 되는지 간략하게 알아보도록 하자. 개발자가 직접 Spring Bean을 만드는 방법은 두 가지가 있다.
Spring Bean의 등록그렇다면 개발자가 작성하거나 Spring Boot가 제공하는 Spring Bean은 어떻게 등록되는 것일까? Spring Bean이 등록되는 방법은 두 가지가 있다. Component Scan과 Auto Configuration 방식이다. Component Scancomponent scan 방식은 이름에서 알 수 있듯 이렇게 개발자가 프로젝트를 생성하고
Auto Configurationauto configuration 방식은 Spring Boot가 제공하는 클래스를 Spring Bean으로 등록하는 방법이다.
만약 spring.factories 에 명시된 클래스 정보를 불러오는 부분을 직접 확인해 보고 싶다면
Condition모든 일에 순서가 있듯이 Spring Bean을 생성하는 것도 순서가 있다. Spring Boot는 component scan 이후 auto configuration 순으로 Spring Bean을 초기화한다. 기본적으로 Spring Bean은 Singleton scope를 가지는 단일 객체로 생성이 된다. 그런데 개발자가 이러한 문제를 해결하기 위해서 Spring 4.0부터 맺으며필자는 Multi module 프로젝트를 만들면서 생성한 객체가 참고
|