책을 보다보니깐 Scope는 이용해서 singleton 외에 다른 범위로 지정하는데 일반적으로 사용할때 한번도 신경써본적이 없어
서요..
여러가지 범위설정이 있던데 ..실제 어떤 때 유용한지 궁금합니다. 보통 어떤 경우가 있을까요??
--
Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com로 이메일을 보내주세요.
더 많은 옵션을 보려면 http://groups.google.com/group/ksug?hl=ko에서 그룹을 방문하세요.
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>님의 말:
네 답변 감사합니다. 책에도 그렇게 설명은 되어 있는데요..저는 좀 실제 사례가 좀 궁금해서요...^^;
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
> ========================================
예를 들어보면...
멀티 건 각각 처리 혹은 비동기 처리를 위해서 새로운 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 일때. ㅎㅎㅎㅎㅎ
글로 쓰려니 전달이 될지 모르겠네용.