devdong

Welcome to devdong โ€” a cozy corner where developers share stories over a cup of coffee. โ˜•๐Ÿ’ป

MongoDB ์“ฐ์ง€ ๋งˆ์„ธ์š”: ์•„๋‹ˆ ๊ทธ๋ƒฅ ์จ๋„ ๋ผ์š”
ํ•œ๋•Œ ๊ฐœ๋ฐœ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ "MongoDB ์“ฐ์ง€ ๋งˆ์„ธ์š”"๋ผ๋Š” ๋ง์ด ์œ ํ–‰ํ–ˆ๋˜ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ‚ค๋งˆ๊ฐ€ ์—†๋‹ค๋Š” ์ด์œ ๋กœ, ํŠธ๋žœ์žญ์…˜ ์ง€์›์ด ๋ถ€์กฑํ•˜๋‹ค๋Š” ์ด์œ ๋กœ ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์ด MongoDB๋ฅผ ๊ธฐํ”ผํ–ˆ์ฃ . ํ•˜์ง€๋งŒ 2024๋…„ ํ˜„์žฌ, ์ด๋Ÿฐ ํŽธ๊ฒฌ๋“ค์€ ๋Œ€๋ถ€๋ถ„ ๊ณผ๊ฑฐ์˜ ์ด์•ผ๊ธฐ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ˜•๋ณ€ํ™˜์˜ ๋ชจ๋“  ๊ฒƒ: ์™„๋ฒฝ ์ •๋ณต ๊ฐ€์ด๋“œ
ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํƒ€์ž…์„ ์ œ๋Œ€๋กœ ์ถ”๋ก ํ•˜์ง€ ๋ชปํ•˜๊ฑฐ๋‚˜, ๊ฐœ๋ฐœ์ž๊ฐ€ ๋” ์ •ํ™•ํ•œ ํƒ€์ž…์„ ์•Œ๊ณ  ์žˆ์„ ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. DHH(David Heinemeier Hansson)๊ฐ€ hotwired/turbo ํ”„๋กœ์ ํŠธ์—์„œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด์„œ "ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ •๋ง ํ•„์š”ํ•œ๊ฐ€?"์— ๋Œ€ํ•œ ๋…ผ์Ÿ์ด ๋‹ค์‹œ ๋ถˆ๋ถ™๊ธฐ๋„ ํ–ˆ์ฃ . ํ•˜์ง€๋งŒ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ์ •์  ํƒ€์ž… ์‹œ์Šคํ…œ์ด ์ฃผ๋Š” ์•ˆ์ •์„ฑ์€ ์—ฌ์ „ํžˆ ๋งค๋ ฅ์ ์ž…๋‹ˆ๋‹ค.
์ƒˆ๋กœ์šด DOM API, setHTML์„ ์•Œ์•„๋ณด์ž
์›น ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค ๋ณด๋ฉด ๋™์ ์œผ๋กœ HTML์„ ์‚ฝ์ž…ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ ๊ฐ€์žฅ ํ”ํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ๋ฒ•์€ innerHTML์ด์ง€๋งŒ, ์ด ๋ฐฉ๋ฒ•์€ ํฌ๋กœ์Šค ์‚ฌ์ดํŠธ ์Šคํฌ๋ฆฝํŒ…(XSS) ๊ณต๊ฒฉ์— ์ทจ์•ฝํ•˜๋‹ค๋Š” ํฐ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์ด DOMPurify์™€ ๊ฐ™์€ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด HTML์„ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฝ์ž…ํ•ด์™”์Šต๋‹ˆ๋‹ค. ์ด์ œ๋Š” ์›น ํ‘œ์ค€์— ๋‚ด์žฅ๋œ ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ HTML์„ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋  ์ „๋ง์ž…๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์ƒˆ๋กœ์šด DOM API์ธ setHTML()์ด ๋“ฑ์žฅํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” setHTML()์ด ๋ฌด์—‡์ธ์ง€, ์™œ ํ•„์š”ํ•œ์ง€, ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
ECS vs EKS: AWS ์ปจํ…Œ์ด๋„ˆ ์„œ๋น„์Šค ์„ ํƒ ๊ฐ€์ด๋“œ
ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ ์ปจํ…Œ์ด๋„ˆํ™”๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ํ˜„๋Œ€์ ์ธ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์˜ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค. AWS์—์„œ ์ œ๊ณตํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ์ปจํ…Œ์ด๋„ˆ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ์„œ๋น„์Šค์ธ ECS์™€ EKS ์ค‘ ์–ด๋–ค ๊ฒƒ์„ ์„ ํƒํ•ด์•ผ ํ• ์ง€ ๊ณ ๋ฏผ์ด์‹ ๊ฐ€์š”? ๊ฐ ์„œ๋น„์Šค๋Š” ๊ณ ์œ ํ•œ ์žฅ์ ๊ณผ ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ, ํŒ€์˜ ์ „๋ฌธ์„ฑ, ์žฅ๊ธฐ์ ์ธ ๋ชฉํ‘œ์— ๋”ฐ๋ผ ์ตœ์ ์˜ ์„ ํƒ์ด ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” ๋‘ ์„œ๋น„์Šค์˜ ํ•ต์‹ฌ ์ฐจ์ด์ ์„ ๋ช…ํ™•ํžˆ ๋ถ„์„ํ•˜๊ณ , ์‹ค๋ฌด์—์„œ ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์–ด๋–ค ์„œ๋น„์Šค๋ฅผ ์„ ํƒํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ตฌ์ฒด์ ์ธ ๊ฐ€์ด๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
LoRA์™€ QLoRA: AI ๋ชจ๋ธ ํŠœ๋‹์˜ ํŒ๋„๋ฅผ ๋ฐ”๊พธ๋‹ค
๋Œ€๊ทœ๋ชจ ์–ธ์–ด ๋ชจ๋ธ(LLM)์„ ํŠน์ • ์ž‘์—…์— ๋งž๊ฒŒ ์กฐ์ •ํ•˜๋Š” ๊ฒƒ์€ ๋งˆ์น˜ F1 ๊ฒฝ์ฃผ์šฉ ์ž๋™์ฐจ๋ฅผ ํŠน์ • ํŠธ๋ž™์— ๋งž๊ฒŒ ํŠœ๋‹ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ตœ๊ณ ์˜ ์„ฑ๋Šฅ์„ ๋Œ์–ด๋‚ด๊ธฐ ์œ„ํ•ด ์„ฌ์„ธํ•œ ์กฐ์ •์ด ํ•„์š”ํ•˜์ง€๋งŒ, ์ด ๊ณผ์ •์€ ์—„์ฒญ๋‚œ ์ž์›๊ณผ ์‹œ๊ฐ„์„ ์†Œ๋ชจํ•  ์ˆ˜ ์žˆ์ฃ . ์ „ํ†ต์ ์ธ ์ „์ฒด ํŒŒ๋ผ๋ฏธํ„ฐ ํŒŒ์ธํŠœ๋‹(Full Fine-tuning) ๋ฐฉ์‹์€ ๋ชจ๋ธ์˜ ๋ชจ๋“  ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ด์„œ ๋น„์šฉ์ด ๋งŽ์ด ๋“ค๊ณ , ๋•Œ๋กœ๋Š” 'ํŒŒ๊ตญ์  ๋ง๊ฐ(catastrophic forgetting)'์ด๋ผ๋Š” ๋ฌธ์ œ์— ๋ถ€๋”ชํžˆ๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฑฑ์ • ๋งˆ์„ธ์š”! ์ด์ œ ๋” ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ ํšจ์œจ์  ํŒŒ์ธํŠœ๋‹(Parameter-Efficient Fine-Tuning, PEFT) ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” PEFT์˜ ๋Œ€ํ‘œ์ ์ธ ์ฃผ์ž์ธ LoRA์™€, ๊ทธ๋ณด๋‹ค ํ•œ ๋‹จ๊ณ„ ๋” ๋‚˜์•„๊ฐ„ QLoRA์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋‘ ๊ธฐ์ˆ ์ด ์–ด๋–ป๊ฒŒ LLM ํŠœ๋‹์˜ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ๋ฐ”๊พธ๊ณ  ์žˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ๊ฐ๊ฐ ์–ด๋–ค ์ƒํ™ฉ์— ๋” ์ ํ•ฉํ•œ์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•˜๊ฒŒ ๋˜์‹ค ๊ฒ๋‹ˆ๋‹ค.
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ˜•๋ณ€ํ™˜ ์™„๋ฒฝ ๊ฐ€์ด๋“œ
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋‹ค๋ฃจ๋‹ค ๋ณด๋ฉด "5" + 1์ด "51"์ด ๋˜๊ณ , "5" - 1์€ 4๊ฐ€ ๋˜๋Š” ์ƒํ™ฉ์„ ๋งˆ์ฃผํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ํ˜ผ๋ž€์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ˜•๋ณ€ํ™˜(Type Conversion) ๋ฉ”์ปค๋‹ˆ์ฆ˜ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ˜•๋ณ€ํ™˜์€ ํ•œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๋‹ค๋ฅธ ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋™์  ํƒ€์ž… ์–ธ์–ด์ด๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ํƒ€์ž…์„ ์ง€์ •ํ•˜์ง€ ์•Š์•„๋„ ๋Ÿฐํƒ€์ž„์—์„œ ์ž๋™์œผ๋กœ ํƒ€์ž…์ด ๊ฒฐ์ •๋˜๊ณ  ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ํŠน์„ฑ์€ ๊ฐœ๋ฐœ์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ๋งŒ๋“ค์ง€๋งŒ, ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฒ„๊ทธ์˜ ์›์ธ์ด ๋˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” ๋ช…์‹œ์  ํ˜•๋ณ€ํ™˜๊ณผ ์•”๋ฌต์  ํ˜•๋ณ€ํ™˜์˜ ์ฐจ์ด๋ถ€ํ„ฐ ๊ฐ์ฒด์˜ ํ˜•๋ณ€ํ™˜, ๊ทธ๋ฆฌ๊ณ  ์‹ค๋ฌด์—์„œ ์ฃผ์˜ํ•ด์•ผ ํ•  ํ•จ์ •๊นŒ์ง€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ˜•๋ณ€ํ™˜์˜ ๋ชจ๋“  ๊ฒƒ์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ์ด ๊ฐ€์ด๋“œ๋ฅผ ํ†ตํ•ด ํ˜•๋ณ€ํ™˜์˜ ์ž‘๋™ ์›๋ฆฌ๋ฅผ ์ •ํ™•ํžˆ ์ดํ•ดํ•˜๊ณ , ๋” ์•ˆ์ „ํ•˜๊ณ  ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋  ๊ฑฐ์˜ˆ์š”.
ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ, ์ •๋ง ํ‡ด์ถœ๋ ๊นŒ?
์ข€ ์ง€๋‚œ ์ด์•ผ๊ธฐ์ง€๋งŒ ๊ฐœ๋ฐœ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๋œจ๊ฑฐ์šด ๋…ผ์Ÿ์ด ๋ฒŒ์–ด์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Ruby on Rails์˜ ์ฐฝ์‹œ์ž David Heinemeier Hansson(DHH)์ด hotwired/turbo ํ”„๋กœ์ ํŠธ์—์„œ TypeScript๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด์„œ ์‹œ์ž‘๋œ ์ด ๋…ผ์Ÿ์€ "TypeScript๋Š” ๊ณผ์—ฐ ํ•„์š”ํ•œ๊ฐ€?"๋ผ๋Š” ๊ทผ๋ณธ์ ์ธ ์งˆ๋ฌธ์„ ๋˜์ง€๊ณ  ์žˆ์ฃ . TypeScript๋Š” 2012๋…„ ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ์—์„œ ์ถœ์‹œํ•œ ์ดํ›„, JavaScript์— ์ •์  ํƒ€์ž…์„ ์ถ”๊ฐ€ํ•ด ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์—ฌ์ฃผ๋Š” ๋„๊ตฌ๋กœ ์ž๋ฆฌ๋งค๊น€ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ DHH์˜ ๊ฒฐ์ • ์ดํ›„, Svelte ๋“ฑ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์—์„œ๋„ TypeScript ์ œ๊ฑฐ๋ฅผ ๊ฒ€ํ† ํ•˜๋ฉด์„œ ๊ฐœ๋ฐœ์ž๋“ค์€ ํ˜ผ๋ž€์— ๋น ์กŒ์–ด์š”. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” TypeScript๋ฅผ ๋‘˜๋Ÿฌ์‹ผ ์ฐฌ๋ฐ˜ ๋…ผ์Ÿ์„ ๊ท ํ˜•์žˆ๊ฒŒ ์‚ดํŽด๋ณด๊ณ , ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœ์ ํŠธ์— TypeScript๊ฐ€ ์ •๋ง ํ•„์š”ํ•œ์ง€ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ค€์„ ์ œ์‹œํ•ด๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.
eval() ์—†์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ณ„์‚ฐ๊ธฐ ๋งŒ๋“ค๊ธฐ
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋‹ค ๋ณด๋ฉด ๋™์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ด๋Ÿด ๋•Œ eval() ํ•จ์ˆ˜๋ฅผ ๋– ์˜ฌ๋ฆฌ๊ณค ํ•ฉ๋‹ˆ๋‹ค. eval()์€ ๋ฌธ์ž์—ด์„ ์ฝ”๋“œ๋กœ ์ธ์‹ํ•˜๊ณ  ์‹คํ–‰ํ•ด์ฃผ๋Š” ํŽธ๋ฆฌํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ฃ . ํ•˜์ง€๋งŒ ์ด ํŽธ๋ฆฌํ•จ ๋’ค์—๋Š” ์‹ฌ๊ฐํ•œ ๋ณด์•ˆ ์œ„ํ—˜๊ณผ ์„ฑ๋Šฅ ์ €ํ•˜ ๋ฌธ์ œ๊ฐ€ ์ˆจ์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” eval()์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์™œ ์œ„ํ—˜ํ•œ์ง€ ์•Œ์•„๋ณด๊ณ , ๋” ์•ˆ์ „ํ•˜๊ณ  ํšจ์œจ์ ์ธ ๋Œ€์•ˆ์ธ new Function()์„ ์‚ฌ์šฉํ•ด ๋™์  ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ๊ธ€์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ๋ถ„์€ ๋” ์•ˆ์ „ํ•˜๊ณ  ๊ฒฌ๊ณ ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋Šฅ๋ ฅ์„ ๊ธฐ๋ฅผ ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”.
JavaScript์—์„œ eval()์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•
JavaScript์˜ eval()์ด ์œ„ํ—˜ํ•œ ์ด์œ ์™€ new Function()์œผ๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ๋Œ€์ฒดํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‹ค์šฉ์ ์ธ ์˜ˆ์ œ์™€ ํ•จ๊ป˜ ์•Œ์•„๋ณด์„ธ์š”. ๋ณด์•ˆ๊ณผ ์„ฑ๋Šฅ์„ ๋ชจ๋‘ ์žก๋Š” ํŒ! JavaScript๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋ฉด ๋ฌธ์ž์—ด๋กœ ๋œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿด ๋•Œ ๊ฐ€์žฅ ๋จผ์ € ๋– ์˜ค๋ฅด๋Š” ๊ฒƒ์ด eval() ํ•จ์ˆ˜์ฃ . ํ•˜์ง€๋งŒ eval()์€ ๋ณด์•ˆ ์ทจ์•ฝ์ ๊ณผ ์„ฑ๋Šฅ ๋ฌธ์ œ๋กœ ์•…๋ช…์ด ๋†’์Šต๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” eval()์˜ ์œ„ํ—˜์„ฑ์„ ์‚ดํŽด๋ณด๊ณ , ๋” ์•ˆ์ „ํ•œ ๋Œ€์•ˆ์ธ new Function()์„ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์‹ค์šฉ์ ์ธ ์˜ˆ์ œ์™€ ํ•จ๊ป˜ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฒดํฌ๋ฐ•์Šค ์ฒดํฌ ์—ฌ๋ถ€ ํ™•์ธ ์™„๋ฒฝ ๊ฐ€์ด๋“œ
ํŠธ ๋ฆฌ์Šค๋„ˆ, prop(), is() ์‚ฌ์šฉ๋ฒ•์„ ์˜ˆ์ œ์™€ ํ•จ๊ป˜ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์›น ๊ฐœ๋ฐœ์—์„œ ์‚ฌ์šฉ์ž์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์€ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ฒดํฌ๋ฐ•์Šค๋Š” ์‚ฌ์šฉ์ž์˜ ๋™์˜๋ฅผ ์–ป๊ฑฐ๋‚˜, ์—ฌ๋Ÿฌ ์˜ต์…˜ ์ค‘ ํ•˜๋‚˜ ๋˜๋Š” ๋‹ค์ˆ˜๋ฅผ ์„ ํƒํ•˜๊ฒŒ ํ•˜๋Š” ๋“ฑ ๊ฐ„๋‹จํ•˜๋ฉด์„œ๋„ ํ•„์ˆ˜์ ์ธ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค(UI) ์š”์†Œ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด '์ด์šฉ์•ฝ๊ด€์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค' ๋˜๋Š” '์ž๋™ ๋กœ๊ทธ์ธ'๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ๋“ค์€ ๋ชจ๋‘ ์ฒดํฌ๋ฐ•์Šค๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„๋˜์ฃ . ์ด๋Ÿฌํ•œ ์ฒดํฌ๋ฐ•์Šค์˜ ์„ ํƒ ์—ฌ๋ถ€, ์ฆ‰ '์ƒํƒœ'๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ทธ์— ๋งž๋Š” ๋กœ์ง์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ˜๋“œ์‹œ ์•Œ์•„์•ผ ํ•  ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(JavaScript)์™€ ์ œ์ด์ฟผ๋ฆฌ(jQuery)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฒดํฌ๋ฐ•์Šค์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์„ ์‰ฝ๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ๋ ค๋“œ๋ฆด ๊ฑฐ์˜ˆ์š”. ์ด ๊ธ€์„ ๋๊นŒ์ง€ ์ฝ์œผ์‹œ๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์€ ์–ด๋–ค ์ƒํ™ฉ์—์„œ๋“  ์ž์‹  ์žˆ๊ฒŒ ์ฒดํฌ๋ฐ•์Šค ์ƒํƒœ๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ๋  ๊ฒ๋‹ˆ๋‹ค.
Access-Control-Allow-Origin ํ—ค๋” ์™„๋ฒฝ ๊ฐ€์ด๋“œ
CORS ์˜ค๋ฅ˜์˜ ์›์ธ์ธ Access-Control-Allow-Origin ํ—ค๋”๋ฅผ ์™„๋ฒฝํžˆ ์ดํ•ดํ•˜๊ณ  ํ•ด๊ฒฐํ•˜์„ธ์š”. ๋ฌธ๋ฒ•, ๋ณด์•ˆ, Nginx/Node.js ์„ค์ • ์˜ˆ์‹œ๊นŒ์ง€ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ์›น ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค ๋ณด๋ฉด ํ•œ ๋ฒˆ์ฏค์€ ์ฝ˜์†”์—์„œ CORS error๋ผ๋Š” ๋ฌด์‹œ๋ฌด์‹œํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ๋งˆ์ฃผํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด ์˜ค๋ฅ˜๋Š” ๋Œ€๋ถ€๋ถ„ ๋‹ค๋ฅธ ์ถœ์ฒ˜(origin)์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š”๋ฐ์š”, ๋ฐ”๋กœ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์—ด์‡ ๊ฐ€ Access-Control-Allow-Origin ํ—ค๋”์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” ๊ต์ฐจ ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ (CORS)์˜ ํ•ต์‹ฌ์ธ Access-Control-Allow-Origin ํ—ค๋”๊ฐ€ ๋ฌด์—‡์ธ์ง€, ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ์„ค์ •ํ•ด์•ผ ํ•˜๋Š”์ง€ ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ๊ธ€์„ ๋๊นŒ์ง€ ์ฝ์œผ์‹œ๋ฉด CORS ์˜ค๋ฅ˜์— ์ž์‹ ๊ฐ ์žˆ๊ฒŒ ๋Œ€์ฒ˜ํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”!
Apache AH00072 ์—๋Ÿฌ ์™„๋ฒฝํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
์„œ๋ฒ„๋ฅผ ๊ด€๋ฆฌํ•˜๋‹ค ๋ณด๋ฉด ์–˜๊ธฐ์น˜ ์•Š์€ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€์™€ ๋งˆ์ฃผ์น  ๋•Œ๊ฐ€ ๋งŽ์ฃ . ๊ทธ์ค‘์—์„œ๋„ Apache ์›น ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋‚˜ ์‹œ์Šคํ…œ ๊ด€๋ฆฌ์ž๋ผ๋ฉด AH00072: make_sock: could not bind to address๋ผ๋Š” ์—๋Ÿฌ๋ฅผ ํ•œ ๋ฒˆ์ฏค์€ ๋ณด์…จ์„ ๊ฒ๋‹ˆ๋‹ค. ์ด ์—๋Ÿฌ๋Š” Apache๊ฐ€ ์‹œ์ž‘๋˜์ง€ ๋ชปํ•˜๊ฒŒ ๋ง‰๋Š” ์ฃผ๋ฒ” ์ค‘ ํ•˜๋‚˜๋กœ, ์›น์‚ฌ์ดํŠธ๊ฐ€ ๋‹ค์šด๋˜๋Š” ์ง์ ‘์ ์ธ ์›์ธ์ด ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฑฑ์ • ๋งˆ์„ธ์š”! ์ด ์—๋Ÿฌ๋Š” ๋ณดํ†ต ๋ช‡ ๊ฐ€์ง€ ๊ฐ„๋‹จํ•œ ํ™•์ธ๊ณผ ์กฐ์น˜๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” AH00072 ์—๋Ÿฌ๊ฐ€ ์™œ ๋ฐœ์ƒํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ฐจ๊ทผ์ฐจ๊ทผ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ๊ธ€์„ ๋๊นŒ์ง€ ์ฝ์œผ์‹œ๋ฉด, ๋‹ค์Œ์— ๊ฐ™์€ ์—๋Ÿฌ๋ฅผ ๋งŒ๋‚˜๋„ ๋‹นํ™ฉํ•˜์ง€ ์•Š๊ณ  ์นจ์ฐฉํ•˜๊ฒŒ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”.