본문 바로가기
백엔드

[Spring] Bean

by 코린이 프로도 2022. 12. 14.
반응형

 SpringBoot 프레임워크를 이용해 개발을 할 때 @Component, @Configuration, @Bean과 같은 어노테이션이 많이 쓰이는데 정작 구분되는 특징들은 잘 모르고 사용했던 것 같다.

 무엇보다 스프링 컨테이너에서 관리되는 bean은 싱글톤으로 동작 하는데, static으로 선언하는 것과의 차이점은 무엇인지 또 thread safe한지 궁금해서 찾아 보다가 Bean부터 정리해보자는 생각으로 글을 쓴다.

 오늘은 @Bean과 @Component, @Configuration 어노테이션에 대해 알아보고 다음 시간에는 static을 제대로 다루기 위해서 알아야할 것이 무엇이 있는지 정리해 봐야겠다.

 

아래 총 정리되어 있는 페이지를 참고했다. (넘 잘나와 있엉)

https://steady-coding.tistory.com/594

 

[Spring] Spring Bean 총 정리

spring-study에서 스터디를 진행하고 있습니다. 스프링 빈이란? 스프링 빈은 스프링 컨테이너에 의해 관리되는 자바 객체(POJO)를 의미한다. 스프링 컨테이너 스프링 컨테이너는 스프링 빈의 생명 주

steady-coding.tistory.com

 

Bean


Spring에서 Bean은 컨테이너에 의해 관리되는 자바 객체(Class)를 의미한다. 

 

Bean은 스프링 컨테이너에 의해 관리되는데, 이렇게 제어의 주체가 Spring에 있는 특성을 'IoC(Inversion of Control)' 제어의 역전이라고 한다. 또 다른 중요한 특성으로 DI(Dependency Injection)이라는 것은 이 Bean을 필요한 곳에 주입하는 것을 뜻한다.

 스프링 컨테이너에 등록된 Bean은 싱글톤으로 동작한다. 다시 말하면, 인스턴스를 1개만 생성하여 사용하는 것이다. 이는 계속해서 new 연산자로 객체를 생성하는 것보다 메모리 낭비를 줄일 수 있는 장점이 있다.

 

 Bean을 생성하고 Spring 프레임워크에 추가하는 방법이 바로 @Component, @Configuration, @Bean과 같은 어노테이션을 사용하는 것이다. 

 

 그럼 이제 하나씩 살펴보자.

@Component, @Configuration

 어노테이션을 클래스나 인터페이스에 붙이면, Component Scan에 의해 base package에서 부터 해당 어노테이션을 모두 찾아 Bean으로 추가한다. @Component를 상속받고 있는 @Service, @Repository, @Configuration 등도 마찬가지이다. 

 Java에서 제공하는 클래스를 사용하는 것이 아니라 본인이 직접 개발한 클래스를 Bean으로 추가하고 싶을 경우에 @Component 어노테이션을 붙인다. 이렇게 Bean으로 추가되면 의존성이 필요한 곳에 주입할 수 있다. 

 

@Component 어노테이션의 경우 그냥 클래스나 인터페이스에 달아주기만 하면 된다. 반면, @Configuration 어노테이션의 경우 주로 설정클래스에 사용되는데 @Bean 어노테이션을 bean으로 등록할 메소드에 달아주면 된다.  

@Configuration
public class Config {

	@Bean
    public Sort<String> bubbleSort() {
    	return new BubbleSort<>();
    }
}

 

 다만 위와같이 사용할 경우 proxy 모드로 bean을 사용하게 되는데 이 bean을 생성하는 과정이 일반 인스턴스를 만드는 과정보다 느리다고 한다.

 

@Configuration 어노테이션에 @Bean 어노테이션을 달았다면, @Component에는 안될까? 

 

된다. 다만 이는 라이트모드(Lite Mode)로 싱글톤과 달리 호출할 때 마다 new로 인스턴스를 새로 생성한다.

@Component
public class Config {
	@Bean
    public Sort<String> bubbleSort() {
    	return new BubbleSort<>();
    }
}

 

그렇다면 이제 마지막으로 궁금해지는 점!

 

위 방법 중 어떤 것을 이용해서 bean을 등록해야 하는지에 관한 것이 있다.

간단하게 차이점을 정리하겠다.

 

@ Component :

  • 위에서 언급했듯이 등록하려는 빈의 클래스 소스코드 편집이 가능한 경우에 사용.
  • class level annotation
  • auto-detection에 걸린다

 

@Bean in @Configuration

  • method level annotation
  • 인스턴스화 하는 코드가 수동으로 작성된다. 
  • 인스턴스 코드와 클래스 정의 구조가 분리되어 있다.
  • 외부 라이브러리, 써드파티 클래스도 빈으로 등록 가능하다. 
  • proxy mode로 bean을 생성하는데 이는 일반 인스턴스를 만드는 과정보다 느리다.
  • 싱글톤을  보장한다.

 

@Bean in @Component

  • 싱글톤을 보장하지 않는다.
  • @Bean in @Configuration 보다 빠르다.

 

결론적으로 용도에 따라 @Component, @Bean in @Configuration 두 가지 사용 방식을 사용할 것 같다. 끝!

반응형

'백엔드' 카테고리의 다른 글

[Spring] static method VS bean  (0) 2022.12.31
[Spring] 싱글톤 컨테이너  (0) 2022.12.21
[Spring] @Transactional  (2) 2022.11.21