Spring Bean Scope

민박지·2021년 5월 7일
0

Spring

목록 보기
10/10

빈 스코프

빈스코프의 종류

  1. 싱글톤 스코프
  • 스프링빈은 기본적으로 싱글톤스코프로 생성되는데 이는 스프링 컨테이너의 시작과 종료될때까지 유지된다.
  1. 프로토타입 스코프
  • 빈의 생성과 의존관계까지만 관리해주고 그이후는 관리하지않는 짧은 스코프

프로토타입 스코프의 빈은 같은 요청이라도 요청을 받을때마다 새로운객체를 생성한다.

초기화 까지만 관여하기 때문에 @PreDestory 같은 종료메서드는 호출되지 않는다.

즉 종료메서드에 해당하는 작업은 클라이언트가 직접 처리하도록한다.

★프로토타입 스코프와 싱글톤 빈과 함께 사용하는 경우 문제가 발생한다.

정확히는 싱글톤빈이 프로토타입빈을 사용하면 문제가 생긴다. 생성시점에만 의존관계 주입을 받기 때문에, 새로 생성된 프로토타입빈이 싱글톤빈과 함께 계속해서 유지되고 있는상태가 된다.

서로 다른 싱글톤빈이 프로토타입 빈을 생성할때는
서로 다른 프로토타입 빈을 생성한다.

이 문제를 해결하기 위해서 이용 가능한 방법으로서 DL(Dependency Lookup)을 제공해주는 ObjectProvider을 이용한다.

ObjectProvider은 빈으로 등록하지 않아도 스프링에서 자동으로 등록해준다.

스프링에 의존하지 않는 방법
javax.inject.Provider 라는 JSR 자바 표준을 이용한다.

javax.inject:javax.inject:1 라이브러리를 그래들에 추가하여 이용한다.

매번 사용할때마다 의존관계주입을 새로운 객체로 하게될때 사용하는데, 사실 자주쓰지는 않는다.

JSR 표준을 따르는 Provider

@Lookup 어노테이션을 활용할수도 있지만
고려할 사항이 많기때문에 다른것을 이용하자

  1. 웹 관련 스코프
    request: HTTP 요청 하나가 들어오고 나갈 때 까지 유지되는 스코프, 각각의 HTTP 요청마다 별도의 빈
    인스턴스가 생성되고, 관리된다.
    session: HTTP Session과 동일한 생명주기를 가지는 스코프
    application: 서블릿 컨텍스트( ServletContext )와 동일한 생명주기를 가지는 스코프
    websocket: 웹 소켓과 동일한 생명주기를 가지는 스코프

웹스코프는 웹 환경에서만 동작함.
프로토타입과 다르게 해당스코프의 종료시점까지 관리해줌. 종료메서드가 호출된다.

아무 생각없이 리퀘스트스코프를 가진 빈을 호출하려하면 스프링 컨테이너가 뜨는시점에는 request가 활성화된 상태가 아니라 오류가 발생한다.

이때도 프로토타입때와 유사하게 ObjectProvider 을 이용하여 request가 호출된 시점에 빈을 생성해서 받아올수 있다.

프로바이더가 동작하는것처럼

proxyMode = ScopedProxyMode.TARGET_CLASS 를 이용하면
가짜 프록시 객체를 만들어서 주입하는데

이 가짜 프록시 객체 내에 실제 클래스를 찾아서 실제 로직을 실행하도록 만든다.
실제클래스를 상속바당 만들어져 있어서 클라이언트 입장에서는 동일하게 사용할수있음.

프록시 객체를 이용하면 편리하게 request scope를 이용가능하다.

핵심은 진짜 객체조회하는 시점을 지연시키는것이다.

주의할점

프록시를 사용하게되면 싱글톤 스코프인거처럼 착각하기 쉬우니 잘 확인하자

특별한 스코프들은 꼭 필요한곳에만 사용하지 않으면 유지보수가 힘들어지니 조심해서 사용하자.

profile
개발자

0개의 댓글