코드 그라데이션

스프링 Bean과 Component 본문

Spring/개념 정리

스프링 Bean과 Component

완벽한 장면 2023. 1. 16. 07:49

빈(Bean)

- 애플리케이션에서 빈(Bean)이라는 이름으로 객체를 미리 생성해놓고 돌려쓰는것을 얘기한다.

(한번만 생성하고 쓰레드들이 다같이 쓴다. = 싱글톤)

 

즉, 스프링앱에 여러 번 빈을 요청하더라도 매번 동일한 객체를 돌려준다는 것이다. (스프링이 빈을 관리한다.)

 

이유

: 애플리케이션 컨텍스트(컨테이너) 가 싱글톤으로 빈을 관리하는 이유는 대규모 트래픽을 처리할 수 있도록 하기 위함.

(메모리는 한정적이기 때문)

 

컴포넌트(Component) 

: 개발자가 직접 작성한 Class를 Bean으로 등록한 것

  (Bean 과 동일하게 한번만 생성하고 쓰레드들이 다같이 쓰게 하려고)

  • **@Component** 는 개발자가 지금 개발중인 직접 컨트롤이 가능한 클래스들의 경우 Bean으로 등록하기 위해 사용된다.
  • **@Bean**의 경우 개발자가 컨트롤이 불가능한 외부 라이브러리들을 Bean으로 등록하고 싶은 경우 에 사용된다.
  • 라이브러리에 있는 클래스에 **@Component**를 선언할 수는 없기 때문에 인스턴스를 생성하고 해당 메소드에 @Bean을 붙여주어 빈(Bean)으로 등록한다.

그럼 개발자가 생성한 Class에 @Bean은 선언이 가능할까? 정답은 No!

@Bean과 @Component는 각자 선언할 수 있는 타입이 정해져있어 해당 용도외에는 컴파일 에러를 발생시킨다.

 

 

스프링과 제어

- 스프링은 개발의 제어권이 스프링 컨테이너(IoC 컨테이너)에 있다고 한다. 그래서 이를 IoC(Inversion Of Control), 제어의 역전이라고 한다.

- 스프링이 개발자 대신 객체를 제어하기 위해서는 객체들이 빈(Bean)으로 등록되어있어야 한다. 과거에는 객체를 빈으로 등록하기 위해 XML로 지정했어야 한다고 하는데, 요즘엔 애노테이션으로 간단하게 등록할 수가 있다.

 

@Bean vs @Component

- @Bean은 메소드 레벨에서 선언하며, 반환되는 객체(인스턴스)를 개발자가 수동으로 빈으로 등록하는 어노테이션.

- @Component는 클래스 레벨에서 선언함으로써 스프링이 런타임시에 컴포넌트스캔을 하여 자동으로 빈을 찾고(detect) 등록하는 어노테이션

- @Bean은 개발자가 컨트롤이 불가능한 외부 라이브러리들을 Bean으로 등록하고 싶은 경우에 사용한다.

- 해당 클래스의 객체를 반환하는 메서드를 만들고, 메서드에 @Bean을 선언하여 등록한다.

- @Component는 개발자가 직접 컨트롤할 수 있는 클래스에 사용한다. 개발자가 컨트롤 할 수 있는 클래스는 개발자가 만든 클래스를 의미하며, 컨트롤러 등에 사용하는 클래스

 

 

 

참고 : https://youngjinmo.github.io/2021/06/bean-component/

https://velog.io/@albaneo0724/Spring-%EC%8A%A4%ED%94%84%EB%A7%81-Bean%EA%B3%BC-Component%EC%9D%98-%EC%B0%A8%EC%9D%B4

 

728x90
Comments