Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

프로그래밍 끄적끄적

[SpringBoot] 빈 스코프 본문

백엔드/스프링

[SpringBoot] 빈 스코프

soeunkk 2021. 9. 13. 19:24

🌳 스프링 스코프

1. 싱글톤

    ▪ 기본 스코프로, 스프링 컨테이너의 시작부터 종료까지 유지된다.

    ▪ 하나의 인스턴스만 생성되기 때문에, 언제든지 같은 인스턴스의 스프링 빈을 반환함을 보장한다.

 

2. 프로토타입 (@Scope("prototype"))

    ▪ 빈 생성과 의존관계 주입까지만 관리한다.

    ▪ 클라이언트가 요청하는 "시점에" 새로운 빈을 생성하고 초기화하여 반환한다.

    ▪ 따라서 요청할 때마다 새로 생성되기 때문에 서로 다른 인스턴스를 가진다. (getBean도 이에 해당함)

    ▪ 이는 각 클라이언트마다 필드값을 따로 관리할 수 있다는 말로 해석할 수 있음

    ▪ 빈을 반환한 이후에는 프로토타입 빈을 관리하지 않는다. 따라서 종료 메서드도 호출되지 않으며, 클라이언트가 관리해야 한다.

 

3. 웹 관련 스코프 

    ▪ request: 웹 요청이 들어오고 나갈 때까지 유지된다.

    ▪ session: 웹 세션이 생성되고 종료될 때 까지 유지된다.

    ▪ application: 웹의 서블릿 컨텍스와 같은 범위로 유지된다.

 

🌳 싱글톤 빈에서 프로토타입 빈을 의존주입 받는다면 어떻게 될까?

이는 이미 주입시점에서 생성이 되었기 때문에 다른 클라이언트가 사용한다고 해서 계속 생성되지 않는다.

따라서 여러 클라이언트에 의해 싱글톤 빈 안의 프로토타입 빈의 필드 값이 수정된다면, 그것은 그대로 누적되어 적용된다.

 

🍃 각각 다른 인스턴스를 가져야 한다면 어떻게 해야 할까?

Provider을 사용하면 된다!

이때 스프링에서 지원해주는 ObjectProvider와 자바 표준인 Provider 중 하나를 선택하여 사용할 수 있다.

스프링이 아닌 다른 컨테이너로 바꿀 일이 없다면, 더 많은 기능을 제공해 주고 별도의 라이브러리 설치가 필요 없는 ObjectProvider를 사용하면 하자.

하지만, 다른 컨테이너로 바뀔 가능성이 있는 프로젝트라면,  get() 메서드 하나로 기능이 단순한 Provider를 사용하자. 이때 별도의 라이브러리(javax.inject)를 설치하여 사용해야 한다.

 

ObjectProvider 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Scope("singleton")
static class ClientBean2 {
 
    @Autowired
    private ObjectProvider<PrototypeBean> prototypeBeanProvider;
 
    public int logic() {
        // getObject() 메서드는 DL 기능을 편리하게 이용하도록 만들어진 것으로, getObject() 메서드를 사용하면 빈 조회가 일어난다.
        //이때 프로토타입 빈은 빈을 조회할 때마다 생성되므로 다른 인스턴스를 가지게 되는 것이다.
        PrototypeBean prototypeBean = prototypeBeanProvider.getObject();
        prototypeBean.addCount();
        return prototypeBean.getCount();
    }
}
cs

 

Provider 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Scope("singleton")
static class ClientBean {
 
    @Autowired
    private Provider<PrototypeBean> prototypeBeanProvider;  //get() 메서드 하나만 있기 때문에 기능이 단순하고, 자바 표준이므로 다른 컨테이너에서 사용할 수 있음
 
    public int logic() {
        // get() 메서드는 DL 기능을 편리하게 이용하도록 만들어진 것으로, get() 메서드를 사용하면 빈 조회가 일어난다.
        //이때 프로토타입 빈은 빈을 조회할 때마다 생성되므로 다른 인스턴스를 가지게 되는 것이다.
        PrototypeBean prototypeBean = prototypeBeanProvider.get();
        prototypeBean.addCount();
        return prototypeBean.getCount();
    }
}
cs

 

'백엔드 > 스프링' 카테고리의 다른 글

[SpringBoot] 로깅  (0) 2022.01.20
[SpringBoot] 스프링 MVC  (0) 2022.01.19
[SpringBoot] 빈 생명주기  (0) 2021.09.13
[SpringBoot] 롬복(Lombok)  (0) 2021.09.08
[SpringBoot] 자동주입(@Autowired)  (0) 2021.09.07
Comments