spring

[Spring] Spring Bean ๊ณผ Servlet์— ๊ด€ํ•œ ์งˆ์˜์‘๋‹ต (ChatGPT)

devJK93 2024. 9. 2.

๐Ÿ”ฅ ์Šคํ”„๋ง๋นˆ / ์„œ๋ธ”๋ฆฟ

โ“ Question

์Šคํ”„๋ง๋นˆ๊ณผ ์„œ๋ธ”๋ฆฟ์€ ๋‘˜๋‹ค ๊ฐ์ฒด์ด์ง€ ์•Š๋‚˜? ๋‘˜๋‹ค ์‹ฑ๊ธ€ํ†ค์ด๊ณ  ๊ทธ๋Ÿผ ์–ด๋–ค ์ฐจ์ด๊ฐ€ ์žˆ์ง€

 

๐Ÿ“ Answer

์Šคํ”„๋ง ๋นˆ(Spring Bean)๊ณผ ์„œ๋ธ”๋ฆฟ(Servlet)์€ ๋ชจ๋‘ ๊ฐ์ฒด์ด๋ฉฐ, ๋‘˜ ๋‹ค ์ผ๋ฐ˜์ ์œผ๋กœ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋‘˜ ์‚ฌ์ด์—๋Š” ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์š” ์ฐจ์ด์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

 

1. ์—ญํ•  ๋ฐ ์‚ฌ์šฉ ๋ชฉ์ 

  • ์Šคํ”„๋ง ๋นˆ(Spring Bean): ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ๊ด€๋ฆฌ๋˜๋Š” ๊ฐ์ฒด๋กœ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง, ์„œ๋น„์Šค, ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๋“ฑ์˜ ๋‹ค์–‘ํ•œ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์Šคํ”„๋ง ๋นˆ์€ ์ฃผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ „๋ฐ˜์ ์ธ ๊ธฐ๋Šฅ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋นˆ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ(Application Context)์— ์˜ํ•ด ์ƒ์„ฑ๋˜๊ณ  ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
  • ์„œ๋ธ”๋ฆฟ(Servlet): ์ž๋ฐ” EE(์ด์ œ๋Š” ์ž์นด๋ฅดํƒ€ EE) ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํด๋ผ์ด์–ธํŠธ์˜ HTTP ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์„œ๋ธ”๋ฆฟ์€ ์›น ์„œ๋ฒ„(์˜ˆ: Tomcat)์—์„œ ์‹คํ–‰๋˜๋ฉฐ, ์ฃผ๋กœ HTTP ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‘๋‹ต์„ ์ƒ์„ฑํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

2. ๋ผ์ดํ”„์‚ฌ์ดํด ๊ด€๋ฆฌ

  • ์Šคํ”„๋ง ๋นˆ: ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ(Application Context)์— ์˜ํ•ด ๋ผ์ดํ”„์‚ฌ์ดํด์ด ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋˜๋ฉด ๋นˆ์ด ์ƒ์„ฑ๋˜๊ณ , ํ•„์š”์— ๋”ฐ๋ผ ์ดˆ๊ธฐํ™” ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ข…๋ฃŒ๋  ๋•Œ ๋นˆ์˜ ์†Œ๋ฉธ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์„œ๋ธ”๋ฆฟ: ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ(์˜ˆ: Tomcat, Jetty)์— ์˜ํ•ด ๋ผ์ดํ”„์‚ฌ์ดํด์ด ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์„œ๋ธ”๋ฆฟ์€ ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด ๋กœ๋“œ๋  ๋•Œ init() ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉฐ, ์ดํ›„ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ๋งˆ๋‹ค service() ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์„œ๋ธ”๋ฆฟ์ด ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์„ ๋•Œ destroy() ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

3. ์‹ฑ๊ธ€ํ†ค ๊ด€๋ฆฌ

  • ์Šคํ”„๋ง ๋นˆ: ์Šคํ”„๋ง์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋นˆ์„ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๊ด€๋ฆฌํ•˜์ง€๋งŒ, ํ”„๋กœํ† ํƒ€์ž…, ๋ฆฌํ€˜์ŠคํŠธ ์Šค์ฝ”ํ”„, ์„ธ์…˜ ์Šค์ฝ”ํ”„ ๋“ฑ ๋‹ค์–‘ํ•œ ์Šค์ฝ”ํ”„๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์„œ๋ธ”๋ฆฟ: ์„œ๋ธ”๋ฆฟ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๊ด€๋ฆฌ๋˜๋ฉฐ, ํ•˜๋‚˜์˜ ์„œ๋ธ”๋ฆฟ ์ธ์Šคํ„ด์Šค๊ฐ€ ์—ฌ๋Ÿฌ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ํ•„๋“œ ์‚ฌ์šฉ ์‹œ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

4. ์˜์กด์„ฑ ์ฃผ์ž…(DI)

  • ์Šคํ”„๋ง ๋นˆ: ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์˜์กด์„ฑ ์ฃผ์ž…์„ ํ†ตํ•ด ๋นˆ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•˜๊ณ  ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋นˆ์˜ ์˜์กด์„ฑ์„ ์‰ฝ๊ฒŒ ์„ค์ •ํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์„œ๋ธ”๋ฆฟ: ์„œ๋ธ”๋ฆฟ์€ ์˜์กด์„ฑ ์ฃผ์ž…์„ ์ง์ ‘์ ์œผ๋กœ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์Šคํ”„๋ง๊ณผ ์—ฐ๋™ํ•˜๋ฉด ์„œ๋ธ”๋ฆฟ์—์„œ๋„ ์Šคํ”„๋ง์˜ ๋นˆ์„ ์ฃผ์ž…๋ฐ›์•„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์„œ๋ธ”๋ฆฟ ์ž์ฒด๋Š” ์˜์กด์„ฑ ์ฃผ์ž…์„ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ง์ ‘ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ์„œ๋ธ”๋ฆฟ ์ปจํ…์ŠคํŠธ ๋“ฑ์„ ์ด์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

5. ์ปจํ…์ŠคํŠธ ๋ฐ ๋ฒ”์œ„

  • ์Šคํ”„๋ง ๋นˆ: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „๋ฐ˜์— ๊ฑธ์ณ ์‚ฌ์šฉ๋˜๋ฉฐ, ๋‹ค์–‘ํ•œ ์ปจํ…์ŠคํŠธ์—์„œ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์„œ๋น„์Šค, DAO, ์ปจํŠธ๋กค๋Ÿฌ ๋“ฑ ๋‹ค์–‘ํ•œ ๊ณ„์ธต์—์„œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์„œ๋ธ”๋ฆฟ: HTTP ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํŠน์ •ํ•œ ๋ฒ”์œ„์—์„œ๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ฃผ๋กœ ์ปจํŠธ๋กค๋Ÿฌ ์—ญํ• ์„ ํ•˜๋ฉฐ, MVC ํŒจํ„ด์—์„œ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์ž์ฃผ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๊ฒฐ๋ก ์ ์œผ๋กœ, ์Šคํ”„๋ง ๋นˆ๊ณผ ์„œ๋ธ”๋ฆฟ์€ ๋ชจ๋‘ ๊ฐ์ฒด์ด๊ณ  ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๊ด€๋ฆฌ๋  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ทธ ์—ญํ• , ๋ผ์ดํ”„์‚ฌ์ดํด ๊ด€๋ฆฌ ๋ฐฉ์‹, ์‚ฌ์šฉ๋˜๋Š” ๋ฒ”์œ„์—์„œ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ธ”๋ฆฟ์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ HTTP ์š”์ฒญ ์ฒ˜๋ฆฌ์— ํŠนํ™”๋˜์–ด ์žˆ๊ณ , ์Šคํ”„๋ง ๋นˆ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „๋ฐ˜์˜ ๋‹ค์–‘ํ•œ ๋กœ์ง์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

๐Ÿ”ฅ ์Šคํ”„๋ง๋นˆ์ด ์žˆ๋Š”๋ฐ ์„œ๋ธ”๋ฆฟ์ด ๋”ฐ๋กœ ํ•„์š”ํ•œ์ง€?

โ“ Question

์ปจํŠธ๋กค๋Ÿฌ ๊ฐ™์€ ๊ฒฝ์šฐ ํŠน์ • url์ด ์ •ํ•ด์ง„ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํƒ€๊ฒŒ ๋˜์–ด ์žˆ์ž–์•„

๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์Šคํ”„๋ง ๋นˆ์œผ๋กœ์„œ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด ์ƒ์„ฑ๋˜๊ณ  ๊ด€๋ฆฌ๋˜์ž–์•„?

๊ทธ๋Ÿผ ์„œ๋ธ”๋ฆฟ์€ ํ•„์š”์—†๋Š”๊ฑฐ ์•„๋ƒ?

 

๐Ÿ“ Answer

์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ํŠนํžˆ ์Šคํ”„๋ง MVC(Spring Web MVC)๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ์„œ๋ธ”๋ฆฟ์˜ ์—ญํ• ์€ ๋งŽ์ด ๊ฐ„์ ‘์ ์ด๊ฑฐ๋‚˜ ๊ฐ์ถฐ์ง„ ํ˜•ํƒœ๋กœ ๋‚˜ํƒ€๋‚˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์„œ๋ธ”๋ฆฟ์ด ์™„์ „ํžˆ ํ•„์š” ์—†์–ด์ง€๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์„œ๋ธ”๋ฆฟ๊ณผ ์Šคํ”„๋ง MVC ์ปจํŠธ๋กค๋Ÿฌ์˜ ๊ด€๊ณ„๋ฅผ ์ดํ•ดํ•˜๋ ค๋ฉด ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ๊ฐœ๋…์„ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

1. ์Šคํ”„๋ง MVC์™€ ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ(DispatcherServlet)

  • ์Šคํ”„๋ง MVC์—์„œ DispatcherServlet์ด๋ผ๋Š” ํŠน๋ณ„ํ•œ ์„œ๋ธ”๋ฆฟ์ด ํ•ต์‹ฌ์ ์ธ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. DispatcherServlet์€ ์Šคํ”„๋ง MVC์˜ ์ค‘์•™ ์š”์ฒญ ์ฒ˜๋ฆฌ์ž ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ HTTP ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด, ์ด ์š”์ฒญ์€ ๋จผ์ € DispatcherServlet์œผ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. DispatcherServlet์€ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ(์˜ˆ: Tomcat, Jetty ๋“ฑ)์— ์˜ํ•ด ์‹คํ–‰๋˜๋ฉฐ, ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ ์ ˆํ•œ ์Šคํ”„๋ง MVC ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์š”์ฒญ์„ ๋ผ์šฐํŒ…ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฆ‰, ์Šคํ”„๋ง MVC์—์„œ ๊ฐ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์ง์ ‘ ์„œ๋ธ”๋ฆฟ์ด ์•„๋‹ˆ์ง€๋งŒ, ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ์—์„œ DispatcherServlet์„ ํ†ตํ•ด ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค. DispatcherServlet์€ ํ•˜๋‚˜์˜ ์„œ๋ธ”๋ฆฟ์ด์ง€๋งŒ ์—ฌ๋Ÿฌ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์š”์ฒญ์„ ๋ถ„๊ธฐํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

2. ์„œ๋ธ”๋ฆฟ์˜ ์—ญํ• 

  • ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๋Š” ์—ฌ์ „ํžˆ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์š”์ฒญ๊ณผ ์‘๋‹ต ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๊ธฐ๋ณธ ์ธํ”„๋ผ์ž…๋‹ˆ๋‹ค. ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๋Š” HTTP ์š”์ฒญ์„ ๋ฐ›์•„๋“ค์ด๊ณ , ํ•ด๋‹น ์š”์ฒญ์„ ์ ์ ˆํ•œ ์„œ๋ธ”๋ฆฟ์œผ๋กœ ์ „๋‹ฌํ•˜๋ฉฐ, ์Šคํ”„๋ง MVC์—์„œ๋Š” DispatcherServlet์ด ์ด ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ์„œ๋ธ”๋ฆฟ์ด ์•„์˜ˆ ์—†์–ด์ง„๋‹ค๋ฉด, ๊ธฐ๋ณธ์ ์ธ HTTP ์š”์ฒญ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ”„๋ผ๊ฐ€ ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์Šคํ”„๋ง MVC ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์„œ๋ธ”๋ฆฟ ์—†์ด ๋…๋ฆฝ์ ์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์Šคํ”„๋ง MVC ์ปจํŠธ๋กค๋Ÿฌ๋Š” DispatcherServlet๊ณผ ๊ฐ™์€ ์„œ๋ธ”๋ฆฟ์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋ฉฐ, ์ด ์„œ๋ธ”๋ฆฟ์ด ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•ต์‹ฌ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

3. ์„œ๋ธ”๋ฆฟ๊ณผ ์ปจํŠธ๋กค๋Ÿฌ์˜ ํ˜‘๋ ฅ ๊ด€๊ณ„

  • ์Šคํ”„๋ง MVC์˜ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์„œ๋ธ”๋ฆฟ์˜ ๋ณต์žกํ•œ ์ฝ”๋“œ ์ž‘์„ฑ ์—†์ด ์š”์ฒญ ์ฒ˜๋ฆฌ ๋กœ์ง์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ธ”๋ฆฟ์ด ์ง์ ‘ HTTP ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ๋‹ค๋ฃจ๋Š” ๋ฐ˜๋ฉด, ์Šคํ”„๋ง MVC ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ(์˜ˆ: ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ, ๊ฒ€์ฆ, ๋ชจ๋ธ ์ฒ˜๋ฆฌ ๋“ฑ)์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์Šคํ”„๋ง MVC๋Š” ์ด๋Ÿฌํ•œ ์—ญํ•  ๋ถ„๋‹ด์„ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๊ฐ€ ์„œ๋ธ”๋ฆฟ์˜ ๋ณต์žก์„ฑ์„ ์ง์ ‘ ๋‹ค๋ฃฐ ํ•„์š” ์—†์ด, ๋” ๊ณ ์ˆ˜์ค€์˜ ์ถ”์ƒํ™”๋œ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•ด ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‰ฝ๊ฒŒ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•์Šต๋‹ˆ๋‹ค.

4. ๊ฒฐ๋ก 

  • ์„œ๋ธ”๋ฆฟ์ด ์™„์ „ํžˆ ํ•„์š” ์—†์–ด์ง€๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์„œ๋ธ”๋ฆฟ์€ ์—ฌ์ „ํžˆ HTTP ์š”์ฒญ์„ ๋ฐ›์•„๋“ค์ด๊ณ , ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ๋ณธ ์ธํ”„๋ผ๋กœ์„œ์˜ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ, ์Šคํ”„๋ง MVC์™€ ๊ฐ™์€ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ๊ฐœ๋ฐœ์ž๋Š” ์ง์ ‘ ์„œ๋ธ”๋ฆฟ์„ ์ž‘์„ฑํ•  ํ•„์š” ์—†์ด, ๋” ์ถ”์ƒํ™”๋œ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•ด ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • DispatcherServlet์€ ์„œ๋ธ”๋ฆฟ์ด๋ฉด์„œ๋„ ์Šคํ”„๋ง์˜ ์ปจํŠธ๋กค๋Ÿฌ์™€ ํ˜‘๋ ฅํ•˜์—ฌ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋ฏ€๋กœ, ์„œ๋ธ”๋ฆฟ์˜ ์กด์žฌ๋Š” ์—ฌ์ „ํžˆ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ, ์Šคํ”„๋ง MVC๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ์„œ๋ธ”๋ฆฟ์€ ์—ฌ์ „ํžˆ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•˜๋ฉฐ, DispatcherServlet์„ ํ†ตํ•ด ์Šคํ”„๋ง ์ปจํŠธ๋กค๋Ÿฌ์™€์˜ ํ˜‘๋ ฅ์ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

 

๐Ÿ”ฅ ์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ์—์„œ DispatcherServlet ์ด ์™ธ์˜ ์„œ๋ธ”๋ฆฟ ์‚ฌ์šฉ ์œ ๋ฌด

โ“ Question

์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ์—์„œ DispatcherServlet ์ด ์™ธ์˜ ์„œ๋ธ”๋ฆฟ๋„ ์‚ฌ์šฉ๋ผ?

 

๐Ÿ“ Answer

์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ์—์„œ DispatcherServlet ์™ธ์—๋„ ๋‹ค๋ฅธ ์„œ๋ธ”๋ฆฟ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค, ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ด์œ ๋กœ ๋‹ค๋ฅธ ์„œ๋ธ”๋ฆฟ์„ ์ถ”๊ฐ€๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ค‘ ๋ช‡ ๊ฐ€์ง€ ์ฃผ์š” ์‚ฌ๋ก€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

1. ํŒŒ์ผ ์—…๋กœ๋“œ ์ฒ˜๋ฆฌ

  • ํŒŒ์ผ ์—…๋กœ๋“œ์™€ ๊ฐ™์€ ํŠน์ • ๊ธฐ๋Šฅ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด MultipartServlet ๊ฐ™์€ ์„œ๋ธ”๋ฆฟ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์„œ๋ธ”๋ฆฟ์€ ํŒŒ์ผ ์—…๋กœ๋“œ ์š”์ฒญ์„ ๋ฐ›์•„ ํŒŒ์ผ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ํ•„์š”ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฌผ๋ก , ์Šคํ”„๋ง MVC์—์„œ ์ž์ฒด์ ์œผ๋กœ MultipartResolver๋ฅผ ์„ค์ •ํ•ด ํŒŒ์ผ ์—…๋กœ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ์„œ๋ธ”๋ฆฟ ์ˆ˜์ค€์—์„œ ๋” ์„ธ๋ถ€์ ์ธ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ๊ฒฝ์šฐ ๋ณ„๋„์˜ ์„œ๋ธ”๋ฆฟ์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„œ๋ธ”๋ฆฟ

  • ์ผ๋ถ€ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํŠน์ • ์„œ๋ธ”๋ฆฟ์„ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Jersey์™€ ๊ฐ™์€ JAX-RS ๊ตฌํ˜„์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ RESTful ์›น ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ, ServletContainer๋ผ๋Š” ์„œ๋ธ”๋ฆฟ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ๋˜ ๋‹ค๋ฅธ ์˜ˆ๋กœ, H2 Database ์ฝ˜์†”์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด H2์—์„œ ์ œ๊ณตํ•˜๋Š” WebServlet์„ ์„ค์ •ํ•ด ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

3. API ๊ฒŒ์ดํŠธ์›จ์ด ๋˜๋Š” ํ”„๋ก์‹œ ์—ญํ• 

  • API ๊ฒŒ์ดํŠธ์›จ์ด ๋˜๋Š” ํ”„๋ก์‹œ ์—ญํ• ์„ ํ•˜๋Š” ์„œ๋ธ”๋ฆฟ์„ ์ •์˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Zuul๊ณผ ๊ฐ™์€ ํ”„๋ก์‹œ ์„œ๋ธ”๋ฆฟ์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ์„œ๋น„์Šค๋กœ์˜ ์š”์ฒญ์„ ๋ผ์šฐํŒ…ํ•˜๊ฑฐ๋‚˜, ํŠน์ • ์š”์ฒญ์„ ํ•„ํ„ฐ๋ง ๋ฐ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4. ํŠน์ • ํ”„๋กœํ† ์ฝœ์„ ์ง€์›ํ•˜๋Š” ์„œ๋ธ”๋ฆฟ

  • HTTP ์™ธ์— ํŠน์ •ํ•œ ํ”„๋กœํ† ์ฝœ(์˜ˆ: WebSocket, gRPC)์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ๋ณ„๋„์˜ ์„œ๋ธ”๋ฆฟ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, WebSocket ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•  ๋•Œ๋Š” WebSocketServlet์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5. ๊ด€๋ฆฌ ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง ์„œ๋ธ”๋ฆฟ

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ด€๋ฆฌ ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์œ„ํ•ด AdminServlet ๋˜๋Š” MetricsServlet๊ณผ ๊ฐ™์€ ์„œ๋ธ”๋ฆฟ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋“ค์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ฑฐ๋‚˜ ๊ด€๋ฆฌ ํŽ˜์ด์ง€๋ฅผ ์ œ๊ณตํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • Spring Boot Actuator๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ์— ์ง์ ‘ ์•ก์„ธ์Šคํ•˜์ง€ ์•Š๊ณ  ๊ด€๋ฆฌ ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ํŠน์ • ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ๋ณ„๋„์˜ ์„œ๋ธ”๋ฆฟ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

6. ์‚ฌ์šฉ์ž ์ •์˜ ์„œ๋ธ”๋ฆฟ

  • ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํŠน์ • ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž ์ •์˜ ์„œ๋ธ”๋ฆฟ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ณ ์œ ํ•œ ์š”์ฒญ ์ฒ˜๋ฆฌ ๋กœ์ง์ด๋‚˜ ๋น„ํ‘œ์ค€ ํ”„๋กœํ† ์ฝœ์„ ์ง€์›ํ•ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉ์ž ์ •์˜ ์„œ๋ธ”๋ฆฟ์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„œ๋ธ”๋ฆฟ ์„ค์ • ๋ฐฉ๋ฒ•

  • Spring Boot์—์„œ๋Š” @ServletComponentScan ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ธ”๋ฆฟ์„ ์ž๋™์œผ๋กœ ์Šค์บ”ํ•˜๊ณ  ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋˜ํ•œ @WebServlet ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ธ”๋ฆฟ์„ ์ •์˜ํ•˜๊ฑฐ๋‚˜, ServletRegistrationBean์„ ์‚ฌ์šฉํ•ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ์„œ๋ธ”๋ฆฟ์„ ๋“ฑ๋กํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“™ ๊ฒฐ๋ก 

  • ์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ์—์„œ DispatcherServlet ์™ธ์—๋„ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์„œ๋ธ”๋ฆฟ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ํŠน์ • ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ†ตํ•ฉํ•  ๋•Œ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ํ•˜์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ์Šคํ”„๋ง ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” DispatcherServlet์ด ์ฃผ๋œ ์—ญํ• ์„ ํ•˜๋ฉฐ, ๋‹ค๋ฅธ ์„œ๋ธ”๋ฆฟ์€ ํ•„์š”์— ๋”ฐ๋ผ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

๋Œ“๊ธ€