코드 그라데이션
스프링 Bean과 Component 본문
빈(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/
'Spring > 개념 정리' 카테고리의 다른 글
Lombok 라이브러리에서 자주 사용하는 어노테이션 (0) | 2023.01.30 |
---|---|
의존성 주입과 제어의 역전 (0) | 2023.01.21 |
Anotation의 종류와 지속 기간 (0) | 2023.01.17 |
스프링부트 리다이렉트 종류 / 모듈과 모듈화 (0) | 2023.01.15 |
헷갈리는 어노테이션 정리(1월 초반부) (0) | 2023.01.14 |