@Scope를 사용해서 scope 영역을 바꿀 상황이 어떤때가 있을까요?

167 views
Skip to first unread message

아름냥

unread,
Mar 22, 2011, 9:46:14 PM3/22/11
to Korea Spring User Group
책을 보다보니깐 Scope는 이용해서 singleton 외에 다른 범위로 지정하는데 일반적으로 사용할때 한번도 신경써본적이 없어
서요..
여러가지 범위설정이 있던데 ..실제 어떤 때 유용한지 궁금합니다. 보통 어떤 경우가 있을까요??


Kesarr

unread,
Mar 22, 2011, 10:02:51 PM3/22/11
to ks...@googlegroups.com
상태를 가진(stateful) 객체를 Bean으로 사용하고자할 때 유용합니다.

일반적으로 Singleton Scope로 등록된 Bean은 모든 요청에 대해 동일한 객체로 처리해야하기 때문에, 객체가 상태를 가지지 않거나(stateless or immutable), 객체의 상태를 동기적으로(synchronized) 공유하도록 구현해야 합니다.

하지만 각 요청에 대해 독립적인 상태를 갖는 객체를 구현해야하는 경우에는 Scope를 그 요청의 범위 내로 제한해야 합니다.


Scope가 제한된 Bean은 지정된 Scope 내에서만 유일하며, 그 Scope를 벗어난 경우(이를테면 다른 요청이 들어오는 경우)에는 새로운 Bean이 생성됩니다.

request Scope는 각개의 웹 요청 별로 새로운 Bean을 생성하려는 경우, session Scope는 각개의 HTTP 세션 별로 새로운 Bean을 생성해서 하나의 클라이언트의 계속된 요청에 대응하려는 경우에 유용합니다.

활용 빈도는 낮지만, application이나 bundle이라는 Scope도 존재합니다.



2011년 3월 23일 오전 10:46, 아름냥 <yabg...@gmail.com>님의 말:
책을 보다보니깐 Scope는 이용해서 singleton 외에 다른 범위로 지정하는데 일반적으로 사용할때 한번도 신경써본적이 없어
서요..
여러가지 범위설정이 있던데 ..실제 어떤 때 유용한지 궁금합니다. 보통 어떤 경우가 있을까요??


--
Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com로 이메일을 보내주세요.
더 많은 옵션을 보려면 http://groups.google.com/group/ksug?hl=ko에서 그룹을 방문하세요.


아름냥

unread,
Mar 22, 2011, 11:32:11 PM3/22/11
to Korea Spring User Group
네 답변 감사합니다. 책에도 그렇게 설명은 되어 있는데요..저는 좀 실제 사례가 좀 궁금해서요...^^;


On Mar 23, 11:02 am, Kesarr <kes...@playxp.com> wrote:
> 상태를 가진(stateful) 객체를 Bean으로 사용하고자할 때 유용합니다.
>
> 일반적으로 Singleton Scope로 등록된 Bean은 모든 요청에 대해 동일한 객체로 처리해야하기 때문에, 객체가 상태를 가지지
> 않거나(stateless or immutable), 객체의 상태를 동기적으로(synchronized) 공유하도록 구현해야 합니다.
>
> 하지만 각 요청에 대해 독립적인 상태를 갖는 객체를 구현해야하는 경우에는 Scope를 그 요청의 범위 내로 제한해야 합니다.
>
> Scope가 제한된 Bean은 지정된 Scope 내에서만 유일하며, 그 Scope를 벗어난 경우(이를테면 다른 요청이 들어오는 경우)에는
> 새로운 Bean이 생성됩니다.
>
> request Scope는 각개의 웹 요청 별로 새로운 Bean을 생성하려는 경우, session Scope는 각개의 HTTP 세션 별로
> 새로운 Bean을 생성해서 하나의 클라이언트의 계속된 요청에 대응하려는 경우에 유용합니다.
>
> 활용 빈도는 낮지만, application이나 bundle이라는 Scope도 존재합니다.
>

> 2011년 3월 23일 오전 10:46, 아름냥 <yabgar...@gmail.com>님의 말:

윤재진

unread,
Mar 23, 2011, 12:08:43 AM3/23/11
to ks...@googlegroups.com
제가 쓴 사례가 잘된 사례는 아닐텐데요 
spring mvc+spring+ibatis 이렇게 구성해서 서비스를 만들었습니다.
근데 거기에서 요청사항으로 들어온게 사용자가 화면 페이지마다
입력한 데이터과 쿼리를 함께 보고 싶어했습니다.
기존 서비스는 asp 라서 모든 페이지마다 include로 로그를 남기도록 되어 있었습니다.
로그는 쿼리, 사용자정보,식으로 남기고 있었습니다.

spring을 쓰는데 이렇게 할 수도 없고. 모든 dao마다 사용자 정보를 입력할때 넣은것도 불필요한거 같아서 aop로 한꺼번에 어떻게 하면 남길 수 있을까 고민을 했었습니다.

HttpSession 객체는 aop에서 가져올 수가 없습니다. 

그런데 scope="session"으로 했을 경우엔 사용자별로 객체가 살아 있는거 같아서

scope="session"으로 만든 객체를 로그긴 action에 주입 시켜놓고

insert,update,delete 메소드는 전부 aop로 걸고 log4j에서 확장한 level로 해서 
사용자 정보 : 메소드명, 현재 들어간 데이터Object (이것 reflection)로 로그를 남기도록 했습니다. 

위의 방식이 제가 했던 방법입니다. ㅡㅡ;;

그때는 제가 할 수 있는 방법이 이게 최고일꺼 같아서 했는데 잘한건지는 모르겠네요.

메모리관리 이런 부분은 다시 생각을 해봐야 할꺼 같습니다. ^^;;



2011년 3월 23일 오후 12:32, 아름냥 <yabg...@gmail.com>님의 말:
더 많은 옵션을 보려면 http://groups.google.com/group/ksug?hl=ko에서 그룹을 방문하세요.




--
========================================
블로그 : http://spyrogira256.blogspot.com
             http://spyrogira256.blog.me
윤재진 spyrog...@gmail.com
Google Talk. spyrogira256@gmail.com
NateOn. anjff...@lycos.co.kr
Mobile. 010-9747-8761
========================================

Kesarr

unread,
Mar 23, 2011, 12:14:45 AM3/23/11
to ks...@googlegroups.com
어떤 책을 보셨는지 잘 몰라서 토비의 스프링 3에 나왔던 것 같은 간단히 예제를 제시해드리지요.

@Scope("session")
class LoginUser implements User {
    public String getName() { ... }
    public void setName(String name);
}

@Controller
class LoginController {
    @Autowired
    Provider<User> userProvider;

    public void login(String name, String password) {
        User user = userProvider.get();
        user.setName(name);
        ...
    }
}


이 예제에서 loginUser Bean은 session Scope의 Bean이기 때문에, 각 HTTP 세션별로 하나의 Bean을 공유합니다.

즉, 서로 다른 클라이언트들은 서로 다른 loginUser Bean을 사용할 수 있으며, 같은 클라이언트에서는 세션이 유지되는 한 계속된 요청에서 동일한 loginUser Bean을 사용할 수 있게 됩니다.



2011년 3월 23일 오후 12:32, 아름냥 <yabg...@gmail.com>님의 말:
네 답변 감사합니다. 책에도 그렇게 설명은 되어 있는데요..저는 좀 실제 사례가 좀 궁금해서요...^^;

아름냥

unread,
Mar 23, 2011, 12:21:11 AM3/23/11
to Korea Spring User Group
상세한 답변 감사합니다. ^^

On Mar 23, 1:08 pm, 윤재진 <spyrogira...@gmail.com> wrote:
> 제가 쓴 사례가 잘된 사례는 아닐텐데요
> spring mvc+spring+ibatis 이렇게 구성해서 서비스를 만들었습니다.
> 근데 거기에서 요청사항으로 들어온게 사용자가 화면 페이지마다
> 입력한 데이터과 쿼리를 함께 보고 싶어했습니다.
> 기존 서비스는 asp 라서 모든 페이지마다 include로 로그를 남기도록 되어 있었습니다.
> 로그는 쿼리, 사용자정보,식으로 남기고 있었습니다.
>
> spring을 쓰는데 이렇게 할 수도 없고. 모든 dao마다 사용자 정보를 입력할때 넣은것도 불필요한거 같아서 aop로 한꺼번에 어떻게
> 하면 남길 수 있을까 고민을 했었습니다.
>
> HttpSession 객체는 aop에서 가져올 수가 없습니다.
>
> 그런데 scope="session"으로 했을 경우엔 사용자별로 객체가 살아 있는거 같아서
>
> scope="session"으로 만든 객체를 로그긴 action에 주입 시켜놓고
>
> insert,update,delete 메소드는 전부 aop로 걸고 log4j에서 확장한 level로 해서
> 사용자 정보 : 메소드명, 현재 들어간 데이터Object (이것 reflection)로 로그를 남기도록 했습니다.
>
> 위의 방식이 제가 했던 방법입니다. ㅡㅡ;;
>
> 그때는 제가 할 수 있는 방법이 이게 최고일꺼 같아서 했는데 잘한건지는 모르겠네요.
>
> 메모리관리 이런 부분은 다시 생각을 해봐야 할꺼 같습니다. ^^;;
>

> 2011년 3월 23일 오후 12:32, 아름냥 <yabgar...@gmail.com>님의 말:

> ========================================
> 블로그 :http://spyrogira256.blogspot.com
> http://spyrogira256.blog.me

> 윤재진 spyrogira...@gmail.com
> Google Talk. spyrogira...@gmail.com <spyrogira...@gmail.com>
> NateOn. anjffhgk...@lycos.co.kr
> Mobile. 010-9747-8761
> ========================================

eunbongc

unread,
Mar 23, 2011, 5:38:42 AM3/23/11
to Korea Spring User Group
매번 새로운 객체가 필요할 때요. :)

예를 들어보면...
멀티 건 각각 처리 혹은 비동기 처리를 위해서 새로운 Thread 를 new 해야 할 때는 어떤가요.
Runnable 구현체인 Thread 가 Spring Bean 이지만,
매번 생성되어야 하니까 Thread 를 Prototype Scope 로 지정해두고 Get 해야 하는 경우에 쓰여야 하지 않을까
요.

소켓 서버 구현을 생각하면 쉬울거 같네요.
동시 요청 처리를 위해서 소켓 서버가 연결 받아서 각각 처리하도록
처리를 구현한 클래스인 쓰레드로 Invoke 할 때
이 구현체가 Spring Bean 일 경우에는 Prototype Scope 로 되어야 하는 경우가 있더군요.

// 웹 요청이 아닌 경우,
Spring Bean 이 아닌 클래스에서 Spring Bean 을 호출하려면
같이 Spring Bean 이 되 주거나,
Spring Context 를 Get 해야 하는데..
같이 Spring Bean 이 되 주는 방법을 택했으나,
매번 새롭게 New 되어야 한다면.
Spring Bean 이 되주면서 Prototype Scope 로 처리하는거죠...

// 요약하면.
호출을 여러 건 동기적으로 하나씩 처리하는게 아니고.
멀티 건을 병렬로 쭈욱 요청할 때, 쓰레드가 필요할때..
근데 이 쓰레드가 Spring Bean 일때. ㅎㅎㅎㅎㅎ
글로 쓰려니 전달이 될지 모르겠네용.

Reply all
Reply to author
Forward
0 new messages