🖐 들어가기 전에
스프링 빈 (Spring Bean)
- 스프링 컨테이너에 의해 관리되는 자바 객체(POJO)를 의미한다
💡 Spring Bean이 필요한 이유
- Spring Container가 특정 객체의 라이프 사이클을 관리한다는 것을 나타내기 위해 필요하다
스프링 빈(싱글톤 빈)의 생명주기
- 스프링 컨테이너 생성
- 스프링 빈 생성
- 의존 관계 주입
- 초기화 콜백
- 사용
- 소멸 전 콜백
- 스프링 종료
스프링 컨테이너 (Spring Container)
- Spring Container 또는 IoC Container라고도 한다
- 설정 파일을 읽어서 Bean 정보를 읽고 저장 및 관리하는 역할을 한다
- 스프링 컨테이너는 스프링 빈의 생명 주기를 관리하며, 생성된 스프링 빈들에게 추가적인 기능을 제공하는 역할을 한다
- IoC(제어의 역전)와 DI(의존성 주입)의 원리가 스프링 컨테이너에 적용된다
- DI(의존성 주입) : 객체 의존관계를 외부에서 넣어주는 것
- 생성자에 @Autowired 가 있으면 Spring이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어준다
- 개발자는 new 연산자, 인터페이스 호출, 팩토리 호출 방식으로 객체를 생성하고 소멸하지만, 스프링 컨테이너를 사용하면 해당 역할을 대신해준다
- 즉, 제어의 흐름(IoC)을 외부(Spring)에서 관리하게 된다
- 또한 객체들 간의 의존 관계를 스프링 컨테이너가 런타임 과정에서 알아서 생성한다
Spring 컨테이너가 Bean을 관리할 때의 장점
- 의존성을 자동 주입하여 해당 의존성을 사용하는 로직에만 집중이 가능하다
- 즉, 개발자가 객체 간의 의존 관계를 신경쓰지 않고 오직 로직에만 집중이 가능하다
- 의존성을 주입할 때 사용되는 객체가 싱글 오브젝트, 즉 항상 동일한 객체임을 보장할 수 있다
🍃 Spring Bean 등록 방식
1) Component Scan
- Component Scan은 @Component를 명시하여 빈을 추가하는 방법이다
- 클래스 위에 @Component를 붙이면 스프링이 자동으로 스프링 컨테이너에 빈을 등록한다
📌 Component Scan의 대상
- @Component 외에 @Controller, @Service, @Repository, @Configuration은 @Component의 상속을 받고 있어 모두 Component Scan의 대상이 된다
- @Controller : 스프링 MVC 컨트롤러로 인식된다
- @Service : 특별한 처리는 하지 않으나, 개발자들이 핵심 비즈니스 계층을 인식하는데 도움을 준다
- @Repository : 스프링 데이터 접근 계층으로 인식하고 해당 계층에서 발생하는 예외는 모두 DataAccessException으로 변환한다
- @Configuration : 스프링 설정 정보로 인식하고 스프링 빈이 싱글톤을 유지하도록 추가 처리를 한다 (만약 스프링 빈 스코프가 싱글톤이 아니라면 추가 처리를 하지 않는다)
2) Java 코드로 등록 (설정 파일 이용)
@Configuration
public class AppConfig {
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
}
- 클래스를 생성하고 @Configuration 어노테이션을 활용한다
- 이 때 빈을 등록하기 위해 인스턴스를 생성하는 메소드 위에 @Bean을 명시하면 된다
- @Configuration에는 @Component가 포함되어 있기 때문에 Component Scan의 대상이 되어 자동 스캔을 통해 빈 등록이 가능하다
3) 수동 등록
public class Main {
public static void main(String[] args) {
final ApplicationContext beanFactory = new AnnotationConfigApplicationContext(AppConfig.class);
final AppConfig bean = beanFactory.getBean("appConfig", AppConfig.class);
}
}
- 거의 사용되지 않지만, ApplicationContext를 호출하여 수동으로 설정 파일을 통해 빈을 등록할 수 있다
🤔 Bean vs Component
- @Bean과 @Component 모두 스프링 빈으로 등록되게 하고 스프링에 의해 관리되도록 한다
- 그러나 이 둘은 각자 선언할 수 있는 타입이 정해져있어 해당 용도 외에는 컴파일 에러를 발생시킨다
@Bean
- 메소드 레벨에서 선언하며, 반환되는 객체(인스턴스)를 개발자가 수동으로 Bean으로 등록하는 어노테이션이다
- METHOD(함수 단위), ANNOTATION_TYPE(어노테이션 단위)에 사용한다
- 개발자가 컨트롤이 불가능한 외부 라이브러리들을 Bean으로 등록하고 싶은 경우에 사용된다
- 개발자가 생성한 Class에는 @Bean 선언이 불가능하다
- 해당 클래스의 객체를 반환하는 메서드를 만들고, 메서드에 @Bean을 선언하여 등록한다
- 즉, 메소드의 반환 값이 바로 Bean으로 등록되는 것이다
- 외부 라이브러리 또는 이미 정의되어 있는 객체들이 서로 종속성을 갖는 경우 Bean 등록에 사용하는 어노테이션이다
- 이미 정의된 기본 객체를 재정의하거나 내가 만든 객체의 종속성을 위해 빈을 등록할 때 사용한다
- 즉, 메소드 단위에서 개발자가 외부 라이브러리 및 개발자가 정의하지 않은 객체를 유연하게 넘기기 위해 사용하는 어노테이션이다
@Component
- Component의 정의 : 구성 요소 / 독립적인 단위 모듈로, 사용자가 사용하는 시스템에 대한 조작장치를 의미한다
- 클래스 레벨에서 선언하며, 스프링이 런타임 시에 컴포넌트 스캔을 하여 자동으로 Bean을 찾고 등록하는 어노테이션
- Class 타입, Interface 타입, Enum 타입 등에 선언 가능하다
- 개발자가 직접 컨트롤이 가능한 Class들의 경우에 사용된다
- 이 어노테이션은 선언적(Declarative)인 어노테이션으로, "클래스를 정의했으니 빈으로 등록해줘!"라는 뜻이 된다
- @Component는 Class와 Bean이 일대일 관계를 갖는다
- @ComponentScan 의 대상이 되는 어노테이션으로, 스프링 컨테이너의 관리 대상이 되고 Bean으로 등록된다
- @Controller, @Service, @Repository 모두 @Component를 내장하고 있다
📌 정리
- 설정 파일을 통해 Bean을 관리해야 할 때, 설정 파일에 해당하는 클래스 내 메서드에 @Bean 어노테이션을 사용할 수 있다
- 간단하게 어노테이션 기반으로 Bean을 등록하고 싶으면 @Component 를 이용해서 스프링에게 등록을 요구할 수 있다
💡 [참고] @SpringBootApplication
- @SpringBootApplication도 마찬가지로, @Configuration과 @ComponentScan을 상속받고 있다
- 덕분에 Spring이었다면 구성하기 위해 신경써야 했던 설정 파일을 Spring Boot에서는 신경쓰지 않고 @Bean, @Component를 사용할 수 있는 것이다
참고)
https://jojoldu.tistory.com/27
@Bean vs @Component
Spring으로 개발을 하다보면 @Bean과 @Component를 언제 써야할지 헷갈릴때가 있다. 둘다 목적이 명확하지 않은 Bean을 생성할때 사용하는 어노테이션인데 왜 2개로 나누어져있나 궁금했었는데, 박재성
jojoldu.tistory.com
https://youngjinmo.github.io/2021/06/bean-component/
Bean과 Component 차이
스프링은 개발의 제어권이 스프링 컨테이너(IoC 컨테이너)에 있다고 한다. 그래서 이를 IoC(Inversion Of Control), 제어의 역전이라고 한다. 스프링이 개발자 대신 객체를 제어하기 위해서는 객체들이
youngjinmo.github.io
https://unequaled-peach-7e5.notion.site/27967c9ff2624ed2bebc298d0dcfc7a0
컴포넌트와 빈의 차이
🌹 정리 by 장미(https://velog.io/@newbiekim/)
unequaled-peach-7e5.notion.site
https://github.com/InJun2/TIL/blob/main/Stack/Spring/Bean-Component.md
GitHub - InJun2/TIL: todo-list
todo-list. Contribute to InJun2/TIL development by creating an account on GitHub.
github.com
https://steady-coding.tistory.com/594
[Spring] Spring Bean 총 정리
spring-study에서 스터디를 진행하고 있습니다. 스프링 빈이란? 스프링 빈은 스프링 컨테이너에 의해 관리되는 자바 객체(POJO)를 의미한다. 스프링 컨테이너 스프링 컨테이너는 스프링 빈의 생명 주
steady-coding.tistory.com
@Component, @Bean 차이점
스프링 컨테이너 스프링 컨테이너는 설정 파일을 읽어서 빈 정보를 읽고 저장/관리한다. Configuration / Bean 빈 설정은 xml 방식과 java Config 방식이 있다. xml 방식, java Config 방식 모두 빈을 명시해야
www.blog.ecsimsw.com
'야미스터디 > Spring' 카테고리의 다른 글
[Spring] Dispatcher Servlet 📌 (0) | 2022.09.20 |
---|---|
[Spring] Spring vs EJB 📌 (1) | 2022.09.20 |
[Spring] maven vs gradle 📌 (0) | 2022.08.18 |
[Spring] Spring Servlet 📌 (0) | 2022.08.13 |
[Spring] Spring vs Spring Boot 📌 (0) | 2022.08.02 |
댓글