Community

๐Ÿ•Š๏ธ 2024 ๋ฒ„ํด๋ฆฌ์ฆˆ Java SpringBoot ์ธํ„ฐ๋ทฐ ์งˆ๋ฌธ (2)

Join์€ ๋ฌด์—‡์ธ๊ฐ€์š”? Join์€ ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒฐํ•ฉํ•˜๊ธฐ ์œ„ํ•œ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. ๊ณต์œ  field๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์„œ๋กœ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์—์„œ ๊ด€๋ จ ์ •๋ณด๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ์‹œ๋‹ค: * ๊ณ ๊ฐ ํ…Œ์ด๋ธ”์€ ์ด๋ฆ„, ID์™€ ๊ฐ™์€ ๊ณ ๊ฐ ์ •๋ณด๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. * ์ฃผ๋ฌธ ํ…Œ์ด๋ธ”์€ ๊ณ ๊ฐ ID(๊ณ ๊ฐ ํ…Œ์ด๋ธ”๊ณผ ์—ฐ๊ฒฐ๋œ)๋ฅผ ํฌํ•จํ•œ ์ฃผ๋ฌธ ์ •๋ณด๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์™„์ „ํ•œ ์ •๋ณด๋ฅผ ์œ„ํ•ด, ๊ณ ๊ฐ ์ •๋ณด๋ฅผ ์ฃผ๋ฌธ ์ •๋ณด์™€ ๊ฒฐํ•ฉํ•ด ๋ณด์—ฌ์ฃผ๊ธธ ์›ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋•Œ ์กฐ์ธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. * Inner Join: ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์กฐ์ธ์ž…๋‹ˆ๋‹ค. ๋‘ ํ…Œ์ด๋ธ” ๋ชจ๋‘์— ํฌํ•จ๋œ ๋‚ด์šฉ๋งŒ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. * Left Join: ์™ผ์ชฝ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ํ–‰๊ณผ ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์˜ ์ผ์น˜ํ•˜๋Š” ํ–‰์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์˜ ํ–‰์€ null ๊ฐ’์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. * Right Join: ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ํ–‰๊ณผ ์™ผ์ชฝ ํ…Œ์ด๋ธ”์˜ ์ผ์น˜ํ•˜๋Š” ํ–‰์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ์™ผ์ชฝ ํ…Œ์ด๋ธ”์˜ ํ–‰์€ null ๊ฐ’์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. * Full Join: ์กฐ์ธ ์กฐ๊ฑด์— ์ผ์น˜ํ•˜๋Š” ํ–‰์ด ์žˆ๋Š”์ง€์— ๊ด€๊ณ„์—†์ด ๋‘ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ํ–‰์ด ๊ฒฐํ•ฉ๋ฉ๋‹ˆ๋‹ค. ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ํ–‰์€ ํ•ด๋‹น ์—ด์— null ๊ฐ’์„ ๊ฐ–์Šต๋‹ˆ๋‹ค. ย  Primary์™€ Foreign key์˜ ์ฐจ์ด์ ์ด ๋ฌด์—‡์ธ๊ฐ€์š”? [Primary Key(๊ธฐ๋ณธ ํ‚ค)] * Uniqueness: ํ…Œ์ด๋ธ”์˜ ๊ฐ ํ–‰์— ๊ณ ์œ  ์‹๋ณ„์ž๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ ˆ์ฝ”๋“œ ์ค‘๋ณต์„ ๋ฐฉ์ง€ํ•˜๊ณ  ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. * Single Key: ํ…Œ์ด๋ธ”์€ ๊ธฐ๋ณธ ํ‚ค๋ฅผ ํ•˜๋‚˜๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.ย  * Not null: ๊ธฐ๋ณธ ํ‚ค ์—ด์€ ์ผ๋ฐ˜์ ์œผ๋กœ null ๊ฐ’์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. [Foreign Key(์™ธ๋ž˜ ํ‚ค)] * Relationship Builder: ๋‘ ํ…Œ์ด๋ธ” ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธ ํ‚ค๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. * Multiple Keys: ํ•œ ํ…Œ์ด๋ธ”์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์™ธ๋ถ€ ํ‚ค๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. * Nullable: ์™ธ๋ถ€ ํ‚ค ์—ด์€ null ๊ฐ’์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ย  REST-API๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”? REST API๋Š” Representational State Transfer API์˜ ์•ฝ์ž์ž…๋‹ˆ๋‹ค. ์›น API๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๋ฐ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ์Šคํƒ€์ผ์ž…๋‹ˆ๋‹ค. ๊ฐ„๋‹จํžˆ ๋งํ•ด, HTTP ์š”์ฒญ ๋ฐ ์‘๋‹ต์„ ์‚ฌ์šฉํ•˜์—ฌ ํ†ต์‹ ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ผ๋ จ์˜ ๊ทœ์น™์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ์‚ฌ์šฉ๋œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์— ๊ด€๊ณ„์—†์ด ํ‘œ์ค€ํ™”๋œ ๋ฐฉ์‹์œผ๋กœ ์„œ๋กœ ์‰ฝ๊ฒŒ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.ย  ย  ์–ธ์ œ ์บก์Аํ™”์™€ ์ถ”์ƒํ™”๋ฅผ ์‚ฌ์šฉํ•˜๋‚˜์š”? ์บก์Аํ™”์™€ ์ถ”์ƒํ™”๋Š” ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ, ์œ ์ง€ ๋ณด์ˆ˜์„ฑ ๋ฐ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(OOP)์˜ ๊ธฐ๋ณธ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.ย  [์บก์Аํ™”] * ๋ฐ์ดํ„ฐ ์ˆจ๊น€ ๋ฐ ๋ณดํ˜ธ: ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œ์–ดํ•˜๊ณ ์ž ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ๋น„๊ณต๊ฐœ๋กœ ์„ค์ •ํ•˜๊ณ  ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๋”ฐ๋กœ ์ œ๊ณตํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•˜๊ณ  ์˜๋„ํ•˜์ง€ ์•Š๋Š” ์ˆ˜์ •์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. * ์€ํ–‰ ํด๋ž˜์Šค์—์„œ ๊ณ„์ขŒ๊ธˆ์•ก ๋ฐ์ดํ„ฐ๋ฅผ ์บก์Аํ™”ํ•˜์—ฌ ์ž…์ถœ๊ธˆ๊ณผ ๊ฐ™์€ ์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด์„œ๋งŒ ์ ‘๊ทผํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. [์ถ”์ƒํ™”] * ๊ธฐ๋Šฅ์— ์ง‘์ค‘: ์ถ”์ƒํ™”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ž˜์Šค์˜ ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์ˆจ๊ธฐ๊ณ  ์ธํ„ฐํŽ˜์ด์Šค ๋˜๋Š” ์ถ”์ƒํ™” ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ํ•„์ˆ˜ ๊ธฐ๋Šฅ๋งŒ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž๋Š” ๊ธฐ๋ณธ ์„ธ๋ถ€ ๊ตฌํ˜„์— ๋Œ€ํ•œ ๊ฑฑ์ • ์—†์ด ๊ฐ์ฒด์™€ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. [๊ฒฐ๋ก ] * ์บก์Аํ™”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณดํ˜ธํ•˜๊ณ  ๋ฐ์ดํ„ฐ ์ ‘๊ทผ์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. * ์ถ”์ƒํ™”๋ฅผ ์ด์šฉํ•˜์—ฌ "how"๋ณด๋‹ค "what"์— ์ง‘์ค‘ํ•ฉ๋‹ˆ๋‹ค. ย  Lazy Loading๊ณผ Eager Loading์„ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š” Hibernate์™€ ๊ฐ™์€ ORM ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•œ ๋‘ ๊ฐ€์ง€ ์ „๋žต์ด Lazy loding๊ณผ Eager loading์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ด€๋ จ ๊ฐ์ฒด๊ฐ€ ๋กœ๋“œ๋˜๋Š” ์‹œ๊ธฐ์™€ ๋ฐฉ๋ฒ•์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. [Lazy Loading(์ง€์—ฐ ๋กœ๋”ฉ)] * Delay Loading: ๋ฐ์ดํ„ฐ๋Š” ๋ช…์‹œ์ ์œผ๋กœ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ๊ฒ€์ƒ‰๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ์ œํ’ˆ์„ ํด๋ฆญํ•  ๋•Œ๋งŒ ์ œํ’ˆ ์„ค๋ช…์ด๋‚˜ ๋ฆฌ๋ทฐ์™€ ๊ฐ™์€ ์ •๋ณด๊ฐ€ ๋กœ๋”ฉ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. * Performance Benefits: ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๋ถˆํ•„์š”ํ•œ ์ฟผ๋ฆฌ๋ฅผ ๋ฐฉ์ง€ํ•จ์œผ๋กœ์จ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ์‹œ๊ฐ„์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. * Potential for Extra Queries: ๊ด€๋ จ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ง€์—ฐ ๋กœ๋”ฉ์œผ๋กœ ์ธํ•ด ์ถ”๊ฐ€ ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜์–ด ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. [Eager Loading(์ฆ‰์‹œ ๋กœ๋”ฉ)] * Loads Everything Upfront: ๋ชจ๋“  ๊ด€๋ จ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹จ์ผ ์ฟผ๋ฆฌ์—์„œ ๊ธฐ๋ณธ ๊ฐ์ฒด์™€ ํ•จ๊ป˜ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์ด๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์ง€ ์•Š๋”๋ผ๋„ ๋ชจ๋“  ์ œํ’ˆ ์ •๋ณด๊ฐ€ ๋ชฉ๋ก ํŽ˜์ด์ง€์— ๋กœ๋“œ๋˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. * Faster Access to Related Data: ๋ฐ์ดํ„ฐ๋ฅผ ์ด๋ฏธ ๋ถˆ๋Ÿฌ์™”์œผ๋ฏ€๋กœ ๊ด€๋ จ ์ •๋ณด์— ์ ‘๊ทผํ•  ๋•Œ ์ถ”๊ฐ€์ ์ธ ์ฟผ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ๋Œ€๋ถ€๋ถ„์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค์˜ ๊ฒฝ์šฐ ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. * Potentially Slower Initial Load: ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ ์ดˆ๊ธฐ ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์‹œ๊ฐ„์ด ๊ธธ์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ย  @GetMapping๊ณผ @PostMapping์„ ์–ธ์ œ ์‚ฌ์šฉํ•˜๋‚˜์š”? [@GetMapping] * HTTP GET ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฉ”์„œ๋“œ์—์„œ ์ด ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. * ๋ฆฌ์†Œ์Šค ๋ชฉ๋ก ๊ฐ€์ ธ์˜ค๊ธฐ * ํŠน์ • ๋ฆฌ์†Œ์Šค์˜ ์„ธ๋ถ€ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ * ๊ฒ€์ƒ‰ ๋˜๋Š” ํ•„ํ„ฐ๋ง ์š”์ฒญ ์ฒ˜๋ฆฌย  @Controller public class ProductController { @GetMapping("/products") public List getAllProducts() { // Logic to retrieve all products from the database } } [@PostMapping] * HTTP POST ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฉ”์„œ๋“œ์— ์ด ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ƒ์„ฑ ๋˜๋Š” ์—…๋ฐ์ดํŠธ ๋ชฉ์ ์œผ๋กœ ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ œ์ถœํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. * ์ƒˆ ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ * ๊ธฐ์กด ๋ฆฌ์†Œ์Šค ์—…๋ฐ์ดํŠธ * ๋ฆฌ์†Œ์Šค ์‚ญ์ œ @Controller public class ProductController { @PostMapping("/products") public Product createProduct(@RequestBody Product product) { // Logic to save the new product to the database } } ย  ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์— ๋Œ€ํ•œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๊ทœ์น™์—๋Š” ์–ด๋–ค ๊ฒƒ์ด ์žˆ๋‚˜์š”? [Same or Subclass Exception] * ์Šˆํผํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๊ฐ€ checked exception์„ ์„ ์–ธํ•  ๋•Œ, ์˜ค๋ฒ„๋ผ์ด๋”ฉ๋œ ๋ฉ”์„œ๋“œ๋Š” ๋™์ผํ•œ ์˜ˆ์™ธ๋ฅผ ์„ ์–ธํ•˜๊ฑฐ๋‚˜ ํ•ด๋‹น ์˜ˆ์™ธ์˜ ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ๋ณด๋‹ค ๊ตฌ์ฒด์ ์ธ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. class SuperClass { public void doSomething() throws IOException { // ... } } class SubClass extends SuperClass { @Override public void doSomething() throws FileNotFoundException { // Subclass of IOException // ... } } [No Checked Exception] * ๋งŒ์•ฝ ์Šˆํผํด๋ž˜์Šค ๋ฉ”์„œ๋“œ๊ฐ€ ์˜ˆ์™ธ๋ฅผ ์„ ์–ธํ•˜์ง€ ์•Š์œผ๋ฉด, ํ•˜์œ„ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋Š” checked exception์„ ์„ ์–ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, unchecked exception์€ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. class SuperClass { public void doSomething() { // ... } } class SubClass extends SuperClass { @Override public void doSomething() throws IOException { // Not allowed (superclass doesn't throw IOException) // ... } } ย  Spring MVC ํ”Œ๋กœ์šฐ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š” Spring MVC๋Š” MVC ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์„ ๋”ฐ๋ฅด๋ฉฐ, ์ด ํŒจํ„ด์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง, ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ๋ฐ ์‚ฌ์šฉ์ž์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์œ ์ง€ ๋ณด์ˆ˜์„ฑ๊ณผ ํ…Œ์ŠคํŠธ์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค. ย  1. Client Request: ์‚ฌ์šฉ์ž๊ฐ€ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด ์›น ํ”„๋กœ๊ทธ๋žจ๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•˜์—ฌ ์„œ๋ฒ„์˜ ํŠน์ • URL์— ๋Œ€ํ•œ HTTP ์š”์ฒญ์„ ๋‚ ๋ฆฝ๋‹ˆ๋‹ค. 2. DispatcherServlet Intercept: DispatcherServlet์ด Spring MVC์˜ ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ ์—ญํ• ์„ ํ•˜๋ฉฐ, ์›น ์ปจํ…Œ์ด๋„ˆ(Tomcat/Jetty)๋กœ๋ถ€ํ„ฐ ๋“ค์–ด์˜ค๋Š” ๋ชจ๋“  HTTP ์š”์ฒญ์„ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค. 3. Handler Mapping: DispatcherServlet์ด ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ฐ˜์ ์œผ๋กœ RequestMappingHandlerMapping์œผ๋กœ ๊ตฌํ˜„๋˜๋Š” HandlerMapping์„ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.ย  4. Handler Selection: HandlerMapping์€ ์š”์ฒญ URL ๋ฐ HTTP ๋ฉ”์„œ๋“œ ๊ธฐ๋ฐ˜์œผ๋กœ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ ์ ˆํ•œ ์ปจํŠธ๋กค๋Ÿฌ ํด๋ž˜์Šค ๋ฐ ๋ฉ”์„œ๋“œ๋ฅผ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค. 5. Controller Invocation: DispatcherServlet์€ ์Šคํ”„๋ง ์˜์กด์„ฑ ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹๋ณ„๋œ ์ปจํŠธ๋กค๋Ÿฌ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. (์•„์ง ์ƒ์„ฑ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—) ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์š”์ฒญ ๊ฐ์ฒด๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. 6. Model Population: ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.ย  7. View Resolution: ๋ชจ๋ธ์ด ์ฑ„์›Œ์ง€๋ฉด ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์‘๋‹ต์„ ๋ Œ๋”๋ง ํ•  ๋ทฐ๋ฅผ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ViewResolver๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ ์ ˆํ•œ ๋ทฐ ํ…œํ”Œ๋ฆฟ์„ ์„ ์ •ํ•ฉ๋‹ˆ๋‹ค.ย  8. View Rendering: ViewResolver๋Š” view name์„ ๊ธฐ์ค€์œผ๋กœ ๋ทฐ ํ…œํ”Œ๋ฆฟ์„ ์ฐพ์Šต๋‹ˆ๋‹ค. ๋ชจ๋ธ ๊ฐ์ฒด๋Š” ์ตœ์ข… HTML ์‘๋‹ต์„ ๋ Œ๋”๋ง ํ•˜๊ธฐ ์œ„ํ•ด ๋ทฐ ์—”์ง„(JSP/FreeMarker)์œผ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ๋ Œ๋”๋ง ๋œ HTML ์‘๋‹ต์€ ํด๋ผ์ด์–ธํŠธ์˜ ๋ธŒ๋ผ์šฐ์ €๋กœ ๋‹ค์‹œ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.ย  ย  ๋ฒˆ์—ญ: [https://ducktopia.tistory.com/118] ์›๋ฌธ:

์•Œ๋ฆผ

์•Œ๋ฆผ์ด ์—†์Šต๋‹ˆ๋‹ค