-
@Bean과 @ComponentJava 2023. 11. 24. 12:20
개요
스프링에서 Bean을 생성할 때, @Bean어노테이션과 @Component어노테이션 두 개를 사용하는데, 둘의 차이점이 뭘까라는 생각이 들어서 정리해보고자 한다.
@Component
싱글톤 클래스 빈을 생성하는 어노테이션으로 선언적(Declarative) 어노테이션이다. 패키지 스캔안에 선언적으로 어노테이션을 작성함으로서 "해당 클래스를 정의했으니 빈으로 등록해줘" 라는 뜻이다.
@Component어노테이션은 클래스에 붙여서 해당 클래스를 스프링 빈으로 등록할 때 사용된다.
일반적으로 클래스에 직접 사용하며, 해당 클래스의 객체가 스프링 컨테이너의 빈으로 등록된다.@Component 어노테이션은 컴포넌트 스캔(Component Scan)과 함께 사용되어 클래스를 자동으로 스프링 빈으로 인식하게 만든다.
@Component public Class ExampleComponent { // ... }
@Bean
@Bean 어노테이션은 개발자가 직접 메서드를 작성하여 빈을 정의할 때 사용된다.
일반적으로 @Configuration이 붙은 스프링 설정 클래스 내부에서 메서드에 @Bean을 붙여서 빈을 생성한다.
메서드 내에서 직접 객체를 생성하고 반환하는 객체는 스프링 컨테이너에 빈으로 등록이 된다.
@Configuration public class AppConfig { @Bean public ExampleBean exampleBean() { return new exampleBean(); } }
위와 같이 리턴되는 객체로 빈을 생성하기 때문에 인터페이스를 사용해서 유연하게 처리가 가능하게 된다.
정리
@Bean은 메서드 단위로 빈을 정의하고, 개발자가 직접 만든 메서드에서 반환되는 객체가 스프링 빈에 등록이 된다.
@Component는 클래스 단위로 빈을 정의하고, 스프링이 해당 클래스를 스캔해서 빈으로 등록한다.
일반적으로 @Bean은 설정 클래스에서 사용되고, @Component는 일반적인 컴포넌트 클래스에서 사용된다.
@Component을 쓰기 곤란한 타사 라이브러리 클래스를 빈에 등록할 때도 @Bean어노테이션을 통한 메서드를 통해 등록할 수 있다.
참고자료
https://velog.io/@composite/Spring-Component-Bean-%EC%95%8C%EA%B3%A0-%EC%93%B0%EA%B8%B0
https://medium.com/sjk5766/bean%EA%B3%BC-component-%EC%B0%A8%EC%9D%B4-96a8d0533bfd'Java' 카테고리의 다른 글
@Transactional은 모든 예외에 rollback이 될까? (0) 2023.11.29 Java 입출력 Scanner와 BufferedReader (0) 2023.11.26 객체지향 5원칙 SOLID (1) 2023.11.23 @Transactional이란 무엇인가 (0) 2023.11.22 생성자 주입(Constructor Injection)을 권장하는 이유 (1) 2023.11.20