Spring IoC 컨테이너가 관리하는 자바 객체를 빈(Bean)이라고 부른다.
빈(Bean) 설정 파일에 직접 등록하는 방법
설정 클래스를 따로 만들어 @Configuration 어노테이션을 붙인다.
∘ 해당 클래스 안에서 빈으로 등록할 메소드를 만들어 @Bean 어노테이션을 붙여주면 자동으로 해당 타입의 빈 객체가 생성된다.
스프링 IoC 컨테이너 생성
∘ 스프링 부트에서 Component-Scan 등으로 Bean으로 등록할 객체를 찾는다.
스프링 빈 생성
∘ @Configuration 방법을 통해 Bean으로 등록할 수 있는 어노테이션들과 설정파일들을 읽어 IoC 컨에티언 안에 Bean으로 등록 시킨다.
의존 관계 주입 전 준비 단계(객체의 생성이 일어난다)
생성자 주입
객체의 생성과 의존관계 주입이 동시에 일어남
∘ 자바에서 new 연산을 호출하면 생성자가 호출이 된다. Controller 클래스에 존재하는 Service 클래스와의 의존관계가 존재하지 않는다면, Controller클래스는 객체 생성이 불가능 할 것이다.
∘ 이를 통해 얻는 이점들은
1. Null을 주입하지 않는 한 NPE은 발생하지 않는다.
2. 의존관계를 주입하지 않은 경우 객체를 생성할 수 없다. 즉, 의존관계에 대한 내용을 외부로 노출시킴으로써 컴파일 오류를 잡을 수 있다.
Setter, Field 주입
객체의 생성 -> 의존관계 주입으로 라이프 사이클이 나누어져 있음
∘ setter 주입의 경우 Controller 객체를 만들 때 의존 관계는 필요하지 않다.
∘ 즉, 생성자 주입과는 다르게 Controller 객체를 만들 때 Service 객체와 의존 관계가 없어도 Controller 객체를 만들 수 있다.
∘ 따라서 객체 생성 -> 의존 관계 주입의 단계로 나누어서 Bean 생명주기가 진행된다.
주로 콜백 함수를 부를 때 사용되는 용어이며, 콜백 함수를 등록하면 특정 이벤트가 발생했을 때 해당 메소드가 호출된다. 즉, 조건에 따라 실행될 수도 실행되지 않을 수도 있는 개념이다.
public class ExampleBean implements InitializingBean, DisposableBean {
@Override
public void afterPropertiesSet() throws Exception {
// 초기화 콜백 (의존관계 주입이 끝나면 호출)
}
@Override
public void destroy() throws Exception {
// 소멸 전 콜백 (메모리 반납, 연결 종료와 같은 과정)
}
}
public class ExampleBean {
public void init() throws Exception {
// 초기화 콜백 (의존관계 주입이 끝나면 호출)
}
public void close() throws Exception {
// 소멸 전 콜백 (메모리 반납, 연결 종료와 같은 과정)
}
}
@Configuration
class LifeCycleConfig {
@Bean(initMethod = "init", destroyMethod = "close")
public ExampleBean exampleBean() {
// 생략
}
}
클래스 내부에 초기화/종료 메소드를 구현해놓고 @Bean(initMethod = "init", destroyMethod = "close") 처럼 Bean Annotation에 추가 아규먼트들을 설정해주는 방식
장점
∘ 메소드 이름이 자유롭다.
∘ 스프링 빈이 스프링 코드에 의존적이지 않다.
∘ 코드를 고칠 수 없는 외부 라이브러리에도 초기화, 종료 메소드를 적용 가능
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
public class ExampleBean {
@PostConstruct
public void init() throws Exception {
// 초기화 콜백 (의존관계 주입이 끝나면 호출)
}
@PreDestroy
public void close() throws Exception {
// 소멸 전 콜백 (메모리 반납, 연결 종료와 같은 과정)
}
}
스프링 컨테이너에서 관리하는 빈 객체의 생성 주기와 유지 범위를 정의하는 개념
스코프의 선택
따로 설정을 하지 않는 것이 싱글톤 스코프. 특수한 상황이 아니라면 디폴트 설정을 사용하는 것이 좋다.