2022. 11. 13. 23:44ㆍSpring
이전 포스팅에서 스프링 IoC컨테이너에 대해 알아보았습니다. 그때 간단하게 빈에 대해 언급하고 넘어갔었는데요, 이번 포스팅에서는 스프링 빈에 대해 알아보도록 하겠습니다.
스프링 빈이란? (Spring Bean)
Spring에서 Bean이란 Spring IoC 컨테이너에 의해 관리되는 Java Object를 Bean이라고 하며
Spring에서는 등록되어 있는 Bean을 싱글톤 객체로 생성하여 관리합니다.
Spring IoC 컨테이너는 인스턴스의 생명주기를 관리하며, 생성된 인스턴스들에게 추가적인 기능을 제공하는데 그중 의존성 주입이 있습니다. 의존성 주입을 받으려면 전제조건으로 빈이 되어야 하므로 이번 포스팅에서는 빈을 등록하기 위한 방법들에 대해 살펴보도록 하겠습니다.
코드 중에 new 연산자로 객체를 생성한 경우 그 객체는 Spring IoC 컨테이너에 의해 관리되지 않기 때문에
Bean이라고 할 수 없습니다.
Spring Bean을 Spring IoC Container에 등록하는 방법
[[ 수동으로 직접 빈을 등록하는 방법 ]]
@Bean과 @Configuration 사용
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService() {
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository(){
return new MemoryMemberRepository();
}
}
설정 클래스에 다음과 같이 @Configuration 어노테이션을 붙여주면 됩니다.
@Bean을 사용해 수동으로 빈을 등록해줄 경우 메서드 이름으로 빈 이름이 결정되므로 중복된 빈 이름이 존재하지 않도록 주의해야 하고 @Configuration 안에서 @Bean을 사용해야 싱글톤을 보장받을 수 있습니다.
@Configuration 안에서 @Bean이 빈으로 등록되는 과정
- 스프링 컨테이너는 @Configuration이 붙어있는 클래스를 자동으로 빈으로 등록해두고, 해당 클래스를 파싱 해서 @Bean이 있는 메서드를 찾아서 빈을 생성해줍니다.
@Bean을 사용해 수동으로 빈을 직접 등록해줘야만 하는 상황
- 개발자가 직접 제어가 불가능한 라이브러리를 활용할 때
- 애플리케이션 전범위적으로 사용되는 클래스를 등록할 때
- 다형성을 활용하여 여러 구현체를 등록해주어야 할 때
을 제외하고는 자동 빈 등록 방식을 권장합니다.
[[ 컴포넌트 스캔(Component Scan)을 사용한 자동으로 빈 등록하는 방법 ]]
직접 개발한 클래스를 빈으로 등록하고자 하는 경우 @Component 사용
스프링은 컴포넌트 스캔(Component Scan)을 사용해 @Component 어노테이션이 있는 클래스들을 찾아서 자동으로 빈 등록을 해줍니다.
@Component를 갖는 어노테이션으로 @Controller, @Service, @Repository 뿐만 아니라 @Configuration이 있습니다.
이를 통해 위에서 언급한 '@Configuration 안에서 @Bean이 빈으로 등록되는 과정'을 또다른 방식으로 설명할 수 있습니다. @Configuration 안에 있는 @Component에 의해 설정 클래스가 자동으로 빈으로 등록이 되고, 그래서 @Bean이 있는 메서드를 통해 빈을 등록해줄 수 있었던 것입니다.
💡 정리
스프링은 기본적으로 컴포넌트 스캔을 이용한 자동 빈 등록 방식을 권장합니다. 왜냐하면 클래스에 있는
@Component만 보아도 빈으로 등록되었는지 확인이 가능하기 때문입니다.
그러므로 위에서 @Bean으로 해야 하는 경우를 제외한 대부분의 경우엔 자동 빈 등록 방식을 사용하는 것을 권장합니다.
이번 포스팅에서 Spring Bean을 Spring IoC Container에 등록하는 방법에 대해 알아보았습니다. 이제 Spring IoC 컨테이너가 제공하는 의존성 주입이 가능해졌는데요, 이는 다음 포스팅에서 살펴보도록 하겠습니다.
참고:
https://kim-jong-hyun.tistory.com/14
https://mangkyu.tistory.com/75
https://melonicedlatte.com/2021/07/11/232800.html
https://1-7171771.tistory.com/105
'Spring' 카테고리의 다른 글
[타임리프] Session Id를 html, js에 가져다 쓰는 방법 (0) | 2023.02.08 |
---|---|
[Spring Data JPA] 쿼리 메서드 기능 (0) | 2023.01.26 |
@RequestParam과 @PathVariable 차이 (0) | 2022.11.07 |
스프링IoC 컨테이너 (Feat. 빈(Bean), 빈 스코프(Bean Scope)) (0) | 2022.10.24 |
Spring, Spring boot란? (컨테이너, DI, IoC) (2) | 2022.09.02 |