WeeklyStudy / spring

Spring Core Principles Study
0 stars 0 forks source link

@Component와 @Bean의 차이점은 무엇인가? #1

Open ahah525 opened 1 year ago

ahah525 commented 1 year ago

문제

섹션3, 4에서 자바 코드를 스프링으로 전환하며 @Bean으로 스프링 IoC컨테이너에 빈을 등록하는 예제를 살펴보았다. 스프링 빈을 등록하는 방법에 관하여 @Component@Bean의 차이점과 어떠한 경우에 사용하는지에 대해 알아보자.

관련 섹션

ahah525 commented 1 year ago

1. 컴포넌트 스캔과 자동 의존관계 설정(자동 빈 등록)

  1. 클래스 선언부 위에 @Component 어노테이션을 추가한다.
    • @Component 어노테이션이 붙은 모든 클래스는 스프링 컨테이너에 의해 자동으로 스프링 빈으로 등록된다.
    • @Controller, @Service, @Repository은 모두 @Component를 포함한다.

2. 자바 코드로 직접 스프링 빈 등록(수동 빈 등록)

  1. 자바 설정 클래스를 만들고 @Configuration 어노테이션을 클래스 선언부 위에 추가한다.
    • 싱글톤 보장을 위해 반드시 @Configuraion을 추가해야 한다.
    • XML로 스프링 빈을 등록하는 방법도 있지만 최근에는 거의 사용하지 않는다.
  2. 특정 타입을 리턴하는 메소드를 만들고 메서드 위에 @Bean 어노테이션을 추가한다.

💡@Bean과 @Component의 차이

  1. 선언 위치
    • @Bean은 메소드 레벨에 선언한다.
    • @Component는 클래스 레벨에서 선언한다.
  2. 사용 목적
    • @Bean은 개발자가 컨트롤이 불가능한(외부 라이브러리가 제공하는) 객체를 빈으로 등록하고 싶을 때 사용한다.
      • ObjetMapper를 빈으로 등록하고 싶은 경우, ObjectMapper의 인스턴스를 생성하는 메소드를 만들고 해당 메소드에 @Bean을 선언하여 빈으로 등록한다.
    • @Component는 개발자가 직접 컨트롤이 가능한(내가 직접 만든) 클래스를 빈으로 등록하고 싶을 때 사용한다.

Reference