@Component란 뭘까?
스프링 컨테이너에 빈을 등록하기 위해서는 @Bean이나 XML의 < bean >을 이용하여 등록할 수도 있지만 수많은 빈을 등록할 때는 매우 비효율적이다.
@Component는 스프링에서 제공되는 Component Scan에 스캔이 이루어질 수 있게 등록하는 방법이다.
등록된 컴포넌트들은 컴포넌트 스캔이 이루어질때 @Component 어노테이션의 여부를 보고 스프링의 빈으로 등록이된다.
그럼 @Bean은 무엇인가
Spring IoC(Inversion of Control) 컨테이너가 관리하는 자바 객체를 빈(Bean)이라고 부른다.
우리가 new 연산자로 어떠한 객체를 생성하였을 때 그 객체는 빈이 아니다.
ApplicationContext.getBean()으로 얻어질 수 있는 객체는 빈이다.
즉 Spring에서의 빈은 ApplicationContext 가 알고있는 객체, 즉 ApplicationContext가 만들어서 그 안에 담고있는 객체를 의미한다.
Spring IoC 컨테이너에 빈(Bean)으로 등록이 되는 방법
@ComponentScan 어노테이션과 @Component 어노테이션을 사용해서 등록하는 방법이다. 간단히 말하면 @ComponentScan 어노테이션은 어느 지점부터 컴포넌트를 찾으라고 알려주는 역할을 하고 @Component 는 실제로 찾아서 빈으로 등록할 클래스를 의미한다.
위와 같이 @Component 어노테이션을 이용해 등록을 하는 방법이 있지만 빈 설정파일에 직접 빈으로 등록할 수 있다.
빈 설정파일은 XML과 자바 설정파일로 작성할 수 있는데 최근 대세는 자바 설정파일을 좀 더 많이 사용한다고 한다.
자바 설정파일은 자바 클래스를 생성해서 작성할 수 있으며 일반적으로 xxxxConfiguration 와 같이 명명한다.
그리고 클래스에 @Configuration 어노테이션을 붙인다. 그안의 메서드에 @Bean 어노테이션을 사용해 직접 빈을 정의한다.
이렇게 직접 정의해서 등록을 하면 @Component 어노테이션을 붙이지 않아도 된다.
@Configuration 어노테이션을 보면 이 어노테이션도 @Component를 사용하기 때문에 @ComponentScan의 스캔 대상이 되고 그에 따라 빈 설정파일이 읽힐때 그 안에 정의한 빈들이 IoC컨테이너에 등록되는 것이다.
즉, @Component 는 @Bean이나 < bean >을 사용하지 않고 ComponentScan에 의해 스캔되어 빈으로 등록 될 수 있게 해주는 요소 정도로 기억하자!
추가적으로 ComponentScan은 Component 이외에도 여러 어노테이션을 조회대상으로 포함하고 부가기능을 수행할 수 있다.
1. @Controller :
스프링 MVC 컨트롤러에서 사용되며, 이 어노테이션을 지정할 시 클라이언트가 요청한 URI를 활용하여 처리한다
2. @Service :
서비스는 특별한 부가기능은 없으나, 개발자들이 핵심 비즈니스 로직에 관한 비즈니스 계층을 인식하는 데 사용한다
3. @Repository :
스프링 데이터 접근 계층으로 인식하여 데이터 계층의 예외를 스프링 예외로 변환시켜준다
4. @Configuration :
스프링 설정 정보로 인식하고 스프링 빈이 싱글톤을 유지하도록 추가 처리를 한다