JavaRush /Java Blog /Random-KO /์ทจ์—…์„ ์œ„ํ•œ ์‹œํ—˜๊ณผ์ œ, ์•Œ์•„๋ณด์ž..
timurnav
๋ ˆ๋ฒจ 21

์ทจ์—…์„ ์œ„ํ•œ ์‹œํ—˜๊ณผ์ œ, ์•Œ์•„๋ณด์ž..

Random-KO ๊ทธ๋ฃน์— ๊ฒŒ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค
์นœ๊ตฌ๋“ค, ์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„. ์ €๋Š” ๋Ÿฌ์‹œ์•„ ํšŒ์‚ฌ์—์„œ Java ๊ฐœ๋ฐœ์ž์˜ ์ง€์œ„์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ๊ณผ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ๊ฒฝํ—˜์„ ์—ฌ๋Ÿฌ๋ถ„๊ณผ ๊ณต์œ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ณผ์ œ์˜ ์ฃผ์š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ํŠน๋ณ„ํžˆ ์–ด๋ ต์ง€๋Š” ์•Š์ง€๋งŒ ํ•ญ์ƒ ๊ทธ๋ ‡๋“ฏ์ด ์„ธ๋ถ€ ์‚ฌํ•ญ๊ณผ ์ž‘์€ ๊ฒƒ๋“ค์ด ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ œ ์‹œ๊ฐ„์— ์ œ์ถœํ•  ์ˆ˜ ์—†์—ˆ์œผ๋ฉฐ ๊ณผ์ œ์— ๋Œ€ํ•ด ์•„๋ฌด ๋Œ€๋‹ต๋„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ณด๋ƒˆ์„ ๋•Œ ์ด๋ฏธ ๊ฐ€๋“ ์ฐจ ์žˆ์—ˆ์–ด์š”. ๋‚ด๊ฐ€ ๋‚˜์—๊ฒŒ ์š”๊ตฌ๋˜๋Š” ๋ชจ๋“  ์ผ์„ ์ˆ˜ํ–‰ํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์—…์„ ์กฐ์‚ฌํ•ด ๋ณด์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ป๊ฒŒ ๋งŒ๋“œ๋Š”์ง€ ๋ชจ๋ฅด์‹œ๋Š” ๋ถ„๋“ค์„ ์œ„ํ•ด ์ œ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ–ˆ๋Š”์ง€ ๋ฌผ์„ ๋งŽ์ด ์ถ”๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด์— ๊ด€์‹ฌ์ด ์žˆ๋Š” ๋ถ„์ด๋ผ๋ฉด ๊ณ ์–‘์ด์— ์˜ค์‹  ๊ฒƒ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์ „์ฒด ์†”๋ฃจ์…˜์„ ๊ฒŒ์‹œํ•˜์ง€๋Š” ์•Š๊ฒ ๋‹ค๊ณ  ๋ฐ”๋กœ ๋ง์”€๋“œ๋ฆฌ์ง€๋งŒ, ์ดˆ๋ณด์ž๋ฅผ ์œ„ํ•œ ๋งŽ์€ ์„ค๋ช…์ด ์žˆ์„ ๊ฒƒ์ด๋ฉฐ, ๋ˆ„๊ตฐ๊ฐ€ ์ œ ๊ธ€์„ ์ฝ๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์—†๋‹ค๋ฉด ์—ฌ๊ธฐ github์— ์žˆ๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค . ์ž‘์—… ์ž์ฒด์˜ ํ…์ŠคํŠธ์ž…๋‹ˆ๋‹ค.
ํ…Œ์ŠคํŠธ ๊ณผ์ œ 1๋ฒˆ
์„ค๋ช…: API ์„œ๋ฒ„(JSON HTTP API) ๊ฐœ๋ฐœ ๋„๊ตฌ: Java ํ”„๋ ˆ์ž„์›Œํฌ: Play Framework 2.4(๋˜๋Š” ์ด์ƒ) ๋˜๋Š” Spring boot 1.2.3(๋˜๋Š” ์ด์ƒ) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค: MySQL ํ”„๋กœํ† ์ฝœ: HTTP, ํฌํŠธ 80 ๊ธฐ๋Šฅ(์š”์ฒญ):
  1. ์ง์„ ์‹ฃ๋Š” ์‚ฌ๋žŒ.
    • ํŒŒ์ผ(JPG ์•„๋ฐ”ํƒ€ ์‚ฌ์ง„)์„ ์„œ๋ฒ„๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋ฏธ์ง€๋ฅผ ์„œ๋ฒ„์˜ ๋””๋ ‰ํ† ๋ฆฌ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
    • ์„œ๋ฒ„ ์‘๋‹ต์€ ์ด๋ฏธ์ง€์˜ ๋‚ด๋ถ€ URI์ž…๋‹ˆ๋‹ค.
  2. ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    • ๋‹น์‚ฌ๋Š” ์‚ฌ์šฉ์ž์˜ ๊ฐœ์ธ ๋ฐ์ดํ„ฐ(์ด๋ฏธ์ง€์˜ URI, ์‚ฌ์šฉ์ž ์ด๋ฆ„, ์ด๋ฉ”์ผ ๋“ฑ)๋ฅผ ์„œ๋ฒ„๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
    • ์šฐ๋ฆฌ๋Š” ์ •๋ณด๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
    • ์„œ๋ฒ„ ์‘๋‹ต์€ ์ƒˆ ์‚ฌ์šฉ์ž์˜ ๊ณ ์œ  ID์ž…๋‹ˆ๋‹ค.
  3. ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.
    • ๊ณ ์œ ํ•œ ์‚ฌ์šฉ์ž ID๋ฅผ ์„œ๋ฒ„๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ •๋ณด๋ฅผ ์ฝ๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.
    • ์„œ๋ฒ„์˜ ์‘๋‹ต์€ ์‚ฌ์šฉ์ž์˜ ๊ฐœ์ธ ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค(์œ„ ์ฐธ์กฐ).
  4. ์‚ฌ์šฉ์ž ์ƒํƒœ ๋ณ€๊ฒฝ(์˜จ๋ผ์ธ, ์˜คํ”„๋ผ์ธ)
    • ๊ณ ์œ ํ•œ ์‚ฌ์šฉ์ž ID์™€ ์ƒˆ๋กœ์šด ์ƒํƒœ(์˜จ๋ผ์ธ, ์˜คํ”„๋ผ์ธ)๋ฅผ ์„œ๋ฒ„๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
    • ์‚ฌ์šฉ์ž ์ƒํƒœ ๋ณ€๊ฒฝ.
    • ์„œ๋ฒ„ ์‘๋‹ต - ๊ณ ์œ ํ•œ ์‚ฌ์šฉ์ž ID, ์‹ ๊ทœ ๋ฐ ์ด์ „ ์ƒํƒœ.
    ์ฐธ๊ณ : ์„œ๋ฒ„๊ฐ€ ์™ธ๋ถ€ API/๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ฟผ๋ฆฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‹จ์ˆœํ™”๋œ ํ…Œ์ŠคํŠธ ์ž‘์—…์ด๋ฏ€๋กœ ์‹œ๋ฎฌ๋ ˆ์ด์…˜๋œ ์•ก์„ธ์Šค์™€ 5~10์ดˆ์˜ ์‹œ๊ฐ„ ์ง€์—ฐ์ด ์žˆ๋Š” "์Šคํ…"์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  5. ์„œ๋ฒ„ ํ†ต๊ณ„.
    • ์šฐ๋ฆฌ๋Š” ์„œ๋ฒ„์— ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค: 1. ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ(์˜จ๋ผ์ธ, ์˜คํ”„๋ผ์ธ ๋˜๋Š” ๋ถ€์žฌ), 2. ์š”์ฒญ์˜ ๊ณ ์œ  ID(ํƒ€์ž„์Šคํƒฌํ”„)(๋ถ€์žฌํ•  ์ˆ˜ ์žˆ์Œ)
    • ์„œ๋ฒ„ ์‘๋‹ต์€ ์ƒํƒœ, ์‚ฌ์ง„ URI, ์š”์ฒญ์˜ ๊ณ ์œ  ID(ํƒ€์ž„์Šคํƒฌํ”„)๊ฐ€ ํฌํ•จ๋œ ์‚ฌ์šฉ์ž ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.
    ์ฐธ๊ณ : ์š”์ฒญ์— ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํฌํ•จ๋œ ๊ฒฝ์šฐ ์„œ๋ฒ„๋Š” ์ด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์‘๋‹ต์„ ํ•„ํ„ฐ๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ์— ์š”์ฒญ(์ด์ „์— ์ˆ˜์‹ ๋จ)์˜ ๊ณ ์œ  ID(ํƒ€์ž„์Šคํƒฌํ”„)๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ์„œ๋ฒ„๋Š” ์ด ๊ณ ์œ  ID(ํƒ€์ž„์Šคํƒฌํ”„) ์ดํ›„์— ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋œ ์‚ฌ์šฉ์ž๋งŒ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
ํ•„์ˆ˜ ์š”๊ตฌ์‚ฌํ•ญ:
- ํŽธ์•ˆํ•ด์š”. - ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋Š” JSON ํ˜•์‹์ž…๋‹ˆ๋‹ค. - API ์„œ๋ฒ„๋Š” ์š”์ฒญ 3๊ณผ 5๊ฐ€ (์š”์ฒญ 1, 2, 4์— ๋น„ํ•ด) ๊ฐ€์žฅ ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง€๋ฉฐ ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ์™„๋ฃŒ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•˜์—ฌ ์„ค๊ณ„๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. - ์ฒ˜๋ฆฌ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
์„ ํƒ์  ์š”๊ตฌ์‚ฌํ•ญ(๋ฐ”๋žŒ์งํ•จ):
- ์ฝ”๋“œ ๋ฌธ์„œํ™”. - API ์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜๋Š” ๋†’์€ ๋ถ€ํ•˜์™€ ํ™•์žฅ์„ฑ์„ ๊ฐ–๋„๋ก ์„ค๊ณ„๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. - ํ…Œ์ŠคํŠธ.
๊ฒ€์‚ฌ ๊ฒฐ๊ณผ:
- ํ…Œ์ŠคํŠธ ์ž‘์—…์˜ ๊ฒฐ๊ณผ๋Š” ์•„์นด์ด๋ธŒ์— ๋ฐฐํฌ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ง€์นจ๊ณผ ํ•จ๊ป˜ ์ œ๊ณต๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ์ž‘์—…์„ ์œ„ํ•œ Docker ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋นŒ๋“œํ•˜๋ ค๋ฉด Dockerfile์„ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. github.com์—์„œ ๋‹ค์šด๋กœ๋“œ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. - ์ƒ์„ฑ๋œ API์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ๋ฌธ์„œ๋ฅผ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์š”์ฒญ ๋ชฉ๋ก, ์š”์ฒญ ๋งค๊ฐœ๋ณ€์ˆ˜, ์š”์ฒญ ํ˜•์‹, ์‘๋‹ต ํ˜•์‹ ๋“ฑ). - ์„ค๊ณ„, ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ๋ฌธ์„œํ™” ๋“ฑ์˜ ๋งฅ๋ฝ์—์„œ ํ…Œ์ŠคํŠธ ์ž‘์—…์— ์†Œ์š”๋œ ์‹œ๊ฐ„์— ๋Œ€ํ•œ ์ •๋ณด ์ด ํ…Œ์ŠคํŠธ ์ž‘์—…์€ ์ง€์‹๊ณผ ๊ธฐ์ˆ ์„ ํ‰๊ฐ€ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ผ ๋ฟ ์™„์ œํ’ˆ(API ์„œ๋ฒ„)์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์„ค๋ช…๊ณผ ์ด์œ ๋ฅผ ํฌํ•จํ•œ ๋‹จ์ˆœํ™”๊ฐ€ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.
์„ธ์‹ฌํ•˜๊ณ  ์ˆ™๋ จ๋œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ๋‹ค์Œ ์„น์…˜์„ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ์ž‘์—… ์ž์ฒด์˜ ํ…์ŠคํŠธ๋ฅผ ๋‹ค๋ฃจ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ž‘์—…์˜ "ํ—ค๋”"๋Š” ์ดํ•ดํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€์„ ์ผ์œผํ‚ค์ง€ ์•Š์œผ๋ฏ€๋กœ ๋‚ด ์„ ํƒ์ด Spring Boot์— ์žˆ๋‹ค๊ณ  ๋งํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฏธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด ์•„๋‹ˆ๋ผ ์ด๋ฏธ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์ œ ํ”„๋กœ์ ํŠธ๋ฅผ ์™„๋ฃŒํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. Spring (ํ•˜์ง€๋งŒ ๋‹จ์ˆœ์„ฑ ๋•Œ๋ฌธ์— Boot๋Š” ๊ฑฐ๊ธฐ์— ์—†์—ˆ์Šต๋‹ˆ๋‹ค.) ์„œ๋ฒ„ ๊ธฐ๋Šฅ์— ๋”ฐ๋ผ: 1) ํŒŒ์ผ ๋‹ค์šด๋กœ๋”. ์—ฌ๊ธฐ์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณต์žกํ•œ ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค. ์‚ฌ์ง„์ด ์ผ๋ฐ˜์ ์œผ๋กœ ์„œ๋ฒ„์— ์–ด๋–ป๊ฒŒ ์ €์žฅ๋˜๋Š”์ง€ ์•Œ์•„๋‚ด๋ฉด ๋˜์—ˆ๊ณ , ๊ฐ€์žฅ ํŽธ๋ฆฌํ•œ ๋ฐฉ๋ฒ•์€ ์‚ฌ์ง„์„ ํŠน๋ณ„ํ•œ ๋””๋ ‰ํ† ๋ฆฌ์— ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์—์„œ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 2) ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์ž‘์—…์ž…๋‹ˆ๋‹ค. CRUD ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“  ์ ์ด ์žˆ๋‹ค๋ฉด ๊ทธ๋Š” ๋‚˜๋ฅผ ์ง€์›ํ•  ๊ฒƒ์ด๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์•„๋ž˜์˜ ๋ชจ๋“  ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 3) ์ด์šฉ์ž์— ๊ด€ํ•œ ์ •๋ณด๋ฅผ ์ทจ๋“ํ•ฉ๋‹ˆ๋‹ค. ์งˆ๋ฌธ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค. 4)์‚ฌ์šฉ์ž ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—…์˜ ์ฒ˜์Œ ๋‘ ๊ฐ€์ง€ ์‚ฌํ•ญ์€ ๋‚ ์งœ๋กœ ๋ช…ํ™•ํ•˜์ง€๋งŒ ์™ธ๋ถ€ ์š”์ฒญ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ??? 100g์ด ์—†์œผ๋ฉด ์•Œ์•„๋‚ด๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ๋„ ์ œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ–ˆ๋Š”์ง€ 100% ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. 5)์„œ๋ฒ„ ํ†ต๊ณ„. ์ด๊ฒƒ๋„ ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์š”์ ์€ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๋‹ค์–‘ํ•œ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ์ œ์•ˆํ•˜์ง€๋งŒ, ์ด๊ฒƒ์ด ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์†Œ๋“œ์—ฌ์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„์ง ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ์š”์ ์€ ์ž ์‹œ ํ›„ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋œ ๋ชจ๋“  ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฌป๋Š” ๊ฒƒ์œผ๋กœ, ๋ถ„๋ช…ํ•œ ๊ฒƒ ๊ฐ™์ง€๋งŒ ๋ฏธ๋ฌ˜ํ•จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์‹œ์ž‘ํ•˜๊ธฐ
์•„, ์ด ์ž‘์—…์„ ํ•˜๋ฉด์„œ ์ด ๋ฌธ๊ตฌ๋ฅผ ๋ช‡ ๋ฒˆ์ด๋‚˜ ์ฝ์—ˆ๋Š”์ง€! Spring์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋‚ด๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ์ง€๋งŒ ์–ด๋–ค ์ด์œ ๋กœ Spring Boot๋ฅผ ์‚ฌ์šฉํ•ด ๋ณธ ์ ์ด ์—†๋‹ค๋ฉด ์ถ•ํ•˜ํ•ฉ๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์•„๋ž˜์— ์“ธ ๋‚ด์šฉ์— ๋งค์šฐ ๊ธฐ๋ปํ•˜์‹ค ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ํ”„๋กœ์ ํŠธ์—์„œ ํ”„๋กœ์ ํŠธ๋กœ ๋งค์šฐ ๋งŽ์€ ์–‘์˜ ์ฝ”๋“œ๋ฅผ ์ „์†กํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ–ˆ๋˜ ๊ณณ์„ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ…œํ”Œ๋ฆฟ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์„ค์ •, ์„œ๋ธ”๋ฆฟ ๋งคํ•‘ ๋“ฑ์„ ์œ„ํ•œ ์„ค์ •์ž…๋‹ˆ๋‹ค. ์ž‘์—…์„ ์œ„ํ•œ ํ…œํ”Œ๋ฆฟ ์ฝ”๋“œ ์šฐ๋ฆฌ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— JPA/Hibernate๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ํ…œํ”Œ๋ฆฟ์„ ์ˆจ๊ธฐ์ง€๋งŒ ์ด๋ฅผ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์‹œ xml ํŒŒ์ผ์ด๋‚˜ ๊ตฌ์„ฑ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ž‘์€ ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋” ์ ์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ทธ ๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ Spring์—์„œ JPA ์ž‘์—…์„ ๋งˆ๋ฌด๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์€ ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์ง€๋งŒ ๊ฐ€์žฅ ํŽธ๋ฆฌํ•œ ๊ฒƒ์€ ๋ฌผ๋ก  Spring Data์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ JPA, NoSQL ๋ฐ ๋‹ค์–‘ํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ํฌํ•จํ•˜์—ฌ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋งค์šฐ ํฐ ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค. ๋ฏฟ์„ ์ˆ˜ ์—†์„ ์ •๋„๋กœ ๋งˆ๋ฒ•์ ์ด๋ฏ€๋กœ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. Spring์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์„ค์ •์ด ๊ฑฐ์˜ ์ œ๊ฑฐ๋˜๊ณ  Spring์ด ์šฐ๋ฆฌ๋ฅผ ์œ„ํ•ด ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํŠธ๋žœ์žญ์…˜์„ฑ, ์บ์‹ฑ ๋ฐ ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ ์ปจํ…์ŠคํŠธ ๊ตฌ์„ฑ์—์„œ Google(๋‹ค๋ฅธ ํ•ญ๋ชฉ ์ฐธ์กฐ)์— ๋Œ€ํ•œ ๊ธฐํƒ€ ์„ค์ •์— ํ•„์š”ํ•œ ์ฃผ์„๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋™์‹œ์— ๋Œ€๋ถ€๋ถ„์˜ ์ดˆ๋ณด ๊ฐœ๋ฐœ์ž๋Š” Spring์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ „ํ˜€ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. localhost:8080/*๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋งํฌ๋ฅผ ๋”ฐ๋ผ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ฒฐ๊ณผ๋ฅผ ์–ป๋„๋ก ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์™„์ „ํžˆ ์•„๋Š” ์‚ฌ๋žŒ์€ ์•„๋ฌด๋„ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Spring Boot๊ฐ€ ๋“ฑ์žฅํ•ฉ๋‹ˆ๋‹ค! ๊ตฌ์ฒด์ ์ธ ์˜ˆ๋ฅผ ๋“ค์–ด Spring Boot์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค! ๊ณต๋ฐฑ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Spring Boot ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด Spring ๊ฐœ๋ฐœ์ž๋Š” ํ…œํ”Œ๋ฆฟ ์ƒ์„ฑ์„ ์œ„ํ•œ "์ƒ์„ฑ์ž"๋ฅผ ๊ณ ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์›น์‚ฌ์ดํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์„ ํ˜ธํ•˜๋Š” IDE์ธ Intellij IDEA์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. File->New->Project ์ฐฝ์—์„œ Spring ์ดˆ๊ธฐํ™” ํƒญ์œผ๋กœ ์ด๋™ํ•˜๋ฉด jdk๊ฐ€ ๊ทธ ์•ˆ์— ์„ค์ •๋˜์–ด์•ผ ํ•˜๊ณ  URL์€ https://start.spring.io์ด๋ฉฐ ์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ์„ ํ™•์ธํ•œ ๋‹ค์Œ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„๊ณผ ์‚ฌ์šฉํ•  ๊ธฐ์ˆ ์„ ์„ ํƒํ•˜๋ ค๋ฉด ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„์—์„œ๋Š” WEB๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜†์— ์ฒดํฌ ํ‘œ์‹œ๋ฅผ ํ•˜๋ฉด ํ”„๋กœ์ ํŠธ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. Maven์ด ๋ชจ๋“  ์ข…์†์„ฑ์„ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ์•„์ด๋””์–ด์—์„œ Maven ํƒญ์„ ์—ด๊ณ  ์—…๋ฐ์ดํŠธ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ํ†ต์‹ ์„ ์œ„ํ•œ ๋ชจ๋“  ์„ค์ •์ด ํฌํ•จ๋œ ๊ธฐ์„ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ…œํ”Œ๋ฆฟ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ์ฒซ์ธ์ƒ์„ ์–ป๊ธฐ ์œ„ํ•ด ์ปจํŠธ๋กค๋Ÿฌ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ MVC์— ๋Œ€ํ•ด ๋“ค์–ด๋ณธ ์ ์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  Spring ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋งค์šฐ ๋‹จ์ˆœํ•œ ๋””์ž์ธ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” @Controller ์ฃผ์„(@RestController์™€ ๊ฐ™์€ ์ ‘๋‘์‚ฌ๊ฐ€ ๊ฐ€๋Šฅํ•จ)์œผ๋กœ ํ‘œ์‹œ๋œ ํด๋ž˜์Šค์ด๋ฉฐ, ์ด ํด๋ž˜์Šค๋Š” ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ผ๋ถ€ ์ฃผ์†Œ์— ๋Œ€ํ•œ ์š”์ฒญ์„ ์ธ์‹ํ•˜๋ ค๋ฉด ์ด ์ฃผ์†Œ๋ฅผ ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์„œ๋“œ์— ๋งคํ•‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping(value = "/hello") public class DemoController { @RequestMapping(method = RequestMethod.GET) public String halloWorld() { return "Hello World!"; } @RequestMapping(value = "/{name}", method = RequestMethod.GET) public String halloName(@PathVariable("name") String name) { return "Hello, " + name + "!"; } } ์—ฌ๊ธฐ์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์•Œ์•„ ๋ด…์‹œ๋‹ค. @RestController . ์œ„์—์„œ ์“ด ์ฃผ์„๊ณผ ๋˜‘๊ฐ™์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ฒฐ๊ณผ๋ฅผ ์ฆ‰์‹œ ๋ณด๊ณ  ์‹ถ๊ณ  .jsp ํŽ˜์ด์ง€๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋จธ์ง€ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. (์™€์šฐ) ๊ฒฐ๊ณผ๋ฅผ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ฌธ์ž์—ด๋กœ ์ฆ‰์‹œ ๋ณด๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. @RequestMapping์€ ๋‹จ์ง€ ์ฃผ์†Œ์— ๋Œ€ํ•œ ๋ฐ”์ธ๋”ฉ์ž…๋‹ˆ๋‹ค. ๊ณต๊ฐœ ์ฃผ์†Œ ์ ‘๋‘์‚ฌ๋Š” localhost:8080์ž…๋‹ˆ๋‹ค. ๋ณด์‹œ๋‹ค์‹œํ”ผ, ์ „์ฒด ํด๋ž˜์Šค๊ฐ€ /hello ์ฃผ์†Œ์— ์ •์ง€๋ฉ๋‹ˆ๋‹ค . ์ด๋Š” ์ด ํด๋ž˜์Šค ๋‚ด์˜ ๋ชจ๋“  ๋ฉ”์†Œ๋“œ์— ์ ‘๋‘์–ด localhost:8080/hello๊ฐ€ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ํด๋ž˜์Šค์˜ ์ฒซ ๋ฒˆ์งธ ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. ์ž์ฒด ๋งคํ•‘์—๋Š” Http ํ”„๋กœํ† ์ฝœ ๋ฉ”์„œ๋“œ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. GET ์š”์ฒญ(Http ํ”„๋กœํ† ์ฝœ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด ์ง์ ‘ ์ฝ์–ด๋ณด์„ธ์š”.) ์ด๊ฒƒ์ด ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? localhost:8080/hello ์ฃผ์†Œ๋กœ GET ์š”์ฒญ์„ ํ•˜๋ฉด โ€œHello World!โ€ ๋ฌธ์ž์—ด ํ˜•์‹์˜ ์‘๋‹ต์„ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค! DemoApplication ํด๋ž˜์Šค์—๋Š” @SpringBootApplication์ด๋ผ๋Š” ์ „์ฒด Spring ์ปจํ…์ŠคํŠธ๋ฅผ ๋‹จ๋…์œผ๋กœ ์‹คํ–‰ํ•œ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ‹์ง„ ์ฃผ์„์ด ํ•˜๋‚˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํด๋ž˜์Šค์˜ ๊ธฐ๋ณธ ๋ฉ”์†Œ๋“œ๋Š” ๋งˆ๋ฒ•์ฒ˜๋Ÿผ ๋ณ€ํ•ฉ๋‹ˆ๋‹ค. SpringApplication์— ์ˆจ๊ฒจ์ง„ ๋ชจ๋“  ๋งˆ๋ฒ•์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ํด๋ž˜์Šค์—์„œ ์ปจํ…์ŠคํŠธ ๋ฉ”๋‰ด๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์‹คํ–‰ ๋ผ์ธ์— ์˜ต์…˜์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋…น์ƒ‰ ํ‘œ์‹œ๋กœ ์ผ์ฐ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ฝ˜์†”์€ ๋” ๋ณด๊ธฐ ์ข‹์•„์งˆ ๊ฒƒ์ด๋ฉฐ ์•ž์œผ๋กœ๋Š” ์ฝ˜์†”์—์„œ ์ง์ ‘ ๋กœ๊ทธ๋ฅผ ์ฝ๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์›Œ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฝ˜์†” ์ถœ๋ ฅ์ด ์ค‘์ง€๋˜๋ฉด ์ฝ˜์†”์— ํ‘œ์‹œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
2015-09-02 09:25:36.895 INFO 5844 --- [ ๋ฉ”์ธ] sbceTomcatEmbeddedServletContainer : Tomcat์ด ํฌํŠธ์—์„œ ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค: 8080 (http) 2015-09-02 09:25:36.900 INFO 5844 --- [ ๋ฉ”์ธ] ๋ฐ๋ชจ.DemoApplication : ****์ดˆ ๋งŒ์— DemoApplication์„ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค(JVM์€ 15.501์—์„œ ์‹คํ–‰ ์ค‘).
์—ฌ๊ธฐ์„œ "****"๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ๊ธฐ๊ฐ„์ž…๋‹ˆ๋‹ค. ๊ทธ ํ›„ ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €(๋˜๋Š” ์ปฌ ๋˜๋Š” ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ํ•ญ๋ชฉ)์—์„œ ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์†Œ๋“œ๊ฐ€ ๋งคํ•‘๋œ ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋กœ์ปฌ ํ˜ธ์ŠคํŠธ:8080/์•ˆ๋…•ํ•˜์„ธ์š”
๋ธŒ๋ผ์šฐ์ €๋Š” ํ‘œ์ค€์„ ํ‘œ์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค
์•ˆ๋…•ํ•˜์„ธ์š” ์›”๋“œ!
์—ฌ๊ธฐ ๋‹น์‹ ์„ ์œ„ํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค! ์ปจํŠธ๋กค๋Ÿฌ์— ๋‹ค๋ฅธ ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ•œ ๊ฒฝ์šฐ ์ž์ฒด ์ฃผ์†Œ ๋งคํ•‘์ด ์žˆ์œผ๋ฉฐ ์ž๋ฆฌ ํ‘œ์‹œ์ž๊ฐ€ ํ˜„์žฌ ์ฃผ์†Œ์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” Spring์— ์˜ํ•ด ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฉ”์†Œ๋“œ์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. @PathVariable ์ฃผ์„์ด ์ด์— ๋Œ€ํ•œ ์ฑ…์ž„์ด ์žˆ๋‹ค๊ณ  ์ถ”์ธกํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์š”์ฒญ์— ๋”ฐ๋ผ
localhost:8080/hello/๋‹น์‹ ์˜ ์ด๋ฆ„
๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค
์•ˆ๋…•ํ•˜์„ธ์š”, ๋‹น์‹ ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค!
Spring Boot์˜ ๊ธฐ๋ณธ ์‚ฌํ•ญ์„ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ฒจ๋ถ€ํ•  ์˜ˆ์ •์ธ๋ฐ, ์ด์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค์Œ ํฌ์ŠคํŠธ์—์„œ ๋‹ค๋ฃจ๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ชจ๋‘์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.
์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION