당니의 개발자 스토리

빈 스코프란? 본문

스프링/스프링 핵심 원리 - 기본편

빈 스코프란?

clainy 2024. 1. 27. 14:51

9. 빈 스코프

이번 시간부터는 빈 스코프에 대해서 알아보겠습니다.

빈 스코프가 뭐냐면요. 지금까지 우리는 스프링 컨테이너가 만들어질 때 스프링 빈들도 함께 생성이 되고 스프링 컨테이너에 의해서 관리되고 놀다가 스프링이 종료되기 직전스프링 빈들도 함께 종료된다고 얘기를 했잖아요.

그게 왜 그러냐면, 스프링 빈이 기본적으로 싱글톤 스코프생성되기 때문이에요. 스코프는 번역 그대로 이 빈이 존재할 수 있는 범위를 뜻하거든요. '이 빈은 언제부터 언제까지야' 이런 겁니다.

싱글톤 스코프 같은 경우에는 기본 스코프예요. 기본이지만 스프링 컨테이너의 시작과 종료까지, 가장 생명주기가 긴, 즉 스프링 컨테이너와 똑같은 생명주기를 가지는 스코프입니다.

그리고 스프링이 다른 스코프도 지원하는데요. 프로토타입 이라는 스코프도 지원합니다. 뭔가 대충 만들고 버릴 것 같죠? 이름 그대로입니다.

스프링 컨테이너는 싱글톤 말고,

이렇게 만들 때 스코프에서 "prototype" 이런 식으로 할 수가 있거든요.

또는 @Bean 할 때도 이렇게 등록할 수가 있는데, 이렇게 하면 싱글톤은 스프링이 딱 만들어질 때부터 스프링 컨테이너가 끝날 때까지, 정말 끝까지 보장을 해주잖아요.

싱글톤객체가 하나가 있는 것도 보장해주면서 컨테이너의 시작과 끝까지 함께하는 가장 긴 스코프라고 하면, 프로토타입 스코프@Scope("prototype") 이라고 해놓으면, 요청을 할 때 스프링 컨테이너가 빈을 만들어서 넣어줘요. 요청을 하면 그때 딱 만들어줘요. 그리고 의존관계 주입해주고, 그 다음에 초기화까지 해줍니다. 거기서 끝입니다. 거기서 이제 클라이언트한테 반환해주고, 스프링 컨테이너가 더이상 관리하지 않는 거예요. 진짜 프로토타입이죠. 만들어서 그냥 던지고 끝. 그래서 종료 메서드 호출이 안됩니다.

원래는 빈이 소멸되기 직전스프링이 소멸 콜백을 해주잖아요. 그런데 프로토타입 빈은 객체를 생성하고 의존관계, 초기화까지만 해주고 클라이언트한테 '너 알아서 해라' 하고 던지기 때문에, 더이상 스프링 컨테이너가 관리하지 않는 빈이라서 당연히 콜백도 안해주는 거예요. 뒤에서 한번 알아볼게요.

그래서 프로토타입 스코프스프링 컨테이너가 프로토타입 빈의 생성과 의존관계 주입까지만 관여하니까, 일단 @PostConstruct, 초기화 메서드까지는 불러줍니다. 스프링 컨테이너가 거기까지는 해주는데, 이후에는 더는 관리하지 않아요. 그런 매우 짧은 범위의 스코프라고 보시면 됩니다.

그리고 웹 관련 스코프라고 있는데, 왜 웹 관련 스코프라고 하냐면, 스프링 웹과 관련된 기능이 들어가야 쓸 수 있는 스코프예요.

requestHTTP에서 고객 요청이 오고 애플리케이션에서 동작하다가 고객 요청이 response로 빠져나가겠죠. 따라서 request는 웹 요청이 들어오고 나갈 때까지의 생존 범위를 가지는 굉장히 특별한 스코프예요. 정확히는 고객 요청이 들어오고 최초 스프링 컨테이너를 호출할 때 생성이 돼서, 고객 요청이 나갈 때 destroy가 되는 스코프구요.

session웹 세션이 생성되고 종료될 때까지 유지되는 스코프입니다. session을 보통 로그인 이런 거에서 많이 쓰거든요.

그 다음에 application웹의 서블릿 컨텍스트라는 개념이 있는데, 굉장히 긴 범위로 그때까지 유지되는 스코프입니다.

여기서 우리가 주로 알면 되는 건 싱글톤, 프로토타입, request 이 세 가지 정도만 알면 돼요. 나머지는 개념들이랑 딱딱 맵핑이 되거든요.

그래서 일단 등록하는 것은

컴포넌트 스캔의 경우에 이렇게 하고, 수동 등록인 경우엔

빈 위에다가 이렇게 적어 주시면 됩니다.

지금까지 싱글톤 스코프를 계속 사용해보았으니, 이제 싱글톤이랑 비교를 하면서 프로토타입 스코프부터 설명을 해드리겠습니다.