코드네임 JY

[스프링 핵심] 빈 스코프 본문

백엔드 공부

[스프링 핵심] 빈 스코프

영재임재영 2023. 1. 6. 11:41

미리보기

✅ 빈 생명주기에 대해 알아보자!

✅ 빈 스코프에 대해 알아보자!

✅ 프로토타입 스코프를 공부해보자!

✅ 웹 스코프를 공부해보자!


🥫 빈 생명주기

스프링에서 스프링 빈이 생성되고, 사용되고, 소멸되는 과정은 다음과 같이 정리할 수 있다.

 

1️⃣ 스프링 컨테이너 생성

- 스프링이 실행되고, 스프링 컨테이너가 생성

2️⃣ 스프링 빈 생성 의존관계 주입 초기화 콜백

- 컨테이너에 빈이 등록(생성)되고, 필요한 의존관계들이 주입

- 의존관계 주입까지 끝나면, 이제 빈을 사용해도 된다는 초기화에 대한 콜백

3️⃣ 빈 사용

- 스프링 빈을 코드에서 사용

4️⃣ 소멸 전 콜백  스프링 종료

- 안전한 종료 작업을 위해, 소멸 전에도 콜백을 주고 스프링이 종료

 

'초기화 콜백'과 '소멸 전 콜백' 메서드를 지정할 수 있는데, 2가지 방식이 있다.

첫 번째로, Bean 어노테이션에 initMethod, destroyMethod 의 이름을 지정해주면 된다!

이 방법은 특정 함수의 이름만 지정하면 되므로, 외부 라이브러리를 사용해야 할 때 활용하면 좋다!

@Bean(initMethod = "init", destroyMethod = "close")

두 번째는, 초기화 콜백을 위한 @PostConstruct와 소멸 전 콜백을 위한 @Predestroy 어노테이션을 사용하면 된다!

이 방법은 외부 라이브러리 코드에서 사용할 수 없다. 직접 어노테이션 선언이 필요하기 때문이다.

하지만 스프링에 종속되지 않는 자바 표준이고, 컴포넌트 스캔과 잘 어울린다는 장점이 있다!

@PostConstruct
public void init() {
    System.out.println("init");
}

@PreDestroy
public void close() {
    System.out.println("close");
}

어떤 때에 사용하는 기능인지 잘 와닿지 않아서, 구글링을 해보았는데!

빈이 생성되면서 딱 한 번만 실행되는 메소드이기 때문에, 기본적인 데이터 등록을 위해 쓰기도 한다고 한다.

데이터베이스를 활용해서 사용하는 경우에는 가장 기본적인 정보 값이 등록되도록 구현하고 싶을 때 사용하면 될 것 같다!

 

🍱 빈 스코프

스프링은 기본적으로 싱글톤 컨테이너이기 때문에, 스프링 빈은 '싱글톤 스코프'를 가진다고 할 수 있다.

이처럼 스코프는 '빈이 존재할 수 있는 범위'를 뜻하는데, 스프링에서 활용되는 스코프 3가지가 있다.

 

1️⃣ 싱글톤 스코프

- 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프

2️⃣ 프로토타입 스코프

- 스프링 컨테이너가 '빈의 생성 + 의존관계 주입 + 초기화' 까지만 관여하고 그 이후는 관리하지 않는 짧은 범위의 스코프

3️⃣ 웹 스코프

- 웹 환경에서만 동작하는 스코프, 스프링 컨테이너가 해당 스코프의 종료시점까지 관리

 

🧇 프로토타입 스코프

프로토타입 스코프의 가장 큰 특징은, 스프링 컨테이너가 항상 새로운 인스턴스를 생성해서 반환한다는 것이다!

싱글톤 스코프의 빈을 조회하면 스프링 컨테이너는 항상 같은 인스턴스를 반환했던 것과 비교되는 점이다.

 

프로토타입 스코프
싱글톤 스코프

또 다른 특징이 하나 더 있다. 스프링 컨테이너는 '빈의 생성 + 의존관계 주입 + 초기화' 까지만 담당한다!

싱글톤 스코프의 빈은 스프링 컨테이너에서 소멸 전 콜백을 부를 수 있었다는 것과 비교되는 점이다.

 

이는 초기화까지 해준다면 더 이상 스프링 컨테이너에게 책임이 없고, 클라이언트에게 관리 책임이 전가된다.

따라서 프로토타입 빈은 스프링 컨테이너에서 소멸 전 콜백 메소드를 호출할 수 없다!

 

@Scope("prototype") 어노테이션을 사용해서 구현할 수 있다.

 

🥯 웹 스코프

웹 스코프는 웹 환경에서만 동작하는 스코프이다.

또한 이는 프로토타입 스코프와 다르게, 스코프의 종료 시점까지 관리하여 소멸 전 콜백 메소드를 호출할 수 있다!

 

대표적으로 request 스코프의 경우, HTTP 요청 하나 당 하나씩 생성되고, HTTP 요청이 끝나는 시점에 소멸된다.

이는 @Scope("request")로 구현할 수 있고, 이외의 웹 스코프 종류에는 session, application 등이 있다.

Comments