์ƒˆ๋กœ์šด ๋‚ด์šฉ์„ ๊ณต๋ถ€ํ•  ๋•Œ
์ƒˆ๋กœ์šด ๋‚ด์šฉ์˜ ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ ์šฉ์–ด์˜ ์ •์˜๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๊ฑฐ๋‚˜ ์ •ํ™•ํ•˜๊ฒŒ ์•Œ์ง€ ๋ชปํ•œ๋‹ค๋ฉด ๊ทธ ์šฉ์–ด๊ฐ€ ํฌํ•จ๋œ ๋ฌธ์žฅ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
์ž‘์€ ๋‹จ์–ด ํ•˜๋‚˜๊ฐ€ ๋‚ด์šฉ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์šฉ์–ด๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

1 ๋ถ„ ์†Œ์š”

๐Ÿ“Œ 2025-02-22 TIL

1. ์˜ค๋Š˜์˜ ํ•™์Šต ์ฃผ์ œ

viewResolver์˜ ๊ฐœ๋…์„ ์•Œ์•„๋ณด์ž

2. ์˜ค๋Š˜์˜ ํ•™์Šต์ •๋ฆฌ

๋ทฐ ๋ฆฌ์กธ๋ฒ„๋ž€

  • ๋ทฐ ๋ฆฌ์กธ๋ฒ„๋Š” ์Šคํ”„๋ง mvc์—์„œ ๋ทฐ ์ด๋ฆ„์„ ๋ทฐ ๊ฐ์ฒด๋กœ ๋งคํ•‘ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๋Š” ๋ทฐ ๋ Œ๋”๋ง ๋นˆ์ž…๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž๊ฐ€ URL ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด, ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋ทฐ ์ด๋ฆ„๋งŒ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๋ทฐ ๋ฆฌ์กธ๋ฒ„๋Š” ํ•ด๋‹น ์ด๋ฆ„์— ๋งž๋Š” ๊ฒฝ๋กœ์™€ ํ™•์žฅ์ž๋ฅผ ๋ถ™์—ฌ ์‹ค์ œ ๋ทฐ๋ฅผ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.
  • ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋ทฐ์˜ ๊ฒฝ๋กœ ๋ฐ ๊ตฌํ˜„ ๊ธฐ์ˆ ์— ์˜์กดํ•˜์ง€ ์•Š๊ฒŒ ๋˜๋ฉฐ, ์œ ์—ฐํ•˜๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์„ค๊ณ„๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋ทฐ์˜ ๊ฒฝ๋กœ โ€œuser/static/intex.htmlโ€ ๋‚˜ ํด๋ž˜์Šค์˜ ๊ฒฝ๋กœ๋‚˜ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ชจ๋‘ ์•Œ๊ณ  ์žˆ์œผ๋ฉด ๊ฐ•ํ•œ ๊ฒฐํ•ฉ์ด ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ทฐ ๋ฆฌ์กธ๋ฒ„๋ฅผ ์‚ฌ์šฉํ• ๊นŒ?

์˜์กด์„ฑ์˜ ๋ถ„๋ฆฌ์™€ ์œ ์ง€๋ณด์„ฑ

  • ๋ทฐ ๋ฆฌ์กธ๋ฒ„๋Š” ์ปจํŠธ๋กค๋Ÿฌ์™€ ๋ทฐ์˜ ๊ฐ•ํ•œ ๊ฒฐํ•ฉ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ๋А์Šจํ•œ ๊ฒฐํ•ฉ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋ทฐ์˜ ๊ฒฝ๋กœ๋‚˜ ํ™•์žฅ์ž๋ฅผ ์•Œ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ด๋Š” ์„ค์ •ํŒŒ์ผ์ด๋‚˜ ๋นˆ ์„ค์ •์„ ๋ทฐ์˜ ์ด๋ฆ„์œผ๋กœ ๋ทฐ๋ฅผ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ์–ด ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋†’์•„์ง„๋‹ค.
  • Spring์˜ ioc/di ์ฒ ํ•™์— ๋”ฐ๋ผ, ๋ทฐ์˜ ์ƒ์„ฑ๊ณผ ๊ด€๋ฆฌ๋Š” ์ปจํŠธ๋กค๋Ÿฌ(์‚ฌ์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ)๊ฐ€ ์•„๋‹ˆ๋ผ ์ŠคํŠธ๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋‹ด๋‹นํ•œ๋‹ค.

๋™์ž‘์›๋ฆฌ

  1. ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€์˜ ๋ทฐ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. `return โ€œindexโ€;

  2. ๋ทฐ ๋ฆฌ์กธ๋ฒ„๊ฐ€ ์ด๋ฆ„์„ ํ•ด์„ํ•ฉ๋‹ˆ๋‹ค.

    ์ด๋•Œ ๋ทฐ ๋ฆฌ์กธ๋ฒ„ ํ›„๋ณด๋ฆฌ์ŠคํŠธ์—์„œ resolveName ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ง€์›ํ•˜๋Š” ๋ทฐ ๋ฆฌ์กธ๋ฒ„๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค

  3. ์‹ค์ œ ๋ทฐ ๋ Œ๋ฉ: ์ƒ์„ฑ๋œ ๊ฒฝ๋กœ๋ฅผ ํ†ตํ•ด ๋ทฐ ๊ฐ์ฒด๋ฅผ ๋ Œ๋”๋ง.

๊ตฌํ˜„์ฒด

InternalResourceViewResolver

  • jsp์™€ ๊ฐ™์€ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง ๋ทฐ์— ์‚ฌ์šฉํ•œ๋‹ค.
  • redirect:, forward: ๊ฐ€ ๋ถ™์€ ๊ฒฝ์šฐ ๋™์ž‘ํ•œ๋‹ค.

ThymeleafViewResolver

  • ํƒ€์ž„๋ฆฌํ”„ ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ์‚ฌ์šฉํ•˜๋Š” ๋ทฐ ๋ Œ๋”์ผ์ž…๋‹ˆ๋‹ค.
  • ์„œ๋ฒ„์‚ฌ์ด๋“œ ๋ Œ๋”๋ง์— ํฌํ•จ๋˜๋ฉฐ, boot์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

JsonViewResolver

  • RESTful API ๊ฐœ๋ฐœ์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ, JSON ์‘๋‹ต์„ ๋ฐ˜ํ™˜
  • @ResponseBody์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ ๊ตฌ์ฒด์ ์ธ ๋ทฐ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ ์ฐจ์ด๊ฐ€ ์žˆ์Œ.

๋ทฐ ๋ฆฌ์กธ๋ฒ„ ์‚ฌ์šฉ์˜ ์žฅ์ 

  1. ์œ ์ง€๋ณด์ˆ˜์„ฑ: ๋ทฐ ์—”์ง„ ๊ต์ฒด ์‹œ ์ปจํŠธ๋กค๋Ÿฌ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š์•„๋„ ๋จ.
  2. ์œ ์—ฐํ•œ ์„ค๊ณ„: ์„ค์ • ํŒŒ์ผ๋งŒ ์ˆ˜์ •ํ•ด์„œ ๋ทฐ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
  3. ์˜์กด์„ฑ ๋ถ„๋ฆฌ: ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋ทฐ์˜ ์„ธ๋ถ€ ๊ตฌํ˜„์„ ๋ชฐ๋ผ๋„ ๋จ.

๋ทฐ ๋ฆฌ์กธ๋ฒ„ ์‚ฌ์šฉ์˜ ๋‹จ์ 

  1. ์„ค์ • ๋ณต์žก๋„**: ์—ฌ๋Ÿฌ ๋ทฐ ๋ฆฌ์กธ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ **์šฐ์„ ์ˆœ์œ„ ๊ด€๋ฆฌ๊ฐ€ ๋ณต์žก.
  2. ๋””๋ฒ„๊น… ์–ด๋ ค์›€: ๋ทฐ ๋งคํ•‘์ด ์ž˜๋ชป๋  ๊ฒฝ์šฐ ๋””๋ฒ„๊น…์ด ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์Œ
  3. JSON ์‘๋‹ต์˜ ํ•œ๊ณ„: ์ตœ๊ทผ ํŠธ๋ Œ๋“œ์ธ SPA ํ”„๋ ˆ์ž„์›Œํฌ(Vue, React)์™€๋Š” JsonViewResolver๋ณด๋‹ค @ResponseBody๊ฐ€ ๋” ์ž์ฃผ ์‚ฌ์šฉ๋จ.

๋Œ€์•ˆ๊ณผ์˜ ๋น„๊ต

@ResponseBody ๋ฐ @RestController:

  • ์žฅ์ : JSON ์‘๋‹ต์„ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ ๋ทฐ ๋ฆฌ์กธ๋ฒ„๋ฅผ ์šฐํšŒ.
  • ๋‹จ์ : ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ JSON ๊ตฌ์กฐ์— ์ง์ ‘ ์˜์กดํ•˜๊ฒŒ ๋จ.

json ๊ตฌ์กฐ์— ์˜์กดํ•œ๋‹ค๋Š” ์ด์•ผ๊ธฐ

์‘๋‹ต ํฌ๋ฉง์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ปจํŠธ๋กค๋Ÿฌ ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•ด์•ผํ•œ๋‹ค.

ํ•˜์ง€๋งŒ view ๋ฆฌ์กธ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์š”์ฒญ ํ—ค๋”์— ๋”ฐ๋ผ ๋‹ค์–‘ํ•œ ์‘๋‹ต ํฌ๋ฉง์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํƒœ๊ทธ:

์นดํ…Œ๊ณ ๋ฆฌ:

์—…๋ฐ์ดํŠธ:

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ