Skip to content

๐Ÿ“’ ๋ฉ˜ํ† ๋ง โ€‹

4ํšŒ์ฐจ ๐Ÿ—“๏ธ 26.03.17
๐Ÿค– AI & ์ƒ์‚ฐ์„ฑ โ€‹

PR์„ ๋‹จ์ˆœํ•œ ์ฝ”๋“œ ์ œ์ถœ์ด ์•„๋‹ˆ๋ผ, ํ•˜๋‚˜์˜ ๋ฌธ์„œ์ด์ž ํžˆ์Šคํ† ๋ฆฌ ๊ธฐ๋ก์œผ๋กœ ๋‚จ๊ธด๋‹ค๋Š” ๊ด€์ ์œผ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

  • PR ์„ค๋ช…์€ ์ƒ์„ธํ• ์ˆ˜๋ก ์ข‹๋‹ค.
  • ๋ณ€๊ฒฝ ์ด์œ  / ์„ค๊ณ„ ์˜๋„ / ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋ฅผ ๊ธฐ๋กํ•œ๋‹ค.
  • ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ์˜ ๊ฒฝ์šฐ ์ž‘์„ฑ์ž๊ฐ€ ์…€ํ”„ ๋ฆฌ๋ทฐ ์ฝ”๋ฉ˜ํŠธ๋ฅผ ๋‚จ๊ฒจ ์˜๋„๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅ
  • AI๋ฅผ ํ™œ์šฉํ•œ PR ๋ฆฌ๋ทฐ ์ž‘์„ฑ๋„ ์ ๊ทน์ ์œผ๋กœ ์‹œ๋„ํ•ด๋ณด๊ธฐ โ†’ ๋ฐ˜๋ณต ์ž‘์—…์„ ์ค„์ด๊ณ  ์ƒ์‚ฐ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Œ
๐ŸŒณ Git Worktree โ€‹
๐Ÿ” Next.js ์ธ์ฆ ๋ฐ ๋ฐ์ดํ„ฐ ํŽ˜์นญ โ€‹

Fetcher๋ฅผ ํด๋ผ์ด์–ธํŠธ / ์„œ๋ฒ„๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ํŒจํ„ด์„ ์ถ”์ฒœ

  • ClientSideFetcher โ†’ Axios ๊ธฐ๋ฐ˜
  • ServerSideFetcher โ†’ fetch ๊ธฐ๋ฐ˜

๊ถŒ์žฅ ์•„ํ‚คํ…์ฒ˜

less
Token Service (๋…๋ฆฝ)
   โ†“
Fetcher
   โ†“
API ํ•จ์ˆ˜

ํ† ํฐ ๊ด€๋ฆฌ๋ฅผ ๋ณ„๋„ ์„œ๋น„์Šค๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , Fetcher๊ฐ€ ํ† ํฐ ์„œ๋น„์Šค๋ฅผ ํ†ตํ•ด ํ† ํฐ์„ ๋ฐ›์•„ API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ตฌ์กฐ.

  • ๋…๋ฆฝ๋œ ํ† ํฐ ์„œ๋น„์Šค: ํ† ํฐ ๊ด€๋ฆฌ ๋กœ์ง์„ ๋ณ„๋„๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ Fetcher โ†’ API ํ˜ธ์ถœ ๊ตฌ์กฐ๋กœ ์—ฐ๊ฒฐ
  • ์ฟ ํ‚ค ์‚ฌ์šฉ ๊ถŒ์žฅ: localStorage๋Š” ์„œ๋ฒ„์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— Next.js ํ™˜๊ฒฝ์—์„œ๋Š” ์ฟ ํ‚ค ๊ธฐ๋ฐ˜ ์ธ์ฆ์ด ์œ ๋ฆฌํ•˜๋‹ค.
  • next/headers, js-cookie ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉ ๊ฐ€๋Šฅ
๐Ÿงฉ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ(RSC)์˜ ํŠน์„ฑ๊ณผ ์ฃผ์˜์  โ€‹
  • ์ปดํฌ๋„ŒํŠธ ํฌํ•จ ๊ทœ์น™: ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋Š” ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ฐ˜๋Œ€๋Š” ๋ถˆ๊ฐ€๋Šฅ
  • ์Šค๋ƒ…์ƒท์˜ ํ•จ์ •: ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋Š” ํ•ญ์ƒ ์ตœ์‹  ๊ฐ’์„ ๋ณด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์š”์ฒญ ์‹œ์ ์˜ ์ƒํƒœ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ Œ๋”๋ง๋œ๋‹ค.
  • next/headers์˜ cookies ๊ฐ’๋„ snapshot์ด๋‹ค โ†’ ์‹ค์‹œ๊ฐ„ ๋ณ€๊ฒฝ ๋Œ€์‘ ์‹œ ์ฃผ์˜ ํ•„์š”
๐Ÿ”Ž ์ฐพ์•„๋ณด๊ธฐ โ€‹
  • Claude Serena, Ghostty
  • DIP (Dependency Inversion Principle): ์˜์กด์„ฑ ์—ญ์ „ ์›์น™. ํ† ํฐ ์„œ๋น„์Šค ๋“ฑ์„ ๊ตฌํ˜„ํ•  ๋•Œ ์ƒ์œ„ ๋ชจ๋“ˆ์ด ํ•˜์œ„ ๋ชจ๋“ˆ์— ์˜์กดํ•˜์ง€ ์•Š๊ฒŒ ์„ค๊ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ISP (Interface Segregation Principle): ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™. ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ์— ์˜์กดํ•˜์ง€ ์•Š๋„๋ก ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ž‘๊ฒŒ ์ชผ๊ฐœ๋Š” ์›์น™
  • next/headers์— ์˜์กดํ•˜์ง€ ์•Š๋Š” ํ† ํฐ ๊ด€๋ฆฌ ๊ตฌ์กฐ
5ํšŒ์ฐจ ๐Ÿ—“๏ธ 26.03.20
๐Ÿงฉ SOLID / ์ถ”์ƒ ๋ ˆ์ด์–ด โ€‹
  • ๋ณต์žกํ•œ ๋กœ์ง์€ ์ถ”์ƒ ๋ ˆ์ด์–ด๋กœ ์ˆจ๊ธด๋‹ค.
  • ์‚ฌ์šฉํ•˜๋Š” ์ชฝ์—์„œ๋Š” ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ๋ชฐ๋ผ๋„ ๋˜๊ฒŒ ๋งŒ๋“ ๋‹ค.
  • ์„œ๋น„์Šค ๊ณ„์ธต์€ ๊ฐ€๋Šฅํ•œ ์ˆœ์ˆ˜ ํ•จ์ˆ˜ ํ˜•ํƒœ๋กœ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

์ถ”์ƒ ๋ ˆ์ด์–ด ์˜๋ฏธ
๋ณต์žกํ•œ ๋กœ์ง์„ ๋ฐ–์—์„œ ์•Œ ํ•„์š” ์—†๊ฒŒ ์ˆจ๊ธฐ๋Š” ๊ตฌ์กฐ. ์‚ฌ์šฉํ•˜๋Š” ์ชฝ์—์„œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์•Œ๋ฉด ๋œ๋‹ค.

๐Ÿ” ์ธ์ฆ โ€” ํ† ํฐ ์„œ๋น„์Šค ๋ถ„๋ฆฌ โ€‹

ํ† ํฐ ๊ด€๋ฆฌ ๋กœ์ง์€ ์ „์—ญ ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๋ผ ๋…๋ฆฝ๋œ ์„œ๋น„์Šค ๋ ˆ์ด์–ด๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
์ง€์–‘ํ•ด์•ผ ํ•  ํŒจํ„ด - ์ „์—ญ ์ƒํƒœ์— ํ† ํฐ ์ €์žฅ

  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜ต์…˜: js-cookie / iron-session / ์ง์ ‘ ๊ตฌํ˜„
  • localStorage๋Š” ์„œ๋ฒ„์—์„œ ์ ‘๊ทผ ๋ถˆ๊ฐ€ โ†’ Next.js ํ™˜๊ฒฝ์—์„œ๋Š” ์ฟ ํ‚ค ๊ธฐ๋ฐ˜ ์ธ์ฆ์ด ์œ ๋ฆฌ
โšก useSyncExternalStore โ€‹

์ฟ ํ‚ค / ์„ธ์…˜ / ์™ธ๋ถ€ ์ €์žฅ์†Œ ๊ฐ’์„ ์ฝ์„ ๋•Œ ์‚ฌ์šฉ. React ์ƒํƒœ๊ฐ€ ์•„๋‹Œ ์™ธ๋ถ€ ์ €์žฅ์†Œ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๊ตฌ๋…ํ•  ์ˆ˜ ์žˆ๋‹ค.

ts
const token = useSyncExternalStore(
  TokenService.subscribe,
  TokenService.getSnapshot,
);
  • ๋น„๋™๊ธฐ ํƒ€์ด๋ฐ ๋ฌธ์ œ ๋ฐฉ์ง€
  • ์™ธ๋ถ€ ์ €์žฅ์†Œ ๊ตฌ๋… ๊ฐ€๋Šฅ
  • concurrent ํ™˜๊ฒฝ ๋Œ€์‘
๐Ÿ”Ž ์ฐพ์•„๋ณด๊ธฐ โ€‹
  • SOLID ์›์น™
  • ์ถ”์ƒ ๋ ˆ์ด์–ด
Q CI ํƒ€์ž… ์ฒดํฌ ๋‹จ๊ณ„์—์„œ ๋ฐœ์ƒํ•œ ์˜ค๋ฅ˜์™€ ๊ด€๋ จํ•ด, ํ˜„์žฌ ํ•ด๊ฒฐ ๋ฐฉํ–ฅ์ด ์ ์ ˆํ•œ์ง€ ์—ฌ์ญค๋ณด๊ณ  ์‹ถ์–ด ์งˆ๋ฌธ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

[์ƒํ™ฉ - Github Actions]
CI์—์„œ tsc --noEmit ์‹คํ–‰ ์‹œ PNG import์— ๋Œ€ํ•ด Cannot find module 'png' ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
๋กœ์ปฌ์—์„œ๋Š” ๋™์ผ ์ฝ”๋“œ๊ฐ€ ์ •์ƒ ๋™์ž‘ํ•˜๋Š”๋ฐ, GitHub Actions์˜ type-check ๋‹จ๊ณ„์—์„œ๋งŒ ์‹คํŒจํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


[ํ˜„์žฌ ์ ์šฉํ•œ ํ•ด๊ฒฐํ•œ ๋ฐฉ๋ฒ• - Github ์ ์šฉ ์ฝ”๋“œ]
src/types/images.d.ts๋ฅผ ์ถ”๊ฐ€ํ•ด ์ด๋ฏธ์ง€ ๋ชจ๋“ˆ declaration ์ •์˜ ํ–ˆ๊ณ ,
tsconfig.json์˜ include์— next-env.d.ts ๋ช…์‹œํ•˜๋‹ˆ CI ํƒ€์ž…์ฒดํฌ๊ฐ€ ํ†ต๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค.


[๊ณ ๋ฏผ๋˜๋Š” ์ ]
Next.js๋Š” next build ๊ณผ์ •์—์„œ .next/types ๊ด€๋ จ ํƒ€์ž… ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  next-env.d.ts๊ฐ€ ์ด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ตฌ์กฐ๋กœ ์ดํ•ดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ CI์ฒ˜๋Ÿผ tsc --noEmit๋งŒ ๋‹จ๋…์œผ๋กœ ์‹คํ–‰๋˜๋Š” ํ™˜๊ฒฝ์—์„œ๋Š” ๋กœ์ปฌ๊ณผ ํƒ€์ž… ํ™˜๊ฒฝ์ด ๋‹ฌ๋ผ์ ธ์„œ ์œ„์™€ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฃผ๊ฐ•์‚ฌ๋‹˜๊ป˜์„œ CI ์ˆœ์„œ๋ฅผ build โ†’ type-check๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์ œ์•ˆํ•ด ์ฃผ์…จ๋Š”๋ฐ, ๊ฐœ์ธ์ ์œผ๋กœ๋Š” ํƒ€์ž… ์—๋Ÿฌ๊ฐ€ ์žˆ๋Š”๋ฐ ๋นŒ๋“œ ๊ณผ์ •์„ ๊ฑฐ์น  ํ•„์š”๊ฐ€ ์—†์œผ๋‹ˆ type-check โ†’ build ์ˆœ์„œ๊ฐ€ ๋” ์ž์—ฐ์Šค๋Ÿฝ์ง€ ์•Š์„๊นŒ?"๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๊ฒฐํ•œ ๋ฐฉ๋ฒ•์ฒ˜๋Ÿผ, ์ด๋ฏธ์ง€ ๋ชจ๋“ˆ ํƒ€์ž…์„ ์ง์ ‘ ์„ ์–ธํ•ด์„œ ๊ธฐ์กด CI ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ์‹์ด ๋งž๋Š”์ง€
Next.js์˜ ๋™์ž‘ ๋ฐฉ์‹์— ๋งž์ถฐ ๋นŒ๋“œ๋ฅผ ๋จผ์ € ๊ฑฐ์น˜๋Š” ๊ฒƒ์ด ๋” ์ผ๋ฐ˜์ ์ธ์ง€ ํŒ๋‹จ์ด ์–ด๋ ค์›Œ ์งˆ๋ฌธ๋“œ๋ฆฝ๋‹ˆ๋‹ค.


[๊ถ๊ธˆํ•œ ์ ]

Q. ํ˜„์žฌ์ฒ˜๋Ÿผ .d.ts๋กœ ์ด๋ฏธ์ง€ ๋ชจ๋“ˆ declaration์„ ์ˆ˜๋™์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์ด Next.js ํ”„๋กœ์ ํŠธ์—์„œ๋„ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ถŒ์žฅ๋˜๋Š” ๋ฐฉํ–ฅ์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.
A. type.d.ts๋Š” ๋งŽ์ด ์“ด๋‹ค. ์™ธ๋ถ€ SDK ์—ฐ๊ฒฐ ์‹œ์—๋„ ์ž์ฃผ ์‚ฌ์šฉ.
Q. ๋งŒ์•ฝ build โ†’ type-check ์ˆœ์„œ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค๋ฉด, ๋‹จ์ˆœ ํƒ€์ž… ์˜ค๋ฅ˜ ํ™•์ธ์„ ์œ„ํ•ด ๋งค๋ฒˆ ๋นŒ๋“œ๋ฅผ ๋จผ์ € ์ˆ˜ํ–‰ํ•˜๋Š”๊ฒŒ ๋น„ํšจ์œจ์ ์ด์ง€ ์•Š์€์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.
A. build โ†’ type-check๋„ ์‹ค์ œ๋กœ ์“ฐ๋Š” ํŒจํ„ด.
Next.js ํ”„๋กœ์ ํŠธ์—์„œ ๋นŒ๋“œ๋ฅผ ๋จผ์ € ๋Œ๋ฆฐ ๊ฒฝ์šฐ๋„ ์žˆ์—ˆ๋‹ค๊ณ  ํ•˜์…จ๋‹ค.

  1. ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ์ด ์†Œ์Šค๋ฅผ ์˜ค์—ผ์‹œํ‚ฌ ํ™•๋ฅ ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด
  2. ๋นŒ๋“œ ์‹คํŒจ๋ฅผ Actions๋กœ ์ฒดํ‚นํ•˜๋Š” ๊ฒƒ ์ž์ฒด๊ฐ€ ๋น„์šฉ์ด๊ธฐ ๋•Œ๋ฌธ

ํ•˜์ง€๋งŒ, ๋‹จ์ˆœ ํƒ€์ž… ์˜ค๋ฅ˜ ํ™•์ธ์„ ์œ„ํ•ด ๋งค๋ฒˆ ๋นŒ๋“œ๋ฅผ ๋จผ์ € ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฑด ๋น„ํšจ์œจ์ ์ด๊ธด ํ•˜๋‹ค๊ณ  ํ•˜์…จ๋‹ค.

Q. ์ฐพ์•„๋ณด๋‹ˆ Next.js 15.5๋ถ€ํ„ฐ ์ง€์›ํ•˜๋Š” next typegen ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ „์ฒด ๋นŒ๋“œ ์—†์ด ํƒ€์ž… ํŒŒ์ผ๋งŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. CI ํ™˜๊ฒฝ์—์„œ๋Š” next typegen โ†’ tsc --noEmit โ†’ next build ๊ฐ™์€ ํ๋ฆ„์œผ๋กœ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ ์ ˆํ• ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.
A. ์ฒ˜์Œ ๋“ค์–ด๋ณธ ๋ฐฉ์‹์ด๋ผ ์ฐพ์•„๋ณด์•˜๋Š”๋ฐ, ์ ์šฉํ•ด๋ด๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ์˜๊ฒฌ ์ฃผ์‹ฌ

6ํšŒ์ฐจ ๐Ÿ—“๏ธ 26.03.23

๐Ÿ“š ๋ฉ˜ํ† ๋‹˜ ๊ณต์œ  ์ž๋ฃŒ โ€‹

ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ ์ค‘ ๋ฉ˜ํ† ๋‹˜์ด ๊ณต์œ ํ•ด์ฃผ์‹  ์ž๋ฃŒ ๋ฐ ๊ธฐ์ˆ  ์ฐธ๊ณ  ๋งํฌ ์ •๋ฆฌ

๐Ÿ“„ Documentation / Visualization