๐Ÿคฏ ํŒŒํŠธ 2: ํ˜ผ๋ˆ์—์„œ ์ •์‹  ํด๋ฆญ์œผ๋กœ: Angular๋ฅผ ํ˜„์‹ค ์„ธ๊ณ„์™€ ์—ฐ๊ฒฐํ•˜๊ธฐ (๊ทธ๋ฆฌ๊ณ  ์‚ด์•„๋‚จ๊ธฐ)

๋ฐœํ–‰: (2026๋…„ 2์›” 1์ผ ์˜ค์ „ 03:05 GMT+9)
8 min read
์›๋ฌธ: Dev.to

Source: Dev.to

๋ฒˆ์—ญํ•  ํ…์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ด ์ฃผ์‹œ๋ฉด ํ•œ๊ตญ์–ด๋กœ ๋ฒˆ์—ญํ•ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

์†Œ๊ฐœ

๊ณ„์†ํ•ด์„œโ€ฆ ์ด์ œ ์ง„์งœ ํ˜ผ๋ˆ์ด ์‹œ์ž‘๋์–ด์š” ๐Ÿ˜‚
์ด์ „ ํฌ์ŠคํŠธ์—์„œ๋Š” ๋กœ๊ทธ์ธ๊ณผ ํšŒ์›๊ฐ€์ž…์ด ๊ฐ€๋Šฅํ•œ ์˜จ๋ผ์ธ ํ”„๋กœ์ ํŠธ๋ฅผ Render์— ๋ฐฑ์—”๋“œ, Netlify์— ํ”„๋ŸฐํŠธ์—”๋“œ, Railway์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋‘๊ณ  ์šด์˜ํ–ˆ์–ด์š”. ๋‚˜ ํ–‰๋ณตํ•ด. ๊ธฐ๋ป. ์™œ๋ƒํ•˜๋ฉด ๋ฐ”๋กœ ์—ฌ๊ธฐ์„œ ์ง„์งœ ์ข‹์€ ๋ถ€๋ถ„์ด ์‹œ์ž‘๋˜๊ฑฐ๋“ ์š”: ์•ฑ์ด โ€œ์˜ˆ์œ ํ™”๋ฉดโ€์— ๋จธ๋ฌด๋ฅด์ง€ ์•Š๊ณ  ์‹ค์ œ ๋ฐ์ดํ„ฐ์™€ ํ•จ๊ป˜ ์‚ด์•„๊ฐ€๊ธฐ ์‹œ์ž‘ํ•˜๋Š” ๊ฑฐ์ฃ . โ€œ๋ชจ๋‘ ๋ชฉ(mock) ์ƒํƒœโ€์—์„œ โ€œ์ด์ œ ์ง„์งœ๋‹คโ€๋กœ.

Mock ๋ฐ์ดํ„ฐ ๋งŒ๋“ค๊ธฐ

๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ ๋’ค, ๋‚˜๋Š” ํ•ต์‹ฌ์ธ ์ž‘์—…์„ ํ–ˆ์Šต๋‹ˆ๋‹ค:

  • ๐Ÿ‘‰ Mock ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•ด์„œ ์•ฑ์— ์นด๋“œ๋“ค์„ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์™œ? ์—ฌ๊ธฐ์„œ @for, @if์™€ @switch๋ฅผ ๋งˆ์Œ๊ป ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์œผ๋กœ Angular๊ฐ€ ๋‹จ์ˆœํžˆ ์ด์ƒํ•œ ์ด๋ก ์ด ์•„๋‹ˆ๋ผ ์‹œ๊ฐ์ ์œผ๋กœ ์˜๋ฏธ๊ฐ€ ์ƒ๊ธฐ๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค๋Š” ๋А๋‚Œ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฌผ๋ก โ€ฆ ๊ทธ๊ฑด ๊ฑฐ์ง“์ด์—ˆ์Šต๋‹ˆ๋‹ค.

Angular๋ฅผ ์‹ค์ œ ๋ฐฑ์—”๋“œ์™€ ์—ฐ๊ฒฐํ•˜๊ธฐ

๋‹ค์Œ ๋‹จ๊ณ„๋Š” ๋ช…ํ™•ํ–ˆ์Šต๋‹ˆ๋‹ค:

  • ๐Ÿ‘‰ ๋ชจํฌ(mock) ์‚ฌ์šฉ ์ค‘๋‹จ

๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ ๋‚ด ์‚ถ์ด ๋ณต์žกํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ์ˆ˜์—…์—์„œ ์ œ๋Œ€๋กœ ์„ค๋ช…ํ•˜๊ธฐ ์ „์— ์‹œ๋„ํ•ด๋ดค์–ด์š”(์ „ํ˜•์ ์ธ ๋‚ด๊ฐ€ ์•ž์„œ ๋‚˜๊ฐ€๋Š” ๋ชจ์Šต ๐Ÿ˜…).

  • ์„œ๋น„์Šค๋Š” ์–ด๋””์— ๋‘๋Š”๊ฐ€
  • ํ”„๋กœ๋ฐ”์ด๋”๋Š” ์–ด๋–ป๊ฒŒ ์„ค์ •ํ•˜๋Š”๊ฐ€
  • environments๋Š” ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”๊ฐ€
  • ์™œ ์–ด๋–ค ๊ฒƒ์€ ์ปดํฌ๋„ŒํŠธ์— ๋‘๊ณ , ์–ด๋–ค ๊ฒƒ์€ ๋‘์ง€ ์•Š๋Š”๊ฐ€

๊ฒฐ๊ณผ

์นœ๊ตฌ์ธ ๊ทธ๋ ˆ๊ณ ๋ฆฌ์˜ค(ChatGPT)์™€ ์—ฌ๋Ÿฌ ์ฐจ๋ก€ ์‹ธ์šด ๋’คโ€ฆ ๋™์ž‘์€ ํ–ˆ์ง€๋งŒ ์™„์ „ํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ์–ด์š”.

๋ช‡ ์ฐจ์‹œ๊ฐ€ ์ง€๋‚œ ๋’ค, ๊ต์ˆ˜๋‹˜์ด ์ •ํ™•ํžˆ ์„ค๋ช…ํ•ด ์ฃผ์…จ์Šต๋‹ˆ๋‹ค:

  • ์„œ๋น„์Šค๋Š” ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐํ•˜๋Š”๊ฐ€
  • ๋ชจํฌ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ต์ฒดํ•˜๋Š”๊ฐ€
  • Angular ํ”„๋กœ์ ํŠธ๊ฐ€ ๊ฐ€์ ธ์•ผ ํ•  ํŒŒ์ผ์€ ๋ฌด์—‡์ธ๊ฐ€
  • ๊ฐ๊ฐ์˜ ์šฉ๋„๋Š” ๋ฌด์—‡์ธ๊ฐ€

๊ทธ๋•Œ ๋‚˜๋Š” โ€œAHHHH ์ด์ œ ์•Œ๊ฒ ์–ด.โ€ ๋ผ๊ณ  ์™ธ์ณค์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ๊ฒ€ํ† ํ–ˆ์ฃ โ€ฆ ์ง์ ‘ ํ…Œ์ŠคํŠธํ•ด๋ดค๊ธฐ ๋•Œ๋ฌธ์—. ๋น„๋กœ์†Œ ๋‚ด๊ฐ€ ๋ฌด์—‡์„ ํ•˜๊ณ  ์žˆ์—ˆ๋Š”์ง€ ์ง„์งœ๋กœ ์ดํ•ดํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ฐจ์ด๋Š”โ€ฆ ์—„์ฒญ๋‚ฌ์–ด์š”.

Formularios reactivos

๋ฆฌ์•กํ‹ฐ๋ธŒ ํผ์—์„œ๋„ ๊ฐ™์€ ์ผ์ด ์ผ์–ด๋‚ฌ์–ด์š”. ์ด๋ฏธ AI์˜ ๋„์›€์œผ๋กœ ๋งŒ๋“  ๊ฒƒ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค:

  • FormGroup
  • ReactiveFormsModule
  • Validaciones
  • Estados como touched, dirty, valid, invalid

ํ•˜์ง€๋งŒ ๋งˆ๋ฒ• ์ฃผ๋ฌธ์„ ๋ชจ๋ฅธ ์ฑ„ ๋งˆ๋ฒ•์„ ์“ฐ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•˜๊ณ , ๊ต์ˆ˜๋‹˜์ด ์„ค๋ช…ํ•ด ์ฃผ์‹ค ๋•Œ๊นŒ์ง€๋Š” ๊ทธ๋ ‡์•˜์Šต๋‹ˆ๋‹ค.

๐Ÿง  ๋‡Œ ํด๋ฆญ

๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์ด ์ ์„ ๊ฐ•์กฐํ•˜๊ณ  ์‹ถ์–ด์š”: AI๋Š” ์ •๋ง ํฐ ๋„์›€์ด ๋˜์ง€๋งŒ, ๊ทธ๊ฒƒ์ด ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ๊ณผ๋Š” ๋ณ„๊ฐœ์ž…๋‹ˆ๋‹ค. ๋ฐฐ์šด ๊ฒƒ์— ์ž์‹ ์„ ๋‘๊ณ  ์ดํ•ดํ•˜์—ฌ ๋‹จ์ˆœํ™”ํ•˜์„ธ์š”. Keep it simple (ํ•˜์ง€๋งŒ ์ €๋Š” ์ฒ˜์Œ์— ๊ทธ๊ฑธ ๋ฌด์‹œํ–ˆ์–ด์š” ๐Ÿ˜…).

์ผ๋ฐ˜์ ์ธ ์˜ค๋ฅ˜

๋‚ด ํ”„๋กœ์ ํŠธ๋„ ์—ฌ๋Ÿฌ ๊ฐœ๋…์„ ์•ž์„œ ๋‚˜๊ฐ€๋ฉด์„œ ๊ณ ์ „์ ์ธ ์‹ค์ˆ˜๋ฅผ ์ €์งˆ๋ €๊ธฐ ๋•Œ๋ฌธ์— ๋ณต์žกํ•ด์กŒ์–ด์š”:

  • ๐Ÿ‘‰ ์‹œ์ž‘๋ถ€ํ„ฐ ์•„์ด๋””์–ด๋ฅผ 100โ€ฏ% ๋ช…ํ™•ํžˆ ํ•˜์ง€ ์•Š์€ ๊ฒƒ.

ํŽ˜์ด์ง€, ๋ถ€๋ชจ/์ž์‹ ์ปดํฌ๋„ŒํŠธ, ๋ผ์šฐํŠธ ๋ฐ ์„œ๋กœ ์˜ค๊ฐ€๋Š” ๋ฐ์ดํ„ฐ ์‚ฌ์ด์—์„œโ€ฆ ์ •๋ง ์‰ฝ๊ฒŒ ์—‰๋ง์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

๋‚ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋„ˆ๋ฌด ์ •๊ทœํ™”๋˜์–ด ์žˆ์—ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ์„œ๋กœ ์˜์กดํ–ˆ๋‹ค. ๋ฐฑ์—”๋“œ์—์„œ๋Š” โ€œ์˜ˆ์˜๊ฒŒโ€ ๋ณด์˜€์ง€๋งŒ, ๋ฌธ์ œ๊ฐ€ ๋˜์—ˆ๋‹ค.

์–‘๋ฐฉํ–ฅ ๋ฐ”์ธ๋”ฉ๊ณผ ๊ทธ ๋†€๋ผ์šด ์ˆœ๊ฐ„

์ˆ˜์—…์—์„œ ์–‘๋ฐฉํ–ฅ ๋ฐ”์ธ๋”ฉ์„ ๋ฐฐ์› ์„ ๋•Œ, ์ฒ˜์Œ์—” ์ „ํ˜€ ์ดํ•ด ๋ชปํ–ˆ์–ด์š”(์ง„์งœ). ํ•˜์ง€๋งŒ ์ €๋Š” ๊ณ ์ง‘์ด ์žˆ์–ด์š”. ๋ช‡ ์‹œ๊ฐ„ ํ›„โ€ฆ ๊ฐ‘์ž๊ธฐโ€ฆ

  • ๐Ÿ‘‰ โ€œ์ด๊ฒŒ ๋ฐ”๋กœ ๋‚ด ํ”„๋กœ์ ํŠธ์— ์ด๋ฒคํŠธ๋ฅผ ๋งŒ๋“ค ๋•Œ ํ•„์š”ํ•œ ๊ฑฐ์•ผ.โ€

๋ฐ์ดํ„ฐ ํƒ€์ž… ๋•Œ๋ฌธ์— (๋งŽ์€ date, Angular๊ฐ€ ํ™”๋‚จ ๐Ÿ˜…) ์–ด๋ ค์›€์ด ์žˆ์—ˆ์ง€๋งŒ ํ•ด๋ƒˆ์–ด์š”. ๋ฉฐ์น  ๋™์•ˆ ์ดํ•ด ๋ชปํ–ˆ๋˜ ๊ฒƒ์ด ๊ฐ‘์ž๊ธฐ ์˜๋ฏธ๊ฐ€ ํ†ตํ•  ๋•Œโ€ฆ ์ˆœ์ˆ˜ํ•œ ๋งˆ๋ฒ•์ด์ฃ .

์•ฑ์˜ ํ˜„์žฌ ์ƒํƒœ

๋‚ด ํ”„๋กœ์ ํŠธ๋Š” ์™„๋ฒฝํ•˜๊ฑฐ๋‚˜ ์•„์ฃผ ๊น”๋”ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ, ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒŒ ๋‚˜์—๊ฒŒ๋Š” ์—„์ฒญ๋‚ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ์•ฑ์€ ๋‹ค์Œ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค:

  1. ๋žœ๋”ฉ ํŽ˜์ด์ง€

์ด ๋ชจ๋“  ๊ฒƒ์ด ๋‹ค์Œ๊ณผ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค:

  • Angular (ํ”„๋ก ํŠธ์—”๋“œ)
  • FastAPI (๋ฐฑ์—”๋“œ)
  • Railway์˜ MySQL (๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค)
  • JWT ์ธ์ฆ

์ด ๊ณผ์ •์—์„œ ๊ฐ€์žฅ ํ˜„์‹ค์ ์ธ ๊ฒƒ

๊ฐ€์žฅ ํž˜๋“ค์—ˆ๋˜ ๊ฒƒ์€ ์ฝ”๋“œ๋ฅผ ์“ฐ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ์—ˆ๋‹ค. ๊ทธ๊ฒƒ์€:

  • ๊ธธ์„ ์žƒ๋‹ค
  • ๋ฌผ๊ฑด์„ ๋ถ€์ˆ˜๋‹ค
  • ๋ฌด์—‡์„ ๊ฑด๋“œ๋ ธ๋Š”์ง€ ๋ชจ๋ฅธ ์ฑ„ 2โ€ฏ์‹œ๊ฐ„ ๋™์•ˆ ๋ญ”๊ฐ€๋ฅผ ๊ณ ์น˜๊ธฐ
  • AI์˜ ์ง€์‹œ๋ฅผ ๋”ฐ๋ฅด๋‹ค ๋” ์•…ํ™”๋˜๋‹ค
  • โ€œ์ž‘๋™ํ•ด์•ผ ํ• โ€ ๊ฒƒ์ด ์™œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”์ง€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•จ

ํ•˜์ง€๋งŒ ๋˜ํ•œ:

  • ๋„์›€์„ ์š”์ฒญํ•˜๋‹ค
  • ๋‹จ์ˆœํ•จ์œผ๋กœ ๋Œ์•„๊ฐ€๋‹ค
  • ๊ต์ˆ˜๋“ค์ด ๊ฐ€๋ฅด์น˜๋Š” ๊ฒƒ๊ณผ ๋น„๊ตํ•˜๋‹ค
  • ์‹œ๋„ํ•˜๊ณ , ๋ถ€์ˆ˜๊ณ , ๋‹ค์‹œ ๋งŒ๋“ค๋‹ค

๊ทธ๋ฆฌ๊ณ  ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€:

  • ๐Ÿ‘‰ ํฌ๊ธฐํ•˜์ง€ ์•Š๊ธฐ.

๋ช‡ ๋‹ฌ ์ „์˜ ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ๊ทธ๊ฒŒ ๊ธˆ๊ฐ’์ด๋‹ค ๐Ÿ’›

์•ฑ ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•

๐Ÿš€ ์ด์ œ ์•ฑ์„ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์•„์ง ํ•  ์ผ์ด ๋งŽ๊ณ  ๊ฐœ์„ ํ•  ์ ๋„ ๋งŽ์•„์š”, ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค).

๋งŽ์€ ๋ฐ˜๋ณต, ๋ฒ„๊ทธ, ๋ฆฌํŒฉํ„ฐ๋ง, ๊ทธ๋ฆฌ๊ณ  ์กด์žฌ๋ก ์  ์œ„๊ธฐ ์ˆœ๊ฐ„๋“ค์„ ๊ฒช์€ ๋’คโ€ฆ

Angular ํ”„๋ก ํŠธ์—”๋“œ

๊ตฌ๊ฒฝํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ๋‹ค์Œ ๋ฐ๋ชจ ์‚ฌ์šฉ์ž๋กœ ๋กœ๊ทธ์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • ์‚ฌ์šฉ์ž: laura.lopez@demo.com

์œ ์šฉํ•œ ๋งํฌ

  • ํ”„๋ก ํŠธ์—”๋“œ (์‹ค์ œ ์•ฑ):
  • ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”๋“œ:
  • ๋ฐฑ์—”๋“œ ์ฝ”๋“œ:
Back to Blog

๊ด€๋ จ ๊ธ€

๋” ๋ณด๊ธฐ ยป

JWT๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

JWT๊ฐ€ ๋ฌด์—‡์ธ๊ฐ€์š”? JWT(JSON Web Token)๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•œ ํ›„ ๋ฐฑ์—”๋“œ๊ฐ€ ์ƒ์„ฑํ•˜๋Š” ์ž‘์€ ๋””์ง€ํ„ธ ํ‚ค์™€ ๊ฐ™์€ ํ† ํฐ์ž…๋‹ˆ๋‹ค. ์„œ๋ฒ„์— โ€œ์˜ˆ, ์ด ์‚ฌ์šฉ์ž๋Š” ์ด๋ฏธ โ€ฆโ€ ๋ผ๊ณ  ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

Angular i18n์—์„œ ๋ˆ„๋ฝ๋œ ์กฐ๊ฐ

์•ฑ์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ๋ฒˆ์—ญ์ด ๊นจ์ง€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ Angular์˜ i18n ์Šคํ† ๋ฆฌ๊ฐ€ ์ฒ˜์Œ์—๋Š” ์™„์ „ํ•ด ๋ณด์ด์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋Š” ์ ์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด์— ๋งˆํฌ๋ฅผ ํ•˜๊ณ , `ng extract-i18n`๋ฅผ ์‹คํ–‰ํ•˜๊ณ , โ€ฆ

Angular(v21)์—์„œ Effects์™€ InjectionContext

ํšจ๊ณผ์˜ ์ƒ๋ช… ๋งˆ์Šคํ„ฐํ•˜๊ธฐ: ์ธ์ ์…˜ ์ปจํ…์ŠคํŠธ์™€ ๊ทธ ๋„ˆ๋จธ ํšจ๊ณผ๊ฐ€ ์™œ ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๋ ค๋ฉด, ์šฐ๋ฆฌ๋Š” โ€œ์ˆจ๊ฒจ์ง„โ€ ํ™˜๊ฒฝ์„ ์‚ดํŽด๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.