Java Spring

스프링 빈 의존 관계 주입 (자동/수동), 빈 스코프는 무엇인가?

pearl.k 2023. 7. 3. 19:56

스프링 빈(Spring Bean)은 간단하게 다음과 같은 라이프 사이클을 가진다.

객체 생성 -> 의존 관계 주입

 

스프링 빈의 이벤트 라이프사이클은 다음과 같다.

스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입

-> 초기화 콜백 -> 사용 -> 소멸전 콜백 -> 스프링 종료

 

이런 의존 관계를 자동 or 수동으로 주입할 수 있다. 최근 스프링 기술 경향으로 볼 때, 편리한 자동 주입 기능을 기본으로 사용하면서 수동 주입이 필요한 것은 추가로 등록하고 있다. 기본적으로 자동 주입을 생각하되, 다형성을 적극 활용하는 비즈니스 로직(객체)는 수동 등록을 고민해보는 것이 좋다. 수동을 써야 하는 경우는 본 게시글 아래 부분에 참고 부분으로 적어놓겠다.


다시 자동 주입으로 넘어가자면, 의존 관계 자동 주입은 크게 4가지로 나뉜다.

1. 생성자 주입

 - 생성자를 통해 의존 관계를 주입 받는 방식, 생성자 호출 시점에 딱 1번 호출되는 것이 보장됨 (불변, 필수)

2. 수정자 주입 (Setter 주입)

 - Setter와 같은 수정자 메소드를 통해 의존 관계를 주입하는 방법. Java Bean Property의 수정자 메소드 방식(Setter) 사용

3. 필드 주입

 - 필드에 바로 주입 하는 방식

4. 일반 메소드 주입

- 일반 메소드를 통해 주입 하는 방식


수동 빈 등록을 사용하는게 좋은 경우?

애플리케이션은 크게 1) 업무 로직2) 기술 지원 로직 두 가지로 나눌 수 있다.

여기서 두 번째의 기술 지원 빈은 기술적인 문제나 공통 관심사(AOP)를 처리할 때 주로 사용된다. 또한, 애플리케이션 전반에 걸쳐서 광범위하게 영향을 미치기 때문에 가급적 수동 빈 등록을 통해 명확하게 드러내는 것이 좋다. 수동 빈으로 등록하여 설정 정보에 바로 나타나게 하면 유지 보수를 하기에 좋기 때문이다. 

마지막으로, 자동 / 수동 빈 등록시, 빈 중복 등록과 충돌을 조심해야 한다!


빈 스코프란 무엇인가?

 지금까지 우리는 스프링 빈이 스프링 컨테이너의 시작과 함께 생성되어서 스프링 컨테이너가 종료될 때 까지 유지된다고 배웠다. 이는 스프링 빈이 기본적으로 싱글톤 스코프로 생성되기 때문이다. 스코프는 번역 그대로 빈이 존재할 수 있는 범위를 뜻한다.

스프링은 다음과 같은 다양한 스코프를 지원한다.

1. 싱글톤: 기본 스코프, 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프이다.

2. 프로토타입: 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프이다.

3. 웹 관련 스코프

 - request: 웹 요청이 들어오고 나갈때 까지 유지되는 스코프이다.

 - session: 웹 세션이 생성되고 종료될 때 까지 유지되는 스코프이다.

- application: 웹의 서블릿 컨텍스트와 같은 범위로 유지되는 스코프이다.