๊ด‘๊ณ  ์ฐจ๋‹จ ํ”„๋กœ๊ทธ๋žจ์ด ๊ฐ์ง€๋˜์—ˆ์Šต๋‹ˆ๋‹ค

์ด ์‚ฌ์ดํŠธ๋Š” ๊ด‘๊ณ  ์ˆ˜์ต์„ ํ†ตํ•ด ๋ฌด๋ฃŒ๋กœ ์ฝ˜ํ…์ธ ์™€ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋” ๋‚˜์€ ์„œ๋น„์Šค๋ฅผ ์œ„ํ•ด ๊ด‘๊ณ  ์ฐจ๋‹จ ํ”„๋กœ๊ทธ๋žจ์„ ๋น„ํ™œ์„ฑํ™” ํ•ด์ฃผ์„ธ์š”.

๊ด‘๊ณ  ์ฐจ๋‹จ ํ•ด์ œ ๋ฐฉ๋ฒ• ๋ณด๊ธฐ
Loading...

Django 'NoReverseMatch' ์˜ค๋ฅ˜

Django 'NoReverseMatch' ์˜ค๋ฅ˜์— ๋Œ€ํ•œ img

๐Ÿ“š Django 'NoReverseMatch' ์˜ค๋ฅ˜ ๋งˆ์Šคํ„ฐ ์ฒญ์‚ฌ์ง„


๐Ÿ’ก ์ƒํ™ฉ ํ•ด๋…

  • ํ˜„์žฌ ์ƒํƒœ: ์›น์‚ฌ์ดํŠธ์˜ ํŠน์ • ํŽ˜์ด์ง€(/webtools)์— ์ ‘์†ํ•˜๋ฉด "์„œ๋ฒ„ ๋‚ด๋ถ€ ์˜ค๋ฅ˜ (500)" ๋ฉ”์‹œ์ง€๊ฐ€ ๋œจ๋ฉด์„œ ํŽ˜์ด์ง€๊ฐ€ ์—ด๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ์„œ๋ฒ„ ๋กœ๊ทธ์—๋Š”ย NoReverseMatch๋ผ๋Š” ์ด๋ฆ„์˜ ์˜ค๋ฅ˜๊ฐ€ ๊ธฐ๋ก๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ•ต์‹ฌ ์Ÿ์ :
  • ์›น ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ, ํŠน์ • ๋งํฌ(URL)๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์‹œ์Šคํ…œ์€ย 'clova'๋ผ๋Š” ์ด๋ฆ„ํ‘œ๊ฐ€ ๋ถ™์€ ๊ธธ(URL ์ฃผ์†Œ)์„ ์ฐพ์œผ๋ผ๋Š” ์ง€์‹œ๋ฅผ ๋ฐ›์•˜์ง€๋งŒ, ๊ทธ๋Ÿฐ ์ด๋ฆ„ํ‘œ๋ฅผ ๊ฐ€์ง„ ๊ธธ์ด ์–ด๋””์—๋„ ๋“ฑ๋ก๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ด ๋•Œ๋ฌธ์— ํŽ˜์ด์ง€ ์ „์ฒด๋ฅผ ์™„์„ฑํ•˜์ง€ ๋ชปํ•˜๊ณ  ์˜ค๋ฅ˜๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์˜ˆ์ƒ vs ํ˜„์‹ค: ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ์ด ํŽ˜์ด์ง€๊ฐ€ ๋ฌธ์ œ์—†์ด ์ž˜ ๋ณด์˜€๋Š”๋ฐ, ์‹ค์ œ ์šด์˜ ์„œ๋ฒ„์—์„œ๋Š” ๊ฐ‘์ž๊ธฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ๋งํฌ๊ฐ€ ์ž˜ ์—ฐ๊ฒฐ๋  ๊ฒƒ์ด๋ผ๊ณ  ์˜ˆ์ƒํ–ˆ์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ์‹œ์Šคํ…œ์ด ํ•ด๋‹น ๋งํฌ์˜ ์ฃผ์†Œ๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์˜ํ–ฅ ๋ฒ”์œ„: ์‚ฌ์šฉ์ž๋Š”ย /webtoolsย ํŽ˜์ด์ง€์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ํ•ด๋‹น ํŽ˜์ด์ง€์— ํฌํ•จ๋œ ๊ธฐ๋Šฅ(์›น ๋„๊ตฌ ๋ชฉ๋ก)์„ ์ „ํ˜€ ์ด์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์›น์‚ฌ์ดํŠธ์˜ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ ์ผ๋ถ€๊ฐ€ ๋งˆ๋น„๋œ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.


๐Ÿ” ์›์ธ ํˆฌ์‹œ

  • ๊ทผ๋ณธ ์›์ธ: ์›น ํŽ˜์ด์ง€(HTML ํ…œํ”Œ๋ฆฟ) ์ฝ”๋“œ ์–ด๋”˜๊ฐ€์—์„œย {% url 'clova' %}๋ผ๋Š” ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 'clova'๋ผ๋Š” ๋ณ„๋ช…์„ ๊ฐ€์ง„ URL ์ฃผ์†Œ๋ฅผ ๋งŒ๋“ค์–ด๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹ค์ œ URL ๊ฒฝ๋กœ๋ฅผ ์ •์˜ํ•˜๋Š” ํŒŒ์ผ(urls.py)์—๋Š” 'clova'๋ผ๋Š” ๋ณ„๋ช…์œผ๋กœ ๋“ฑ๋ก๋œ ์ฃผ์†Œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ฆ‰,ย ์—†๋Š” ๋ณ„๋ช…์œผ๋กœ ์ฃผ์†Œ๋ฅผ ์ฐพ์•„๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•œ ๊ฒƒ์ด ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
  • ์—ฐ๊ฒฐ ๊ณ ๋ฆฌ:
  1. ์‚ฌ์šฉ์ž๊ฐ€ย /webtoolsย ํŽ˜์ด์ง€๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
  2. ์„œ๋ฒ„(Django)๋Š” ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ดย webtools/tool_list.htmlย ํ…œํ”Œ๋ฆฟ ํŒŒ์ผ์„ ์ฝ์Šต๋‹ˆ๋‹ค.
  3. ํ…œํ”Œ๋ฆฟ ํŒŒ์ผ ์•ˆ์—๋Š” ์›น ๋„๊ตฌ ๋ชฉ๋ก์„ ๋ณด์—ฌ์ฃผ๋Š” ๋ถ€๋ถ„์ด ์žˆ๊ณ , ๊ฐ ๋„๊ตฌ๋กœ ๊ฐ€๋Š” ๋งํฌ๋ฅผย {% url '๋ณ„๋ช…' %}ย ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•ด ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  4. 'AI ์ฑ—๋ด‡' ๋„๊ตฌ ์ฐจ๋ก€์—์„œ, ์‹œ์Šคํ…œ์€ย webtools.jsonย ํŒŒ์ผ์— ์ ํžŒย url_nameย ๊ฐ’('clova')์„ ๊ฐ€์ ธ์™€ย {% url 'clova' %}๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  5. Django์˜ URL ์‹œ์Šคํ…œ์€ ๋“ฑ๋ก๋œ ๋ชจ๋“  URL ํŒจํ„ด์„ ๋’ค์ ธ๋ณด์ง€๋งŒ 'clova'๋ผ๋Š” ๋ณ„๋ช…์„ ๊ฐ€์ง„ ํŒจํ„ด์„ ์ฐพ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
  6. ์ฃผ์†Œ๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ์œผ๋ฏ€๋กœย NoReverseMatchย ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ  ํŽ˜์ด์ง€ ๋ Œ๋”๋ง์„ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค.
  7. ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” 500 ์„œ๋ฒ„ ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
  • ์ผ์ƒ ๋น„์œ :
  • ์ž˜๋ชป๋œ ๋ณ„๋ช… ๋ถ€๋ฅด๊ธฐ: ์นœ๊ตฌ์—๊ฒŒ "์•ผ, 'ํด๋กœ๋ฐ”' ์–ด๋”” ๊ฐ”์–ด?"๋ผ๊ณ  ๋ฌผ์—ˆ๋Š”๋ฐ, ์•„๋ฌด๋„ ๊ทธ ์นœ๊ตฌ๋ฅผ 'ํด๋กœ๋ฐ”'๋ผ๊ณ  ๋ถ€๋ฅด์ง€ ์•Š๊ณ  ๊ณต์‹ ๋ณ„๋ช…์€ '์ฑ—๋ด‡'์ธ ์ƒํ™ฉ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์€ 'ํด๋กœ๋ฐ”'๊ฐ€ ๋ˆ„๊ตฌ์ธ์ง€ ๋ชจ๋ฅด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์˜ค๋ž˜๋œ ์ฃผ์†Œ๋ก ์‚ฌ์šฉ: ์ด์‚ฌ ๊ฐ„ ์นœ๊ตฌ์˜ ์˜›๋‚  ์ฃผ์†Œ๋กœ ํŽธ์ง€๋ฅผ ๋ณด๋‚ด๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์†Œ๋ก์—๋Š” 'clova'๋ผ๋Š” ์˜›๋‚  ์ฃผ์†Œ๋งŒ ์ ํ˜€์žˆ๊ณ , ์‹ค์ œ ์šฐํŽธ ์‹œ์Šคํ…œ(URL ์‹œ์Šคํ…œ)์—๋Š” ๊ทธ ์ฃผ์†Œ๊ฐ€ ๋” ์ด์ƒ ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ๋ฉ”๋‰ดํŒ์— ์—†๋Š” ๋ฉ”๋‰ด ์ฃผ๋ฌธ: ์‹๋‹น ๋ฉ”๋‰ดํŒ์— 'ํด๋กœ๋ฐ” ์ •์‹'์ด ์—†๋Š”๋ฐ, ์›จ์ดํ„ฐ์—๊ฒŒ 'ํด๋กœ๋ฐ” ์ •์‹'์„ ๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•˜๋Š” ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค. ์ฃผ๋ฐฉ(URL ์‹œ์Šคํ…œ)์—์„œ๋Š” ๊ทธ๋Ÿฐ ๋ฉ”๋‰ด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ˆจ๊ฒจ์ง„ ์š”์†Œ:
  • ๋„ค์ž„์ŠคํŽ˜์ด์Šค(Namespace): Django์—์„œ๋Š” ์•ฑ๋ณ„๋กœ URL ๋ณ„๋ช… ์ถฉ๋Œ์„ ๋ง‰๊ธฐ ์œ„ํ•ด '์†Œ์†'์„ ํ‘œ์‹œํ•˜๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค(์˜ˆ:ย 'CLOVA:chat_interface')๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์—†์ด ๋ณ„๋ช…๋งŒ ์‚ฌ์šฉํ–ˆ๊ฑฐ๋‚˜, ์ž˜๋ชป๋œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ์ž์ฃผ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ์„ค์ • ํŒŒ์ผ ๋ถ„๋ฆฌ: ๊ฐœ๋ฐœ ํ™˜๊ฒฝ๊ณผ ์šด์˜ ํ™˜๊ฒฝ์˜ ์„ค์ •(settings/development.py,ย settings/production.py)์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. URL ์„ค์ • ์ž์ฒด๋Š” ๊ฐ™๋”๋ผ๋„, URL ์ƒ์„ฑ์„ ์œ„ํ•ด ์ฐธ์กฐํ•˜๋Š” ๋ฐ์ดํ„ฐ(์˜ˆ:ย webtools.json)๊ฐ€ ํ™˜๊ฒฝ๋ณ„๋กœ ๋‹ค๋ฅด๊ฑฐ๋‚˜ ๋™๊ธฐํ™”๋˜์ง€ ์•Š์•˜์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์ด๋ฒˆ ๊ฒฝ์šฐ๋Š”ย webtools.json์˜ย url_name์ด ์ž˜๋ชป๋œ ๊ฒƒ์ด ์›์ธ์ด์—ˆ์Šต๋‹ˆ๋‹ค.)
  • ํ…œํ”Œ๋ฆฟ ์ƒ์†/ํฌํ•จ: ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œย {% url 'clova' %}ย ์ฝ”๋“œ๊ฐ€ ์ง์ ‘์ ์œผ๋กœย webtools/tool_list.html์— ์—†์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ…œํ”Œ๋ฆฟ์ด ์ƒ์†๋ฐ›๋Š” ๋ถ€๋ชจ ํ…œํ”Œ๋ฆฟ(base.htmlย ๋“ฑ)์ด๋‚˜ ํฌํ•จํ•˜๋Š” ๋‹ค๋ฅธ ์ž‘์€ ํ…œํ”Œ๋ฆฟ ์กฐ๊ฐ ์•ˆ์— ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์ด๋ฒˆ ๊ฒฝ์šฐ๋Š”ย webtools.json์„ ์ฐธ์กฐํ•˜๋Š”ย tool_list.html์—์„œ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.)


๐Ÿ› ๏ธ ํ•ด๊ฒฐ ์„ค๊ณ„๋„

  1. ์˜ค๋ฅ˜ ์ง€์  ํ™•์ธ (ํ…œํ”Œ๋ฆฟ ๋˜๋Š” ์ฐธ์กฐ ๋ฐ์ดํ„ฐ)
  • ํ•ต์‹ฌ ํ–‰๋™:ย NoReverseMatchย ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์—์„œ ์–ด๋–ค URL ์ด๋ฆ„('clova')์„ ์ฐพ์ง€ ๋ชปํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ์ด ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ณณ์„ ์ฐพ์Šต๋‹ˆ๋‹ค.
  • ์‹คํ–‰ ๊ฐ€์ด๋“œ:
  1. ์„œ๋ฒ„ ๋กœ๊ทธ์—์„œย NoReverseMatch: Reverse for 'clova' not found...ย ๋ฉ”์‹œ์ง€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ 'clova'๊ฐ€ ๋ฌธ์ œ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
  2. webtools/tool_list.htmlย ํ…œํ”Œ๋ฆฟ ํŒŒ์ผ์„ ์—ฝ๋‹ˆ๋‹ค.
  3. ํ…œํ”Œ๋ฆฟ ์ฝ”๋“œ์—์„œย {% url ... %}ย ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ถ„์„ ์ฐพ์Šต๋‹ˆ๋‹ค.
  4. ํŠนํžˆย webtoolsย ๋ณ€์ˆ˜๋ฅผ ๋ฐ˜๋ณตํ•˜๋ฉฐ ๊ฐย tool์˜ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ถ„์„ ์ฃผ๋ชฉํ•ฉ๋‹ˆ๋‹ค.ย {% url tool.url_name %}ย ๋˜๋Š” ์œ ์‚ฌํ•œ ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  5. ๋งŒ์•ฝ ์œ„ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด,ย tool.url_nameย ๊ฐ’์ด 'clova'๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ์ด๋Š”ย webtools.jsonย ํŒŒ์ผ์—์„œ 'AI ์ฑ—๋ด‡' ๋„๊ตฌ์˜ย url_name์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.
  • ์„ฑ๊ณต ์ง€ํ‘œ: ํ…œํ”Œ๋ฆฟ ์ฝ”๋“œ ๋˜๋Š”ย webtools.jsonย ํŒŒ์ผ์—์„œ 'clova'๋ผ๋Š” ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋Š” ์ •ํ™•ํ•œ ์œ„์น˜๋ฅผ ์ฐพ์•„๋ƒ…๋‹ˆ๋‹ค.
  • ์˜ˆ์‹œ/์ฝ”๋“œย (ํ•ด๋‹น์‹œ -ย webtools.jsonย ์ˆ˜์ •):
// ๋ณ€๊ฒฝ ์ „ (webtools/config/webtools.json ๋‚ด๋ถ€)
{
  "title": "AI ์ฑ—๋ด‡",
  "description": "์ธ๊ณต์ง€๋Šฅ๊ณผ ๋Œ€ํ™”ํ•˜๊ธฐ",
  "url_name": "clova", // <<< ๋ฌธ์ œ์˜ ์›์ธ
  "icon": "fas fa-robot",
  "category": "webtools", // ๋˜๋Š” ai-tools
  "order": 15,
  "is_active": true
}

// ๋ณ€๊ฒฝ ํ›„
{
  "title": "AI ์ฑ—๋ด‡",
  "description": "์ธ๊ณต์ง€๋Šฅ๊ณผ ๋Œ€ํ™”ํ•˜๊ธฐ",
  "url_name": "CLOVA:chat_interface", // <<< ์˜ฌ๋ฐ”๋ฅธ ์ด๋ฆ„์œผ๋กœ ์ˆ˜์ •
  "icon": "fas fa-robot",
  "category": "webtools", // ๋˜๋Š” ai-tools
  "order": 15,
  "is_active": true
}

// ํ•ต์‹ฌ ๋ณ€ํ™” ์„ค๋ช…
// AI ์ฑ—๋ด‡ ๋„๊ตฌ์˜ URL ๋ณ„๋ช…์„ Django URL ์‹œ์Šคํ…œ์ด ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋Š”
// ์ •ํ™•ํ•œ ์ด๋ฆ„('CLOVA' ์•ฑ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ 'chat_interface' ๋ณ„๋ช…)์œผ๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ฃผ์˜์‚ฌํ•ญ:ย webtools.json์„ ์ˆ˜์ •ํ•˜๋Š” ๋Œ€์‹  ํ…œํ”Œ๋ฆฟ(webtools/tool_list.html)์„ ์ˆ˜์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ดย {% url tool.url_name %}ย ๋Œ€์‹ ย href="{{ tool.url }}"ย ์ฒ˜๋Ÿผ ๋ฏธ๋ฆฌ ์ƒ์„ฑ๋œ URL ๊ฒฝ๋กœ๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ JSON ํŒŒ์ผ์—์„œ ์ •ํ™•ํ•œย url_name์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ๋” ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค.
  1. ์˜ฌ๋ฐ”๋ฅธ URL ์ด๋ฆ„ ํ™•์ธ
  • ํ•ต์‹ฌ ํ–‰๋™: 'clova' ๋Œ€์‹  ์‚ฌ์šฉํ•ด์•ผ ํ•  ์ •ํ™•ํ•œ URL ๋ณ„๋ช…๊ณผ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ์‹คํ–‰ ๊ฐ€์ด๋“œ:
  1. CLOVA AI ์ฑ—๋ด‡ ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•˜๋Š” Django ์•ฑ ๋””๋ ‰ํ† ๋ฆฌ (django/CLOVA/)๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  2. urls.pyย ํŒŒ์ผ์„ ์—ฝ๋‹ˆ๋‹ค.
  3. ํŒŒ์ผ ์ƒ๋‹จ์—ย app_name = 'CLOVA'ย ์™€ ๊ฐ™์ด ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. (๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ์ค‘์š”!)
  4. urlpatternsย ๋ฆฌ์ŠคํŠธ์—์„œ ์ฑ—๋ด‡ ๋ทฐ์™€ ์—ฐ๊ฒฐ๋œย path()ย ํ•จ์ˆ˜๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.
  5. ํ•ด๋‹นย path()ย ํ•จ์ˆ˜์˜ย name='...'ย ๋ถ€๋ถ„์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. (์˜ˆ:ย name='chat_interface')
  6. ์˜ฌ๋ฐ”๋ฅธ ์ „์ฒด ์ด๋ฆ„์€ย '๋„ค์ž„์ŠคํŽ˜์ด์Šค:์ด๋ฆ„'ย ํ˜•์‹์ž…๋‹ˆ๋‹ค. (์˜ˆ:ย 'CLOVA:chat_interface')
  • ์„ฑ๊ณต ์ง€ํ‘œ: CLOVA ์ฑ—๋ด‡ URL์˜ ์ •ํ™•ํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์™€ ๋ณ„๋ช…์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ์‹œ/์ฝ”๋“œย (ํ•ด๋‹น์‹œ -ย CLOVA/urls.pyย ํ™•์ธ):
# django/CLOVA/urls.py
from django.urls import path
from . import views

app_name = 'CLOVA'  # <<< ๋„ค์ž„์ŠคํŽ˜์ด์Šค ํ™•์ธ ('CLOVA')

urlpatterns = [
    path('', views.clova_chat, name='chat_interface'), # <<< ๋ณ„๋ช… ํ™•์ธ ('chat_interface')
]

# ๋”ฐ๋ผ์„œ ์˜ฌ๋ฐ”๋ฅธ ์ด๋ฆ„์€ 'CLOVA:chat_interface' ์ž…๋‹ˆ๋‹ค.
  • ์ฃผ์˜์‚ฌํ•ญ: ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ์ •ํ™•ํžˆ ๊ตฌ๋ถ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 'clova'์™€ 'CLOVA'๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
  1. ์„ค์ • ์ ์šฉ ๋ฐ ํ…Œ์ŠคํŠธ
  • ํ•ต์‹ฌ ํ–‰๋™: ์ˆ˜์ •๋œ ๋‚ด์šฉ์„ ์ €์žฅํ•˜๊ณ , ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์ ์šฉ๋˜๋„๋ก ์„œ๋ฒ„๋ฅผ ์žฌ์‹œ์ž‘ํ•œ ํ›„, ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ์‹คํ–‰ ๊ฐ€์ด๋“œ:
  1. webtools.jsonย ํŒŒ์ผ์„ ์ˆ˜์ •ํ•œ ๊ฒฝ์šฐ, ํŒŒ์ผ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  2. ์šด์˜ ํ™˜๊ฒฝ์˜ Django ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์žฌ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. (์ด์ „ ๊ฒฝํ—˜์ƒย docker-compose downย ํ›„ย docker-compose up์ด ์บ์‹œ ๋ฌธ์ œ๊นŒ์ง€ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋” ํ™•์‹คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)
  3. ๋ธŒ๋ผ์šฐ์ €์—์„œย /webtoolsย ํŽ˜์ด์ง€์— ๋‹ค์‹œ ์ ‘์†ํ•˜์—ฌ 500 ์˜ค๋ฅ˜ ์—†์ด ํŽ˜์ด์ง€๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋กœ๋“œ๋˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  4. ํŽ˜์ด์ง€ ๋‚ด์˜ 'AI ์ฑ—๋ด‡' ๋งํฌ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ์ฃผ์†Œ(/clova/)๋กœ ์—ฐ๊ฒฐ๋˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ์„ฑ๊ณต ์ง€ํ‘œ:ย /webtoolsย ํŽ˜์ด์ง€๊ฐ€ ์˜ค๋ฅ˜ ์—†์ด ์—ด๋ฆฌ๊ณ  ๋ชจ๋“  ๋งํฌ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฃผ์˜์‚ฌํ•ญ: ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•œ ํ›„์—๋Š” ํ•ญ์ƒ ์บ์‹œ๋ฅผ ๋น„์šฐ๊ฑฐ๋‚˜ ์„œ๋ฒ„๋ฅผ ์™„์ „ํžˆ ์žฌ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์บ์‹œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿง  ํ•ต์‹ฌ ๊ฐœ๋… ํ•ด๋ถ€

  • URL ์ด๋ฆ„(name) & ๋„ค์ž„์ŠคํŽ˜์ด์Šค(namespace): ์ผ์ƒ์  ์žฌ์ •์˜
  • 5์‚ด์—๊ฒŒ ์„ค๋ช…ํ•œ๋‹ค๋ฉด: ์›น์‚ฌ์ดํŠธ ํŽ˜์ด์ง€๋งˆ๋‹ค ๋ณ„๋ช…์„ ์ง€์–ด์ฃผ๋Š” ๊ฑฐ์•ผ. '์ฑ—๋ด‡๋ฐฉ'์ฒ˜๋Ÿผ. ๊ทธ๋Ÿฐ๋ฐ ๋‹ค๋ฅธ ์•ฑ์—๋„ '์ฑ—๋ด‡๋ฐฉ'์ด ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ, ์•ž์— 'ํด๋กœ๋ฐ”๋„ค_์ฑ—๋ด‡๋ฐฉ'์ฒ˜๋Ÿผ ์†Œ์†(๋„ค์ž„์ŠคํŽ˜์ด์Šค)์„ ๋ถ™์—ฌ์„œ ํ—ท๊ฐˆ๋ฆฌ์ง€ ์•Š๊ฒŒ ํ•˜๋Š” ๊ฑฐ์ง€.
  • ์‹ค์ƒํ™œ ์˜ˆ์‹œ: ํšŒ์‚ฌ์—์„œ ๊ฐ™์€ ์ด๋ฆ„(๊น€์ฒ ์ˆ˜)์„ ๊ฐ€์ง„ ์‚ฌ๋žŒ์ด ์—ฌ๋Ÿฌ ๋ช… ์žˆ์„ ๋•Œ, "์˜์—…๋ถ€ ๊น€์ฒ ์ˆ˜"์ฒ˜๋Ÿผ ๋ถ€์„œ(๋„ค์ž„์ŠคํŽ˜์ด์Šค)๋ฅผ ๋ถ™์—ฌ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. 'CLOVA:chat_interface'๋Š” 'CLOVA ์•ฑ์— ์†Œ์†๋œ chat_interface๋ผ๋Š” ๋ณ„๋ช…์„ ๊ฐ€์ง„ URL'์ด๋ผ๋Š” ๋œป์ž…๋‹ˆ๋‹ค.
  • ์ˆจ๊ฒจ์ง„ ์ค‘์š”์„ฑ: URL ์ฃผ์†Œ(/clova/)๋ฅผ ์ฝ”๋“œ์— ์ง์ ‘ ์“ฐ๋Š” ๋Œ€์‹  ๋ณ„๋ช…์„ ์“ฐ๋ฉด, ๋‚˜์ค‘์— ์ฃผ์†Œ๋ฅผ ๋ฐ”๊ฟ”์•ผ ํ•  ๋•Œ URL ์„ค์ • ํŒŒ์ผ(urls.py)๋งŒ ๊ณ ์น˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋ณ„๋ช…์„ ์‚ฌ์šฉํ•œ ๋ชจ๋“  ๋งํฌ๊ฐ€ ์ž๋™์œผ๋กœ ์ƒˆ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋˜์–ด ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ๋งค์šฐ ํŽธ๋ฆฌํ•ด์ง‘๋‹ˆ๋‹ค. (ํ•˜๋“œ์ฝ”๋”ฉ ๋ฐฉ์ง€)
  • ์˜คํ•ด์™€ ์ง„์‹ค:
  • ์˜คํ•ด: URL ์ด๋ฆ„์€ ๋Œ€์ถฉ ์ง€์–ด๋„ ๋œ๋‹ค.
  • ์ง„์‹ค: ๋ช…ํ™•ํ•˜๊ณ  ์ผ๊ด€๋œ ๊ทœ์น™์œผ๋กœ ์ด๋ฆ„์„ ์ง€์–ด์•ผ ํ•˜๋ฉฐ, ํŠนํžˆ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ์•ฑ๊ณผ์˜ ์ถฉ๋Œ์„ ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์˜คํ•ด: ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ๋ณต์žกํ•˜๋‹ˆ ์•ˆ ์จ๋„ ๋œ๋‹ค.
  • ์ง„์‹ค: ์•ฑ์ด ๋งŽ์•„์ง€๋ฉด ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์—†์ด๋Š” ์ด๋ฆ„ ์ถฉ๋Œ๋กœ ํฐ ํ˜ผ๋ž€์ด ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.
  • {% url %}ย ํ…œํ”Œ๋ฆฟ ํƒœ๊ทธ: ์ผ์ƒ์  ์žฌ์ •์˜
  • 5์‚ด์—๊ฒŒ ์„ค๋ช…ํ•œ๋‹ค๋ฉด: ์›น ํŽ˜์ด์ง€์— ๋ฒ„ํŠผ์ด๋‚˜ ๋งํฌ๋ฅผ ๋งŒ๋“ค ๋•Œ, "์ด ๋ฒ„ํŠผ ๋ˆ„๋ฅด๋ฉด 'ํด๋กœ๋ฐ”๋„ค_์ฑ—๋ด‡๋ฐฉ'์œผ๋กœ ๊ฐ€!"๋ผ๊ณ  ์‹œํ‚ค๋Š” ๋งˆ๋ฒ• ์ฃผ๋ฌธ์ด์•ผ. ๊ทธ๋Ÿผ Django๊ฐ€ ์•Œ์•„์„œ ์ง„์งœ ์ฃผ์†Œ(/clova/)๋ฅผ ์ฐพ์•„์„œ ๋งํฌ๋ฅผ ๋งŒ๋“ค์–ด์ค˜.
  • ์‹ค์ƒํ™œ ์˜ˆ์‹œ: ์ „ํ™”๋ฒˆํ˜ธ๋ถ€์— ์นœ๊ตฌ ์ด๋ฆ„('์ฑ—๋ด‡')๋งŒ ์ €์žฅํ•ด๋‘๊ณ , ์ „ํ™”๋ฅผ ๊ฑธ ๋•Œ ์ด๋ฆ„๋งŒ ๋ˆ„๋ฅด๋ฉด ์ „ํ™”๊ธฐ๊ฐ€ ์•Œ์•„์„œ ์‹ค์ œ ๋ฒˆํ˜ธ('010-1234-5678')๋ฅผ ์ฐพ์•„ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.
  • ์ˆจ๊ฒจ์ง„ ์ค‘์š”์„ฑ: URL ์ฃผ์†Œ๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด๋„ ํ…œํ”Œ๋ฆฟ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.ย urls.py์—์„œ ๋ณ„๋ช…์— ์—ฐ๊ฒฐ๋œ ์ฃผ์†Œ๋งŒ ๋ฐ”๊พธ๋ฉดย {% url %}ย ํƒœ๊ทธ๊ฐ€ ํ•ญ์ƒ ์ตœ์‹  ์ฃผ์†Œ๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋ฏ€๋กœ ์›น์‚ฌ์ดํŠธ ์ „์ฒด์˜ ๋งํฌ๋ฅผ ์ผ๊ด€๋˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์˜คํ•ด์™€ ์ง„์‹ค:
  • ์˜คํ•ด: ๊ทธ๋ƒฅย <a href="/clova/">ย ์ฒ˜๋Ÿผ ์ฃผ์†Œ๋ฅผ ์ง์ ‘ ์“ฐ๋Š” ๊ฒŒ ๋” ์‰ฝ๋‹ค.
  • ์ง„์‹ค: ๋‹น์žฅ์€ ์‰ฌ์›Œ ๋ณด์ด์ง€๋งŒ, ๋‚˜์ค‘์— URL ๊ตฌ์กฐ๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๋ชจ๋“  ํ…œํ”Œ๋ฆฟ์„ ์ฐพ์•„ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” 'ํ•˜๋“œ์ฝ”๋”ฉ์˜ ์žฌ์•™'์„ ๋งž์ดํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.ย {% url %}ย ์‚ฌ์šฉ์€ ์žฅ๊ธฐ์ ์œผ๋กœ ํ›จ์”ฌ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.
  • Traceback (์˜ค๋ฅ˜ ์ถ”์  ๊ธฐ๋ก): ์ผ์ƒ์  ์žฌ์ •์˜
  • 5์‚ด์—๊ฒŒ ์„ค๋ช…ํ•œ๋‹ค๋ฉด: ์ปดํ“จํ„ฐ๊ฐ€ ์ผ์„ ํ•˜๋‹ค๊ฐ€ ๋ญ”๊ฐ€ ์ž˜๋ชป๋˜๋ฉด, "๋‚˜ ์—ฌ๊ธฐ์„œ ๋„˜์–ด์กŒ์–ด!" ํ•˜๊ณ  ์•Œ๋ ค์ฃผ๋Š” ์ชฝ์ง€์•ผ. ์–ด๋””์„œ ์‹œ์ž‘ํ•ด์„œ ์–ด๋–ค ๊ธธ์„ ๊ฑฐ์ณ ์–ด๋””์„œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ๋Š”์ง€ ์ˆœ์„œ๋Œ€๋กœ ์ ํ˜€์žˆ์–ด.
  • ์‹ค์ƒํ™œ ์˜ˆ์‹œ: ํƒ์ •์ด ๋ฒ”์ฃ„ ํ˜„์žฅ์—์„œ ๋ฐœ์ž๊ตญ์„ ๋”ฐ๋ผ๊ฐ€๋ฉฐ ๋ฒ”์ธ์ด ์–ด๋””์„œ ์™€์„œ ์–ด๋””๋กœ ๊ฐ”๋Š”์ง€ ์ถ”์ ํ•˜๋Š” ๊ณผ์ •๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. Traceback์€ ์ฝ”๋“œ ์‹คํ–‰ ๊ฒฝ๋กœ๋ฅผ ์—ญ์ถ”์ ํ•˜์—ฌ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์ง€์ ์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.
  • ์ˆจ๊ฒจ์ง„ ์ค‘์š”์„ฑ: Traceback์˜ ๋งจ ์•„๋žซ๋ถ€๋ถ„์— ์žˆ๋Š” ์‹ค์ œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€(NoReverseMatch)์™€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ํŒŒ์ผ ๋ฐ ์ฝ”๋“œ ๋ผ์ธ ๋ฒˆํ˜ธ(django/urls/resolvers.py,ย django/template/defaulttags.pyย ๋“ฑ)๊ฐ€ ๋ฌธ์ œ ํ•ด๊ฒฐ์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋‹จ์„œ์ž…๋‹ˆ๋‹ค.
  • ์˜คํ•ด์™€ ์ง„์‹ค:
  • ์˜คํ•ด: Traceback์€ ๋„ˆ๋ฌด ๊ธธ๊ณ  ๋ณต์žกํ•ด์„œ ์ฝ๊ธฐ ์–ด๋ ต๋‹ค.
  • ์ง„์‹ค: ์ „์ฒด๋ฅผ ๋‹ค ์ดํ•ดํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋งจ ์•„๋ž˜์˜ ์˜ค๋ฅ˜ ์œ ํ˜•๊ณผ ๋งจ ์œ„(๋˜๋Š” ์ค‘๊ฐ„)์˜ ๋‚ด ์ฝ”๋“œ ํŒŒ์ผ(์˜ˆ:ย webtools/views.py,ย webtools/tool_list.html) ๊ด€๋ จ ๋ถ€๋ถ„์„ ์ค‘์‹ฌ์œผ๋กœ ๋ณด๋ฉด ์›์ธ์„ ๋น ๋ฅด๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ”ฎ ๋ฏธ๋ž˜ ์ „๋žต ๋ฐ ์ง€ํ˜œ

  • ์˜ˆ๋ฐฉ ์ „๋žต:
  1. URL ์ด๋ฆ„ ๊ทœ์น™ํ™”: URL ๋ณ„๋ช…์„ ์ง€์„ ๋•Œ ์ผ๊ด€๋œ ๊ทœ์น™(์˜ˆ:ย ์•ฑ์ด๋ฆ„_๋ชจ๋ธ์ด๋ฆ„_๋™์ž‘)์„ ์‚ฌ์šฉํ•˜๊ณ , ํ•ญ์ƒ ๋„ค์ž„์ŠคํŽ˜์ด์Šค(app_name)๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  2. ์ค‘์•™์ง‘์ค‘์‹ URL ์ •๋ณด ๊ด€๋ฆฌ:ย webtools.json์ฒ˜๋Ÿผ ์™ธ๋ถ€ ํŒŒ์ผ์—์„œ URL ๊ด€๋ จ ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•  ๊ฒฝ์šฐ,ย url_nameย ๋Œ€์‹ ย reverse()ย ํ•จ์ˆ˜๋กœ ์ƒ์„ฑ๋œ ์‹ค์ œ URL ๊ฒฝ๋กœ๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜,ย url_name์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋ฐ˜๋“œ์‹œ ์ •ํ™•ํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ํฌํ•จํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. (get_all_webtoolsย ํ•จ์ˆ˜์—์„œย reverse('CLOVA:chat_interface')๋ฅผ ํ˜ธ์ถœํ•˜์—ฌย urlย ํ‚ค์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค.)
  3. ํ…Œ์ŠคํŠธ ์ž๋™ํ™”: URL ์ƒ์„ฑ์ด ํฌํ•จ๋œ ํŽ˜์ด์ง€์— ๋Œ€ํ•ด ๋‹จ์œ„ ํ…Œ์ŠคํŠธ(Unit Test)๋‚˜ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ(Integration Test) ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ URL ์ด๋ฆ„ ๋ณ€๊ฒฝ ์‹œ ์˜ค๋ฅ˜๋ฅผ ๋ฏธ๋ฆฌ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ์žฅ๊ธฐ์  ๊ณ ๋ ค์‚ฌํ•ญ: ํ•˜๋“œ์ฝ”๋”ฉ๋œ URL ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  Django์˜ URL ์‹œ์Šคํ…œ({% url %}ย ํƒœ๊ทธ,ย reverse()ย ํ•จ์ˆ˜)์„ ์ ๊ทน์ ์œผ๋กœ ํ™œ์šฉํ•˜๋Š” ์Šต๊ด€์€ ์žฅ๊ธฐ์ ์œผ๋กœ ์›น์‚ฌ์ดํŠธ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ์œ ์—ฐ์„ฑ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.
  • ์ „๋ฌธ๊ฐ€ ์‚ฌ๊ณ ๋ฐฉ์‹: Django ์ „๋ฌธ๊ฐ€๋Š” URL ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•  ๋•Œ ํ…œํ”Œ๋ฆฟ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๋Š” ๋Œ€์‹ ,ย urls.pyย ํŒŒ์ผ๊ณผ URL ๋ณ„๋ช…, ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๋จผ์ € ํ™•์ธํ•˜๊ณ  ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ Traceback์„ ์ฃผ์˜ ๊นŠ๊ฒŒ ๋ถ„์„ํ•˜์—ฌ ๊ทผ๋ณธ ์›์ธ์„ ์ฐพ์œผ๋ ค๊ณ  ๋…ธ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  • ํ•™์Šต ๋กœ๋“œ๋งต:
  1. ๊ธฐ์ดˆ: Django ๊ณต์‹ ๋ฌธ์„œ์˜ URL Dispatcher ๋ถ€๋ถ„์„ ์ฝ๊ณ ย path(),ย name,ย app_name,ย {% url %}ย ํƒœ๊ทธ์˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•์„ ์ตํž™๋‹ˆ๋‹ค.
  2. ์‹ฌํ™”:ย reverse(),ย resolve()ย ํ•จ์ˆ˜ ์‚ฌ์šฉ๋ฒ•๊ณผ URL ํŒจํ„ด ์ž‘์„ฑ ๊ณ ๊ธ‰ ๊ธฐ๋ฒ•(์ •๊ทœํ‘œํ˜„์‹ ์‚ฌ์šฉ ๋“ฑ)์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.
  3. ์‹ค์ „: ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ URL์„ ์„ค๊ณ„ํ•˜๊ณ , ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์•ฑ ๊ฐ„์˜ URL์„ ๊ด€๋ฆฌํ•˜๋Š” ์—ฐ์Šต์„ ํ•ฉ๋‹ˆ๋‹ค.


๐ŸŒŸ ์‹ค์ „ ์ ์šฉ ์ฒญ์‚ฌ์ง„

  • ์ฆ‰์‹œ ์ ์šฉ:
  1. webtools/config/webtools.jsonย ํŒŒ์ผ์„ ์—ด์–ด "AI ์ฑ—๋ด‡" ๋„๊ตฌ์˜ย url_name์„ย 'CLOVA:chat_interface'๋กœ ์ˆ˜์ •ํ•˜๊ณ  ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  2. webtools/views.py์˜ย get_all_webtoolsย ํ•จ์ˆ˜์—์„œ 'AI ์ฑ—๋ด‡'์˜ย urlย ๊ฐ’์„ย reverse('CLOVA:chat_interface')๋กœ ๋™์  ์ƒ์„ฑํ•˜๋„๋ก ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. (์ด ๋ฐฉ๋ฒ•์ด ๋” ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค.)
  3. docker-compose down && docker-compose up -dย ๋ช…๋ น์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์™„์ „ํžˆ ์žฌ์‹œ์ž‘ํ•˜์—ฌ ์บ์‹œ๋ฅผ ๋น„์šฐ๊ณ  ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์ค‘๊ธฐ ํ”„๋กœ์ ํŠธ: ํ”„๋กœ์ ํŠธ ๋‚ด ๋ชจ๋“  ํ…œํ”Œ๋ฆฟ ํŒŒ์ผ์„ ๊ฒ€ํ† ํ•˜์—ฌ ํ•˜๋“œ์ฝ”๋”ฉ๋œ URL ๊ฒฝ๋กœ(href="/some/path/")๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ์žˆ๋‹ค๋ฉดย {% url %}ย ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋ฆฌํŒฉํ† ๋งํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์•ฑ์—ย app_name์„ ์ •์˜ํ•˜๊ณ  ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์ˆ™๋ จ๋„ ์ ๊ฒ€:
  • URL ํŒŒ๋ผ๋ฏธํ„ฐ(์˜ˆ:ย /blog/post/123/)๋ฅผ ํฌํ•จํ•˜๋Š” URL์„ย {% url %}ย ํƒœ๊ทธ๋กœ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
  • ๋‹ค๋ฅธ ์•ฑ์˜ URL์„ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •ํ™•ํžˆ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
  • NoReverseMatchย ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ Traceback์„ ๋ณด๊ณ  ์›์ธ์ด ๋˜๋Š” ํ…œํ”Œ๋ฆฟ ๋˜๋Š” ๋ทฐ ์ฝ”๋“œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
  • ์ถ”๊ฐ€ ๋ฆฌ์†Œ์Šค:
  • [์ดˆ๊ธ‰]ย Django ๊ณต์‹ ๋ฌธ์„œ - URL ๋””์ŠคํŒจ์ฒ˜
  • [์ค‘๊ธ‰]ย Django Template Language - url tag
  • [์ค‘๊ธ‰]ย Django URL reversing
  • [๊ณ ๊ธ‰] Real Python ๋“ฑ ๋ธ”๋กœ๊ทธ์˜ Django URL ๊ด€๋ จ ์‹ฌ์ธต ํŠœํ† ๋ฆฌ์–ผ


๐Ÿ“ ์ง€์‹ ์••์ถ• ์š”์•ฝ

Django์—์„œย NoReverseMatchย ์˜ค๋ฅ˜๋Š”ย ์—†๋Š” URL ๋ณ„๋ช…์„ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ํ…œํ”Œ๋ฆฟ์˜ย {% url %}ย ํƒœ๊ทธ๋‚˜ ์ฝ”๋“œ์˜ย reverse()ย ํ•จ์ˆ˜์—์„œ **์ •ํ™•ํ•œ URL ๋ณ„๋ช…๊ณผ ๋„ค์ž„์ŠคํŽ˜์ด์Šค('์•ฑ์ด๋ฆ„:๋ณ„๋ช…' ํ˜•์‹)**๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œย Traceback ๋งจ ์•„๋ž˜๋ฅผ ํ™•์ธํ•˜์—ฌ ์–ด๋–ค ์ด๋ฆ„์ด ๋ฌธ์ œ์ธ์ง€ ํŒŒ์•…ํ•˜๊ณ ,ย urls.py์—์„œ ์˜ฌ๋ฐ”๋ฅธ ์ด๋ฆ„์„ ์ฐพ์•„ ์ˆ˜์ •ํ•˜๋ฉด ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค. URL์„ ํ•˜๋“œ์ฝ”๋”ฉํ•˜๋Š” ๋Œ€์‹ ย ๋ณ„๋ช…๊ณผย {% url %}ย ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์Šต๊ด€์€ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ํฌ๊ฒŒ ๋†’์ž…๋‹ˆ๋‹ค.

๋ชฉ์ฐจ
๋ชฉ์ฐจ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘...

๋Œ“๊ธ€

Loading...

๋Œ“๊ธ€ ๋กœ๋”ฉ ์ค‘...

๊ตฌ๊ธ€ ๊ฒ€์ƒ‰