스프링 빈이란?
스프링 빈이란 스프링 컨테이너에서 관리되는 자바 객체를 말한다.
일반적으로 우리가 new를 통해 생성하는 자바 객체와 달리 스프링 빈은 스프링 컨테이너에 의해 생성되고 관리되어지는 객체를 말한다.
스프링 컨테이너란?
스프링 컨테이너는 스프링 빈의 생명 주기를 관리, 즉 스프링 빈의 생성과 소멸을 관리하고, 생성된 빈을 빈 저장소에 등록하여 적절하게 사용할 수 있도록 빈을 관리해주는 컨테이너(공간)이다.
스프링 컨테이너는 스프링 빈에게 여러 기능을 제공하는데 대표적으로 의존관계 주입(DI)과 제어의 역전(IOC)이다.
DI(의존관계 주입)
- 각 객체들은 다른 객체들과 의존관계를 가질 수 있다.
- 스프링 컨테이너는 이런 의존관계를 적절하게 주입해주는 역할을 한다.
- 스프링 빈 등록 정보를 통해 스프링 컨테이너가 생성될 때 빈 사이의 의존관계를 주입해준다.
IOC(제어의 역전)
- 우리는 객체를 생성할 때 new키워드 통해 생성하고 생성된 객체는 GC에 의해 소멸된다.
- 반면 스프링 빈(객체)은 스프링 컨테이너에 의해 생성되고 소멸된다.
- 즉, 우리가 제어하는 것이 아닌 스프링 컨테이너에 의해 제어된다.
스프링 컨테이너를 통해 객체 개발자는 객체 관리에 신경쓰기보다는 개발에 집중할 수 있다.
스프링 빈 등록 방식
스프링 컨테이너에서 스프링 빈을 사용하기 위해서는 빈을 등록해줘야 한다.
빈을 등록하려면 스프링 컨테이너가 생성될 때 빈의 구성정보를 넘겨주면 된다.
스프링 빈을 등록하는 방식은 두 가지가 있다.
수동 방식(자바 코드로 등록), 자동 방식(컴포넌트 스캔)
1. 자바 코드로 등록(수동)
자바 코드로 등록하기 위해선 생성하려는 객체의 @Bean을 명시해주면 된다.
위의 작성된 클래스를 스프링 컨테이너가 생성될 때 인자로 넣어주면 된다.
스프링 컨테이너 생성 코드
ApplicationContext applicationContext =new AnnotationConfigApplicationContext(AppConfig.class);
// ApplicationContext -> 스프링 컨테이너 인터페이스
// AnnotationConfigApplicationContext는 -> 스프링 컨테이너의 구현체
// AppConfig.class -> 빈의 구성정보가 담긴 클래스
2. 컴포넌트 스캔
컴포넌트 스캔은 등록할 클래스 위에 @Component 명시하면 된다.
@Component
public class MemberServiceImpl implements MemberService{
...
}
스프링 컨테이너가 생성될 때 자동으로 @Component가 붙은 클래스의 객체를 빈으로 등록해준다.
이렇게 간단하게 사용할 수 있는데 왜 @Bean도 사용하는 걸까?
둘의 차이점을 보면 이해할 수 있다.
@Conponent와 @Bean
@Conponent 어노테이션은 자동으로 등록할 클래스를 찾아 등록해준다.
@Bean 어노테이션은 메서드 레벨로 빈을 찾아 등록해준다.
차이점
등록하는 레벨이 다르다.
@Conponent는 클래스 단위로 등록하지만 @Bean은 메서드 단위로 등록할 수 있다.
그렇기 때문에 @Conponent는 개발자가 제어할 수 있는 클래스의 경우 사용하면 되고,
제어할 수 없는 외부 라이브러리를 빈으로 등록하고 싶은 경우에는 @Bean을 사용하면 된다.
TMI
- 우리가 스프링에서 사용하는 @Controller, @Repository, @Service, @Configuration에는 @Conponent가 안에 포함되어 있다
@Target(value=TYEP)
@Retention(value=RUNTIME)
@Documented
@Component
public @interface Controller
- @Controller, @Repository, @Configuration은 컴포넌트 스캔 용도 뿐만 아니라 부가 기능을 수행한다
- @Controller : 스프링 MVC 컨트롤러로 인식
- @Repository : 스프링 데이터 접근 계층으로 인식하고, 데이터 계층의 예외를 스프링 예외로 변환해준다
- @Configuration : 스프링 설정 정보로 인식하고, 스프링 빈이 싱글톤을 유지하도록 추가 처리를 한다
- @Service : 부가 기능은 따로 없고, 핵심 비즈니스 로직이 여기 있다는 걸 인식하도록 도움을 줌