์ด๋ชจ์ €๋ชจ

request scope์™€ provider, proxy ๋ณธ๋ฌธ

coding/Java, Spring

request scope์™€ provider, proxy

Jeo 2022. 2. 17. 15:58

๐Ÿฆ” bean์˜ scope

  1. singleton scope : ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ๋ถ€ํ„ฐ ์†Œ๋ฉธ๊นŒ์ง€ ์ด์–ด์ง€๋Š” ๊ธด ์Šค์ฝ”ํ”„.
  2. prototype scope : ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์˜ ์ƒ์„ฑ๊ณผ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…๊นŒ์ง€๋งŒ ๋”๋Š” ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š” ์งง์€ ๋ฒ”์œ„์˜ ์Šค์ฝ”ํ”„
    • prototype scope๋Š” ์ž์ฃผ ์“ฐ์ง€๋Š” ์•Š๋Š”๋‹ค๊ณ  ํ•œ๋‹ค. ๋‹ค๋งŒ ์‹ฑ๊ธ€ํ†ค ๋นˆ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ์‹œ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.
    • ์‹ฑ๊ธ€ํ†ค์„ ์ทจํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ prototype scope ๋ฅผ ๊ฐ–๋Š” ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•  ๊ฒฝ์šฐ, ์›๋ž˜๋ผ๋ฉด ๋งค ์‚ฌ์šฉ์‹œ๋งˆ๋‹ค ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑ๋  ๋ฒ•ํ•œ(๊ทธ๋ ‡๊ฒŒ ์˜๋„ํ–ˆ์„ ๋ฒ•ํ•œ) prototype scope์˜ ๊ฐ์ฒด๊ฐ€ ์‹ฑ๊ธ€ํ†ค ๋นˆ์— ์˜ํ•ด ๋ถ™์žกํžŒ ์ฑ„๋กœ ๊ณ„์† ์‚ด์•„์žˆ๊ฒŒ ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ. 
    • ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ๊ณ„์† ์ƒˆ๋กœ ์ƒ์„ฑ๋˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ–ˆ๋˜ prototype ๋นˆ์ด ์‹ฑ๊ธ€ํ†ค๊ณผ ํ•จ๊ป˜ ์‚ด์•„๋‚จ์•„ ๊ณ„์† ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋กœ ์‚ฌ์šฉ/๊ณต์œ ๋  ์ˆ˜ ์žˆ์–ด ์˜๋„์™€ ๋‹ค๋ฅธ ์ž‘๋™์ด ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค.
    • ์ด๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด?
    • ์ง์ ‘ ํ•„์š”ํ•  ๋•Œ ์˜์กด๊ด€๊ณ„๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” Dependency Lookup(DL)์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค.
    • DL์˜ 2 ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€:
      • ์Šคํ”„๋ง์ด ์ œ๊ณตํ•˜๋Š” ObjectProvider
      • ์ž๋ฐ” ํ‘œ์ค€ javax.inject.Provider
         
  3. web scope
    • request: ์›น ์š”์ฒญ์ด ๋“ค์–ด์˜ค๊ณ  ๋‚˜๊ฐ€๋Š” ๋™์•ˆ ์œ ์ง€
    • session: ์›น ์„ธ์…˜ ์ƒ์„ฑ-์ข…๋ฃŒ๊นŒ์ง€ ์œ ์ง€
    • application: ์›น์˜ servletContext์™€ ๊ฐ™์€ ๋ฒ”์œ„๋กœ ์œ ์ง€

๐Ÿผ web scope ์— ์˜์กด๊ด€๊ณ„๋ฅผ ๊ฐ–๋Š” singleton bean์ด ์žˆ์„ ๋•Œ ๋ฌธ์ œ(?)

Web scope์— ์†ํ•˜๋Š” request scope๋ฅผ ๊ฐ–๋Š” ๊ฐ์ฒด๋ผ๋ฉด, ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์ด ์žˆ์–ด์•ผ๋งŒ ์ƒ์„ฑ๋œ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ์‹œ ๋นˆ์ด ๋“ฑ๋ก๋  ๋•Œ, web scope๋ฅผ ๊ฐ–๋Š” ๊ฐ์ฒด์— ๋Œ€ํ•ด ์˜์กด๊ด€๊ณ„๋ฅผ ๊ฐ–๋Š” ๋นˆ์ด ์žˆ๋‹ค๋ฉด?

์•„๋ฌด ์กฐ์น˜๋ฅผ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ( request์ด์ „์ด๋ผ ์ƒ์„ฑ๋  ์ˆ˜ ์—†๋Š” ์•„์ด๋ฅผ ์˜์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒ)

 

No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.

 

๐Ÿฆ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

(1) ObjectProvider ์‚ฌ์šฉ

  • request scope๋ฅผ ๊ฐ–๋Š” ๋นˆ ์ž์ฒด๋ฅผ ์ƒ์„ฑ์ž์˜ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์œผ๋กœ ๋„ฃ์–ด์ฃผ์ง€ ์•Š๊ณ , request scope๋ฅผ ๊ฐ–๋Š” ๊ทธ ๋นˆ์„ ์‚ฌ์šฉํ•˜๋Š” ์‹œ์ ์—์„œ ํ˜ธ์ถœํ•˜์—ฌ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ. 
  • ํ•„์ˆ˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋กœ request scope์˜ ๊ฐ์ฒด ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ, ๊ทธ ๊ฐ์ฒด์— ๋Œ€ํ•œ ObjectProvider๋ฅผ ๋งˆ๋ จํ•ด๋‘๊ณ ,
  • ํ•„์š”ํ•œ ์‹œ์ ์— ๊ทธ Provider๋กœ๋ถ€ํ„ฐ getObject()ํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.

(2) Proxy ์‚ฌ์šฉ ** ๋” ๊ฐ„๊ฒฐ

  • @Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
  • request scope๋ฅผ ๊ฐ–๋Š” ํด๋ž˜์Šค์— ์œ„์™€ ๊ฐ™์€ proxyMode๋ฅผ ์„ค์ •ํ•ด๋‘”๋‹ค.
  • ์ด๋ ‡๊ฒŒ ๋˜๋ฉด, ์•„์ง request๊ฐ€ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์•„ ์ง„์งœ ๋นˆ์ด ์ƒ์„ฑ๋˜์ง€ ์•Š์•˜์Œ์—๋„,
  • ๋‹ค๋ฅธ ๋นˆ์—์„œ ์ด request scope์˜ ๋นˆ์— ์˜์กดํ•˜๋ฉด์„œ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ํ•  ๋•Œ ๊ฐ€์งœ ๋นˆ์— ์˜์กดํ•ด์„œ ์ผ๋‹จ ์ƒ์„ฑ๋œ๋‹ค.
  • ๋‚˜์ค‘์— ์ง„์งœ๋กœ ํ•„์š”ํ•  ๋•Œ๋Š” ๊ฐ€์งœ๊ฐ€ ์•„๋‹Œ ์ง„์งœ๋กœ ์ฐพ์•„์™€์„œ ์œ„์ž„ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

request scope๋ฅผ ๊ฐ–๋Š” MyLogger์— ํ”„๋ก์‹œ ์„ค์ • -> ๋‹ค๋ฅธ ๋นˆ ์ƒ์„ฑ์‹œ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…ํ•  ๋•Œ ํ•„์š”ํ•˜๋”๋ผ๋„ MyLogger์˜ ๊ฐ€์งœ๋ฒ„์ „์œผ๋กœ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Œ.

 

Comments