devdong

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

UML ๊ฐ์ฒด ๋‹ค์ด์–ด๊ทธ๋žจ์„ ์™„๋ฒฝํžˆ ์ดํ•ดํ•ด๋ณด์ž
์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ํ”„๋กœ์ ํŠธ์—์„œ ๋ณต์žกํ•œ ์‹œ์Šคํ…œ์˜ ๊ตฌ์กฐ๋ฅผ ์„ค๋ช…ํ•  ๋•Œ, ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ์€ ๋งˆ์น˜ ์ฒญ์‚ฌ์ง„๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ์ฒญ์‚ฌ์ง„๋งŒ์œผ๋กœ๋Š” ํŠน์ • ์ˆœ๊ฐ„์— ์‹œ์Šคํ…œ์ด ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ค์šธ ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์ด๋Ÿด ๋•Œ, ์‹œ์Šคํ…œ์˜ ์Šค๋ƒ…์ƒท์„ ๋ณด์—ฌ์ฃผ๋Š” UML ๊ฐ์ฒด ๋‹ค์ด์–ด๊ทธ๋žจ(Object Diagram)์ด ํฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” UML ๊ฐ์ฒด ๋‹ค์ด์–ด๊ทธ๋žจ์ด ๋ฌด์—‡์ธ์ง€, ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€ ์•Œ์•„๋ณด๊ณ , ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ๊ณผ์˜ ์ฐจ์ด์ ์„ ํ†ตํ•ด ์–ธ์ œ ๊ฐ์ฒด ๋‹ค์ด์–ด๊ทธ๋žจ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์‹ค์ œ ๊ฐœ๋ฐœ ์‹œ๋‚˜๋ฆฌ์˜ค์— ์ ์šฉ๋œ ์˜ˆ์ œ์™€ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ๋ถ„์˜ ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„ ๋Šฅ๋ ฅ์„ ํ•œ ๋‹จ๊ณ„ ๋Œ์–ด์˜ฌ๋ฆฌ๋Š” ๋ฐ ๋„์›€์„ ๋“œ๋ฆฌ๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.
[UML] ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ ์™„๋ฒฝํ•˜๊ฒŒ ์ดํ•ดํ•˜๊ธฐ
์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์€ ๋ณต์žกํ•œ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ˜‘์—…ํ•˜๊ณ , ์‹œ์Šคํ…œ์˜ ๊ตฌ์กฐ๋ฅผ ํ•œ๋ˆˆ์— ํŒŒ์•…ํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ๋งŽ์ฃ . ์ด๋•Œ, ํ†ต์ผ๋œ ์•ฝ์†์œผ๋กœ ์‹œ์Šคํ…œ์„ ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๋„๊ตฌ ๊ฐ€ ์žˆ๋‹ค๋ฉด ์–ด๋–จ๊นŒ์š”? ๋ฐ”๋กœ ์—ฌ๊ธฐ์„œ UML(Unified Modeling Language)์ด ๋“ฑ์žฅํ•ฉ๋‹ˆ๋‹ค. UML์€ ๊ฐ์ฒด ์ง€ํ–ฅ ์†Œํ”„ํŠธ์›จ์–ด ์‹œ์Šคํ…œ์„ ์‹œ๊ฐํ™”(Visualize) ํ•˜๊ณ , ๋ช…์„ธํ™”(Specify) ํ•˜๋ฉฐ, ๋ฌธ์„œํ™”(Document) ํ•˜๋Š” ํ‘œ์ค€ ๋ชจ๋ธ๋ง ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜๋‚˜ ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ ์„ค๊ณ„๊ฐ€ ๋ณดํŽธํ™”๋˜๋ฉด์„œ UML์˜ ์ค‘์š”์„ฑ์€ ๋”์šฑ ์ปค์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜๋งŽ์€ UML ๋‹ค์ด์–ด๊ทธ๋žจ ์ค‘์—์„œ๋„ ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ(Class Diagram) ์€ ์‹œ์Šคํ…œ์˜ ์ •์  ๊ตฌ์กฐ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณด์—ฌ์ฃผ๋Š” ํ•ต์‹ฌ์ ์ธ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๋ถ€ํ„ฐ ๊ตฌ์„ฑ ์š”์†Œ, ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ ํ™œ์šฉ๋ฒ•๊นŒ์ง€ ์ฐจ๊ทผ์ฐจ๊ทผ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ๊ฐ€์ด๋“œ๋ฅผ ํ†ตํ•ด ์‹œ์Šคํ…œ ๊ตฌ์กฐ๋ฅผ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•˜๊ณ , ํŒ€์›๋“ค๊ณผ ํšจ๊ณผ์ ์œผ๋กœ ์†Œํ†ตํ•˜๋Š” ์—ญ๋Ÿ‰์„ ๊ฐ–์ถ”๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
UML ๋‹ค์ด์–ด๊ทธ๋žจ ์ข…๋ฅ˜ ์™„๋ฒฝํžˆ ์ดํ•ดํ•ด๋ณด์ž
ํด๋ž˜์Šค, ์‹œํ€€์Šค, ์œ ์Šค์ผ€์ด์Šค ๋“ฑ ์ฃผ์š” UML ๋‹ค์ด์–ด๊ทธ๋žจ ์ข…๋ฅ˜๋ฅผ ์‹ค๋ฌด ์˜ˆ์ œ์™€ ํ•จ๊ป˜ ์•Œ์•„๋ณด์„ธ์š”. ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„ ๋Šฅ๋ ฅ์„ ํ•œ ๋‹จ๊ณ„ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜์„ธ์š”. ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์—์„œ ๋ณต์žกํ•œ ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•  ๋•Œ, ํŒ€์›๋“ค๊ณผ ๋ช…ํ™•ํ•˜๊ฒŒ ์†Œํ†ตํ•˜๋Š” ๊ฒƒ์€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ๋กœ ๋ฐ”๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ ์ „์— ์‹œ์Šคํ…œ์˜ ๊ตฌ์กฐ์™€ ๋™์ž‘ ๋ฐฉ์‹์„ ์‹œ๊ฐํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์–ด๋–จ๊นŒ์š”? ๋ฐ”๋กœ ์ด ์ง€์ ์—์„œ UML(Unified Modeling Language)์ด ๊ทธ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. UML์€ ๊ฐ์ฒด ์ง€ํ–ฅ ์†Œํ”„ํŠธ์›จ์–ด ์‹œ์Šคํ…œ์„ ์‹œ๊ฐํ™”, ๋ช…์„ธํ™”, ๊ตฌ์ถ•, ๋ฌธ์„œํ™”ํ•˜๊ธฐ ์œ„ํ•œ ํ‘œ์ค€ ๋ชจ๋ธ๋ง ์–ธ์–ด์ž…๋‹ˆ๋‹ค. 1990๋…„๋Œ€ ์ค‘๋ฐ˜์— ๋“ฑ์žฅํ•œ ์ดํ›„, UML์€ ์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋ง์˜ ํ•ต์‹ฌ ๋„๊ตฌ๋กœ ์ž๋ฆฌ ์žก์•˜์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜๋‚˜ ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ ์„ค๊ณ„๊ฐ€ ์ผ์ƒํ™”๋œ ์ง€๊ธˆ, UML์˜ ์ค‘์š”์„ฑ์€ ๋”์šฑ ์ปค์ง€๊ณ  ์žˆ์–ด์š”. UML์€ ํฌ๊ฒŒ ๊ตฌ์กฐ์  ๋‹ค์ด์–ด๊ทธ๋žจ(Structural Diagrams) ๊ณผ ํ–‰์œ„์  ๋‹ค์ด์–ด๊ทธ๋žจ(Behavioral Diagrams) ์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค. ๊ฐ ๋‹ค์ด์–ด๊ทธ๋žจ์€ ์‹œ์Šคํ…œ์˜ ํŠน์ • ์ธก๋ฉด์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ ์ตœ์ ํ™”๋˜์–ด ์žˆ์ฃ . ์ด ๊ธ€์—์„œ๋Š” ์‹ค๋ฌด์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” UML ๋‹ค์ด์–ด๊ทธ๋žจ ์ข…๋ฅ˜๋ฅผ ์ƒ์„ธํžˆ ์‚ดํŽด๋ณด๊ณ , ๊ฐ ๋‹ค์ด์–ด๊ทธ๋žจ์ด ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์œ ์šฉํ•œ์ง€ ์‹ค์ œ ์˜ˆ์‹œ์™€ ํ•จ๊ป˜ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
class-validator์˜ IsMongoId: MongoDB ObjectId ๊ฒ€์ฆ
NestJS๋กœ API๋ฅผ ๊ฐœ๋ฐœํ•˜๋‹ค ๋ณด๋ฉด MongoDB ObjectId ํ˜•์‹์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ฒ€์ฆํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ž์ฃผ ์ƒ๊น๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ํ˜•์‹์˜ ID๊ฐ€ ๋“ค์–ด์˜ค๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ , ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ๋ถˆ์นœ์ ˆํ•œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ ์ „๋‹ฌ๋˜์ฃ . class-validator์˜ @IsMongoId() ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. DTO์— ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํ•˜๋‚˜๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด MongoDB ObjectId ๊ฒ€์ฆ์ด ์ž๋™์œผ๋กœ ์ด๋ฃจ์–ด์ง€๊ณ , ์ž˜๋ชป๋œ ์š”์ฒญ์€ ์ปจํŠธ๋กค๋Ÿฌ์— ๋„๋‹ฌํ•˜๊ธฐ ์ „์— ์ฐจ๋‹จ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” @IsMongoId()์˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•๋ถ€ํ„ฐ ๋‚ด๋ถ€ ๊ตฌํ˜„, ์‹ค์ „ ํ™œ์šฉ๋ฒ•, ๊ทธ๋ฆฌ๊ณ  ์ปค์Šคํ…€ ๊ฒ€์ฆ๊นŒ์ง€ ๋ชจ๋‘ ๋‹ค๋ค„๋ณผ๊ฒŒ์š”.
IsDecimal์€ ์™œ ์ˆซ์ž๋ฅผ ๊ฒ€์ฆํ•˜์ง€ ๋ชปํ• ๊นŒ?
NestJS์—์„œ class-validator๋Š” ๋ฐ์ดํ„ฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์•„์ฃผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. DTO(Data Transfer Object)์— ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ๋ช‡ ๊ฐœ๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด, ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์˜ ํ˜•์‹์„ ์†์‰ฝ๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์ฃ . ํ•˜์ง€๋งŒ ๊ฐ€๋” ์˜ˆ์ƒ๊ณผ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋Š” ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ๋•Œ๋ฌธ์— ๊ณจ๋จธ๋ฆฌ๋ฅผ ์•“๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ฐ”๋กœ @IsDecimal์ž…๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ์†Œ์ˆ˜์  ํ˜•ํƒœ์˜ ์ˆซ์ž๋ฅผ ๋ณด๋ƒˆ๋Š”๋ฐ๋„ "์œ ํšจํ•œ 10์ง„์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค"๋ผ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ƒํ™ฉ, ๊ฒช์–ด๋ณด์…จ๋‚˜์š”? ์ด ๊ธ€์—์„œ๋Š” @IsDecimal์ด ์™œ ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  NestJS์—์„œ ์†Œ์ˆ˜์  ์ˆซ์ž๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ฒ€์ฆํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ๋ ค๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.
Nestjs์—์„œ class validator IsEnum ์ œ๋Œ€๋กœ ์จ๋ณด์ž
NestJS์—์„œ DTO ๊ฒ€์ฆ์„ ํ•˜๋‹ค ๋ณด๋ฉด โ€œํŠน์ • ๊ฐ’๋งŒ ํ—ˆ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐโ€ ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์—ญํ• (role)์€ 'admin' | 'user' | 'blogger' ์ค‘ ํ•˜๋‚˜๋งŒ, ์ƒํ’ˆ ์‚ฌ์ด์ฆˆ(size)๋Š” 'S' | 'M' | 'L' | 'XL' ์ค‘ ํ•˜๋‚˜๋งŒ ํ—ˆ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ์ฃ . ์ด๋Ÿด ๋•Œ class-validator์˜ @IsEnum ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ๋ฅผ ์ œ๋Œ€๋กœ ํ™œ์šฉํ•˜๋ฉด ๊น”๋”ํ•˜๊ณ  ์•ˆ์ „ํ•œ ์ž…๋ ฅ ๊ฒ€์ฆ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Next.js์—์„œ class-validator๋กœ ํƒ€์ž… ์•ˆ์ „์„ฑ ๋†’์ด๊ธฐ
Next.js๋กœ ๊ฐœ๋ฐœํ•  ๋•Œ API ๋ผ์šฐํŠธ๋‚˜ ํผ์—์„œ ๋„˜์–ด์˜ค๋Š” ๋ฐ์ดํ„ฐ์˜ ์œ ํšจ์„ฑ์„ ์–ด๋–ป๊ฒŒ ๊ฒ€์ฆํ•˜๊ณ  ๊ณ„์‹ ๊ฐ€์š”? Express๋‚˜ NestJS์™€ ๊ฐ™์€ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๋‹ฌ๋ฆฌ, Next.js์—๋Š” ๋‚ด์žฅ๋œ ์œ ํšจ์„ฑ ๊ฒ€์ฆ ๊ณ„์ธต์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๋ฐ์ดํ„ฐ์˜ ์ •ํ•ฉ์„ฑ์„ ํ™•์ธํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•˜์ฃ . ์ด ๊ธ€์—์„œ๋Š” NestJS ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ์ต์ˆ™ํ•œ class-validator ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ Next.js ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ๊ธฐ๋ฐ˜์˜ ๊น”๋”ํ•œ ์œ ํšจ์„ฑ ๊ฒ€์ฆ ๋กœ์ง์„ ํ†ตํ•ด ์–ด๋–ป๊ฒŒ ๋” ์•ˆ์ •์ ์ด๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์ข‹์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋‹จ๊ณ„๋ณ„๋กœ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๊ฐœ์ธ์ ์ธ ๊ฒฝํ—˜ ์ƒ class-validator ๋„์ž… ํ›„ ์ œํ’ˆ ์•ˆ์ •์„ฑ๊ณผ ๊ฐœ๋ฐœ ํŽธ์˜์„ฑ์ด ํ›จ์”ฌ ์ฆ๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. Nextjs๋Š” API ์„œ๋ฒ„๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ์— ๋ถˆํŽธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ ์•„ํ‚คํ…์ณ๋ฅผ ์ž˜ ์„ค๊ณ„ํ•˜๋ฉด Next.js์—์„œ๋„ ๊ฝค ์“ธ๋งŒํ•œ API ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์•„ํ‹ฐํด์€ Next.js 15๋ฒ„์ „์„ ๊ธฐ์ค€์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”. ๐Ÿ˜‰
TypeScript generic๊ณผ keyof๋กœ ํƒ€์ž… ์•ˆ์ „์„ฑ ๋†’์ด๊ธฐ
TypeScript๋กœ ์ž‘์—…ํ•˜๋‹ค ๋ณด๋ฉด ๋‹ค์–‘ํ•œ ํƒ€์ž…์— ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋Š” ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ์„ ๋•Œ๊ฐ€ ์žˆ์ฃ . ๋ฐ”๋กœ ์ด๋Ÿด ๋•Œ ์ œ๋„ค๋ฆญ(Generics)์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  keyof ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ์ฒด์˜ ์†์„ฑ์„ ์•ˆ์ „ํ•˜๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์–ด์š”. ์ด ๊ธ€์—์„œ๋Š” TypeScript์˜ ์ œ๋„ค๋ฆญ๊ณผ keyof๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‹ค์šฉ์ ์ธ ์˜ˆ์ œ์™€ ํ•จ๊ป˜ ์‚ดํŽด๋ณผ๊ฒŒ์š”. ๊ธฐ๋ณธ ๊ฐœ๋…๋ถ€ํ„ฐ ์‹ค๋ฌด์—์„œ ๋ฐ”๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํŒจํ„ด๊นŒ์ง€, ๋‹จ๊ณ„๋ณ„๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.
NestJS์—์„œ CQRS ํŒจํ„ด ์™„๋ฒฝ ๊ฐ€์ด๋“œ: ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์•„ํ‚คํ…์ฒ˜ ๊ตฌ์ถ•ํ•˜๊ธฐ
๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋†’์€ ์„ฑ๋Šฅ์„ ์š”๊ตฌํ•˜๋Š” ๋ฐฑ์—”๋“œ ์‹œ์Šคํ…œ์„ ๊ฐœ๋ฐœํ•˜๋‹ค ๋ณด๋ฉด ๊ธฐ์กด์˜ CRUD ํŒจํ„ด์ด ํ•œ๊ณ„๋ฅผ ๋“œ๋Ÿฌ๋‚ด๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ CQRS(Command Query Responsibility Segregation) ํŒจํ„ด์ด ํ•ด๊ฒฐ์ฑ…์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” NestJS์—์„œ CQRS ํŒจํ„ด์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‹จ๊ณ„๋ณ„๋กœ ์‚ดํŽด๋ณด๊ณ , ์‹ค์ œ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‹ค๋ฌด ๋…ธํ•˜์šฐ๋ฅผ ๊ณต์œ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. CQRS ํŒจํ„ด์˜ ํ•ต์‹ฌ ๊ฐœ๋…๋ถ€ํ„ฐ NestJS์—์„œ์˜ ์‹ค์ œ ๊ตฌํ˜„, ํ…Œ์ŠคํŒ… ์ „๋žต๊นŒ์ง€ ์ข…ํ•ฉ์ ์œผ๋กœ ๋‹ค๋ฃจ์–ด ์—ฌ๋Ÿฌ๋ถ„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•„ํ‚คํ…์ฒ˜๋ฅผ ํ•œ ๋‹จ๊ณ„ ๋Œ์–ด์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋„๋ก ๋„์™€๋“œ๋ฆฝ๋‹ˆ๋‹ค. ---
NestJS: Middleware์™€ Interceptor๊ฐ€ ๋ฌด์Šจ ์ฐจ์ด๊ณ  ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ• ๊นŒ?
NestJS๋กœ ๋ฐฑ์—”๋“œ๋ฅผ ๊ฐœ๋ฐœํ•˜๋‹ค ๋ณด๋ฉด middleware์™€ interceptor๋ฅผ ์–ธ์ œ ์‚ฌ์šฉํ•ด์•ผ ํ• ์ง€ ํ—ท๊ฐˆ๋ฆด ๋•Œ๊ฐ€ ์žˆ์–ด์š”. ๋‘ ๊ธฐ๋Šฅ ๋ชจ๋‘ ์š”์ฒญ๊ณผ ์‘๋‹ต ์‚ฌ์ด์— ๋กœ์ง์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์‹คํ–‰ ์‹œ์ ๊ณผ ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” NestJS์˜ request lifecycle์„ ๊ธฐ๋ฐ˜์œผ๋กœ middleware์™€ interceptor์˜ ์ฐจ์ด์ ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •๋ฆฌํ•˜๊ณ , ์‹ค๋ฌด์—์„œ ์–ด๋–ค ์ƒํ™ฉ์— ๋ฌด์—‡์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
JavaScript์˜ ์–•์€ ๋ณต์‚ฌ์™€ ๊นŠ์€ ๋ณต์‚ฌ ์ฐจ์ด๋ฅผ ์‰ฝ๊ฒŒ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.
JavaScript๋กœ ๊ฐœ๋ฐœํ•˜๋‹ค ๋ณด๋ฉด ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ์ž์ฃผ ์ƒ๊น๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹จ์ˆœํžˆ = ์—ฐ์‚ฐ์ž๋กœ ๋ณต์‚ฌํ•˜๋ฉด ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด์š”. ์™œ๋ƒํ•˜๋ฉด ๊ฐ์ฒด๋Š” ์ฐธ์กฐ ํƒ€์ž…์ด๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์–•์€ ๋ณต์‚ฌ์™€ ๊นŠ์€ ๋ณต์‚ฌ์˜ ์ฐจ์ด์ , ๊ฐ๊ฐ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€, ๊ทธ๋ฆฌ๊ณ  ์‹ค๋ฌด์—์„œ ๋ฐ”๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
Webgl์™€ Webgpu์˜ ๊ฐœ๋… ๋ฐ ์ฐจ์ด๋ฅผ ์•Œ์•„๋ณด์ž
์›น ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ๋ˆ„๊ตฌ๋‚˜ ํ•œ ๋ฒˆ์ฏค์€ 3D ๊ทธ๋ž˜ํ”ฝ์Šค๋‚˜ ๋ณต์žกํ•œ ์‹œ๊ฐํ™”๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์— ์ง๋ฉดํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ WebGL์ด ์›น์—์„œ ๊ณ ์„ฑ๋Šฅ ๊ทธ๋ž˜ํ”ฝ์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํ‘œ์ค€์ด์—ˆ๋‹ค๋ฉด, ์ด์ œ๋Š” WebGPU๋ผ๋Š” ์ƒˆ๋กœ์šด ์„ ํƒ์ง€๊ฐ€ ๋“ฑ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” WebGL๊ณผ WebGPU์˜ ํ•ต์‹ฌ ์ฐจ์ด์ ์„ ๋ถ„์„ํ•˜๊ณ , ๊ฐ๊ฐ์˜ ์žฅ๋‹จ์ ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์‹ค์ œ ๊ฐœ๋ฐœ ํ˜„์žฅ์—์„œ ์–ด๋–ค ๊ธฐ์ˆ ์„ ์„ ํƒํ•ด์•ผ ํ• ์ง€์— ๋Œ€ํ•œ ์‹ค์šฉ์ ์ธ ๊ฐ€์ด๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.