@Bean vs @Configuration vs @Component

Jake·2022년 7월 18일
0

1. @Bean

  • 메소드의 리턴 값이 Spring Container에 등록됨
  • 빈 이름 == 메소드의 이름

When?

보통 다음과 같을 경우들에 사용하게 된다

  1. 외부 라이브러리를 사용할 때
  2. 여러 클래스에서 사용하는 클래스를 등록할 때
  3. 다형성을 활용하여 여러 구현체를 등록할 때

처음 이와 관련된 글인 망나니개발자님의 블로그 글을 읽었을 때는 무슨 말인지 잘 이해가 되지 않았다. 하지만 직접 개발을 하면서 이를 느꼈던 때가 있었는데, 다음과 같은 상황이었다.

  • 모든 컨트롤러들이
  • LocalDateTime의 Json 파싱을 위해 Gson 객체를 사용할 때

이 경우 Gson 객체를 Bean으로 등록하여 사용하는 것이

  • 사용되는 Gson 객체를 한 번에 확인하기 용이하고
  • 유지보수에도 편리하며
  • Gson 객체를 매번 생성하는 오버헤드도 줄일 수 있다

2. @Component

우리가 가장 흔하게 사용하는 @Controller, @Service, @Repository 어노테이션을 까보면, 그 안에 @Component 어노테이션이 들어있다.
그리고 뒤이어 등장할 @Configuration 어노테이션에도 @Component가 적용되어 있다.

  • @Component 어노테이션의 하위 메서드들은 @Bean 어노테이션이 없어도 자동으로 빈으로 등록된다.
  • 이를 보통 자동 빈 등록(컴포넌트 스캔) 이라고 부르며, 사용할 수 있으면 사용하는 것이 권장되는 방식이다.
  • 직접 개발하는 클래스들에 대해서는 이 방식을 사용하고, 외부 라이브러리에 의존하여 생성하는 객체는 수동 빈 등록(@Bean + @Configuration)을 사용하는 것이 일반적이다.

3. @Configuration

  • @Configuration은 보통 설정 클래스에 사용된다.
  • 메서드에 @Bean을 사용하는 수동 빈 등록을 사용할 때는 반드시 해당 메서드가 속한 클래스에 @Configuration을 붙여줘야 한다

Spring Container에 Bean을 등록하는 이유는, 싱글턴 객체의 장점을 활용하기 위함이다.

싱글턴 객체는

  • 어플리케이션 수명 주기 내에서 오직 하나만 존재하며
  • 이로 인해 재활용성이 높고
  • 객체 생성으로 인한 오버헤드를 줄여주는 효과가 있다

따라서 Bean은 싱글턴이 보장되어야 그 진가가 발휘되는 셈인데, @Configuration이 해주는 역할이 바로 이 '보장'이다.

  • @Configuration이 적용되지 않은 클래스의 하위 메서드들은 @Bean을 적용해도 여러번 호출했을 때, 여러 개의 Bean이 생성된다
  • @Configuration이 적용된 클래스의 하위 메서드들은 Spring에서 클래스에 프록시 패턴을 사용하여 Bean이 싱글턴임을 보장해준다.

그러니 @Bean은 꼭 @Configuration과 함께 쓰는 것이 좋다.

profile
Java/Spring Back-End Developer

0개의 댓글