티스토리 뷰

SPRING/정리

스코프(scope) 빈

란텔 2016. 8. 20. 16:26

스프링은 싱글톤(singgleton), 프로토타입(prototype), 요청(request), 세션(session), 글로벌세션(globalSession), 애플리케이션(application) 스코프를 기본적으로 제공


스프링에서 별도의 설정 없이 등록한 빈은 모두 싱글톤 빈이다.


  •  요청 스코프 빈

이 빈은 하나의 사용자 웹 요청 안에서 만들어지고 요청이 끝나면 제거된다.

각 요청별로 독립적인 빈이 만들어지기 때문에 빈 객체 내에 상태유지 값을 저장해 두어도 안전하다.

동시에 많은 요청이 있더라도 각각 별도의 요청 스코프 빈이 만들어지기 때문에 안전하다.



+리퀘스트 스코프 빈 모델 객체

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Component
@Scope("request")
public class RequestScopeModel {
    
    private String value;
 
    public String getValue() {
        return value;
    }
 
    public void setValue(String value) {
        this.value = value;
    }
    
}
cs

+컨트롤러 의존관계 주입

1
2
3
4
5
6
7
8
9
10
11
12
13
@Inject Provider<RequestScopeModel> rsm;
    
@Autowired
private TestService service;
 
@RequestMapping(value="/requestScopeTest")
public String requestScopeTest(HttpServletRequest req){
        
    System.out.println(rsm.get().hashCode() + "<<<<<<<요청1");
    service.requestScopeTest();
        
    return "test";
}
cs

+서비스단에서도 유지가 되는지 확인

1
2
3
4
5
6
7
8
9
10
11
12
@Service
public class TestService implements TestServiceProvider{
    
    @Inject 
    Provider<RequestScopeModel> requestProvider;
    
    @Override
    public void requestScopeTest(){
        System.out.println(requestProvider.get().hashCode() + " <<<<요청2");
    }
    
}
cs


사용자가 requestScopeTest를 요청하면 컨트롤러와 서비스 코드를 거친다.

요청1과2가 한 그룹이니 각 사용자의 요청 한번 한번 마다 별도의 빈이 만들어짐을 알 수있다.




  • 세션 스코프 빈

세션은 사용자 별로 만들어진다.

세션은 브라우저가 닫히거나 세션 유효시간이 지나거나 끊을 때까지 정보가 유지된다.

로그인 정보 등을 저장해 놓기에 적합하다. 단 웹 정보에 접근할 수 있는 계층에서만 사용가능하다.


세션을 서비스 계층과 데이터 액세스 계층에 파라미터로 넘겨서 작업하는 방식은 아주 좋지 않은 방법이다.


세션 스코프를 이용하면 HTTP session정보를 모든 계층에서 안전하게 이용할 수 있다.


+세션 스코프 모델 객체
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Component("user")
@Scope("session")
public class UserInfo {
    private String name;
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
}
 
cs


+스프링 컨트롤러

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@RequestMapping(value="login")
public String login(HttpServletRequest res){
            
    int result = service.login();
        
    return "login";
}
 
 
@RequestMapping(value="logout")
public String logout(HttpServletRequest res, HttpSession session){
        
    session.invalidate();
    
    return "login";
}
cs


+서비스 단

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Service
public class TestService implements TestServiceProvider{
    
    @Inject 
    Provider<UserInfo> provider;
    
    @Override
    public int login(){
        //로그인 처리 blah blah
        
        //session scope빈에 세션 정보 저장
        UserInfo sessionUser = provider.get();
        sessionUser.setName("choonie");
        
        //-1실패 0이상 성공
        return 1;
    }
 
}
cs

서비스 계층 코드에 보이는 것처럼 싱글톤이 아닌 스코프 빈을 직접 DI해서 사용하지 못한다. 보이는 것처럼 Provider를 사용하거나 ObjectFactory같은 전략을 이용해야 한다. 아니면 스프링 API인 ApplicationContext의 getBean을 이용해야 한다.


jsp에서 세션 스코프빈에 저장된 정보 접근은 EL표현으로 다음과 같이 가능하다.

1
${sessionScope.user.name}
cs

sessionScope는 EL에서 제공하는 객체이고, user는 등록된 빈의 이름인데 위의 코드에서 @Component("user")라고 해줬으므로 user가 빈의 이름이 된다. 

만약 빈의 이름을 명시적으로 선언하지 않았다면 해당 빈의 이름은 userInfo가 된다.

마지막의 name은 getter메서드를 호출한다. getName을 호출하는 것이다.

'SPRING > 정리' 카테고리의 다른 글

스프링의 컨트롤러, 핸들러 매핑, 인터셉터  (4) 2016.08.23
빈 초기화 메서드 지정  (0) 2016.08.21
프로토타입(prototype) 빈  (0) 2016.08.19
의존관계 빈 설정 방법  (0) 2016.08.14
Spring 빈의 등록 방법  (0) 2016.08.11
Comments
최근에 올라온 글
최근에 달린 댓글
TAG
more
Total
Today
Yesterday