๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • What would life be If we had no courage to attemp anything?
Development/Next.js

[Next.js] SWC๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋นŒ๋“œ ์‹œ๊ฐ„ ๋‹จ์ถ•ํ•˜๊ธฐ

by DevIseo 2024. 11. 1.

SWC๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋นŒ๋“œ ์‹œ๊ฐ„ ๋‹จ์ถ•ํ•˜๊ธฐ

(์ขŒ) ํ”„๋ก ํŠธ github actions summary (์šฐ) ๋ฐฑ์—”๋“œ github actions summary

 

 

์‚ฌ๋‚ด์—์„œ๋Š” CI/CD ๋„๊ตฌ๋กœ ๊นƒํ—™ ์•ก์…˜์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.

๋ฐฑ์—”๋“œ์™€ ๋‹ค๋ฅด๊ฒŒ ํ”„๋ก ํŠธ๋Š” ์•ก์…˜์ด ์™„๋ฃŒ๋˜๋Š”๋ฐ ๊นŒ์ง€ ์ „์ฒด์ ์ธ ์‹œ๊ฐ„์ด ์ข€ ๋” ์†Œ์š”๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

ํ˜„์žฌ ๋‚ด๊ฐ€ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ๋Š” ํ”„๋ก ํŠธ ํ™˜๊ฒฝ์—์„œ CI/CD ๊ณผ์ • ์ค‘ ๊ฐ€์žฅ ์†Œ์š” ์‹œ๊ฐ„์ด ๊ธด ์Šคํƒญ์€ ๋นŒ๋“œ ํ›„ ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค์–ด ECR๋กœ ์˜ฎ๊ธฐ๋Š” ์‹œ์ ์ด๋‹ค.

 

ํด๋ผ์šฐ๋“œ ํ”„๋ก ํŠธ ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ ํƒ€์ž„(์ขŒ) ECR PUSH ํƒ€์ž„(์šฐ)

 

๊ทธ ์ค‘ CI ๊ณผ์ • ์ค‘์—์„œ ํ”„๋ก ํŠธ ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ ์‹œ๊ฐ„๊ณผ ECR PUSH ํƒ€์ž„์ด ๋Œ€๋ถ€๋ถ„์„ ์ฐจ์ง€ํ•จ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

โ“๊ทธ๋ ‡๋‹ค๋ฉด,ํ”„๋ก ํŠธ ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ ์‹œ๊ฐ„์„ ์–ด๋–ป๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ์„๊นŒ?

 

 

Next.js ๋นŒ๋“œ ์‹œ๊ฐ„์„ ๋‹จ์ถ• ํ•˜๋Š” ๋ฐฉ๋ฒ•

  • SWC ์ฝ”๋“œ ์••์ถ• ํ™œ์„ฑํ™”: swcMinify: true๋ฅผ ์„ค์ •ํ•ด ๋นŒ๋“œ ์‹œ SWC๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ๋ฅผ ์••์ถ•ํ•˜์—ฌ ์ตœ์ ํ™”.
  • Webpack ์บ์‹ฑ ์‚ฌ์šฉ: Webpack ํŒŒ์ผ ์‹œ์Šคํ…œ ์บ์‹œ๋ฅผ ํ™œ์„ฑํ™”ํ•ด ์žฌ๋นŒ๋“œ ์†๋„๋ฅผ ๋†’์ž„.
  • Dynamic Imports: ๋™์  ์ž„ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ดˆ๊ธฐ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ณ  ํ•„์š”ํ•œ ๋ชจ๋“ˆ๋งŒ ๋กœ๋“œ.
  • ์ •์  ํŽ˜์ด์ง€ ๋ฐ ISR ์‚ฌ์šฉ: ์ •์  ํŽ˜์ด์ง€ ์ƒ์„ฑ์„ ํ™œ์šฉํ•˜๊ณ  Incremental Static Regeneration(ISR)์œผ๋กœ ๋นŒ๋“œ ์‹œ๊ฐ„ ๋‹จ์ถ•.
  • ์ด๋ฏธ์ง€ ์ตœ์ ํ™”: next/image ์„ค์ •์„ ์ตœ์ ํ™”ํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค ํฌ๊ธฐ ์ค„์ด๊ธฐ.

์ด ๋ฐฉ๋ฒ•๋“ค ์ค‘์—์„œ ์ด๋ฏธ์ง€ ์ตœ์ ํ™”์˜ ๊ฒฝ์šฐ sparrow-components์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฏธ์ง€ ์™ธ์— next์—์„œ ์ œ๊ณตํ•˜๋Š” Image๋ฅผ ์ด๋ฏธ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ ์ถ”ํ›„์— ๋” ๋ณด๊ฒ ๋‹ค.

Architecture: Next.js Compiler

๋‹ค์–‘ํ•œ ๋นŒ๋“œ ์‹œ๊ฐ„ ๋‹จ์ถ• ๋ฐฉ๋ฒ• ์ค‘์—์„œ๋„ ๋‚˜๋Š” Next.js ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์— ์†Œ๊ฐœ ๋œ SWC์— ๋Œ€ํ•ด ๊ด€์‹ฌ์„ ๊ฐ€์ง€๊ฒŒ ๋˜์—ˆ๋‹ค.

SWC๋ž€?

SWC๋Š” Speedy Web Compiler์˜ ์•ฝ์ž๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ์ ํŠธ์˜ ์ปดํŒŒ์ผ๊ณผ ๋ฒˆ๋“ค๋ง ๋ชจ๋‘์— ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š”, Rust๋กœ ์ œ์ž‘ ๋œ ๋นŒ๋“œ ํˆด์ด๋‹ค. ์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ๋งค์šฐ ๋น ๋ฅธ ์›น ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

SWC๋Š” ์™œ ๋น ๋ฅผ๊นŒ?

Next.js์—์„œ๋Š” SWC๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐœ๋ฐœํ•œ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํ†ตํ•ด ๊ธฐ์กด ๋นŒ๋“œ์— ํ™œ์šฉํ•˜๋˜ ๋ฐ”๋ฒจ๊ณผ Terser๋ฅผ ๋Œ€์ฒดํ–ˆ๋‹ค. ์ฆ‰, Next.js์˜ ๋นŒ๋“œ ๊ณผ์ • ์ค‘ ํŠธ๋žœ์ŠคํŒŒ์ผ๋ง์„ ์ˆ˜ํ–‰ํ–ˆ๋˜ ๋ฐ”๋ฒจ๊ณผ, ์ฝ”๋“œ ๊ฒฝ๋Ÿ‰ํ™”๋ฅผ ์ˆ˜ํ–‰ํ–ˆ๋˜ Terser๊ฐ€ SWC๋กœ ๋Œ€์ฒด๋œ๋‹ค๋Š” ๋œป์ด๋‹ค. SWC๋กœ ๊ต์ฒดํ•จ์œผ๋กœ์จ ํŠธ๋žœ์ŠคํŒŒ์ผ๋ง์€ ๋ฌด๋ ค 17๋ฐฐ๋‚˜ ๋นจ๋ผ์กŒ๋‹ค๊ณ  ํ•˜๋ฉฐ, ์ฝ”๋“œ ๊ฒฝ๋Ÿ‰ํ™” ์ž‘์—…์€ 7๋ฐฐ๊ฐ€ ๋นจ๋ผ์กŒ๋‹ค๊ณ  ํ•œ๋‹ค.

 

 

ํด๋ผ์šฐ๋“œ ํ”„๋ก ํŠธ์˜ ๊ฒฝ์šฐ Next.js 13 ๋ฒ„์ „์— ๊ธฐ๋ฐ˜ ๋œ ํ”„๋กœ์ ํŠธ์ด๋‹ค. SWC๋Š” Next.js 12 ๋ฒ„์ „๋ถ€ํ„ฐ ๊ธฐ๋ณธ ์ปดํŒŒ์ผ๋Ÿฌ๋กœ ๋„์ž…๋˜์—ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ์„ค์ • ์—†์ด ๊ธฐ๋ณธ์ ์œผ๋กœ SWC๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ํŠธ๋žœ์ŠคํŒŒ์ผ๋ง ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ฝ”๋“œ ์••์ถ•(minification)์€ ์˜ต์…˜์„ ๋ณ„๋„๋กœ swcMinify: true๋กœ ํ™œ์„ฑํ™”ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ๋‹ค๋ฅธ SWC ์ง€์› feature๋“ค ์ค‘์—์„œ๋„ ์ฝ”๋“œ ์••์ถ•์˜ ๊ฒฝ์šฐ next.config.js์— ๊ฐ„๋‹จํžˆ ์ ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค.

 

SWC ์ฝ”๋“œ ์••์ถ• ํ™œ์„ฑํ™”์˜ ์ด์ 

  1. ํŒŒ์ผ ํฌ๊ธฐ ๊ฐ์†Œ
    • ์ฝ”๋“œ ์••์ถ•(minification)์€ ๋ถˆํ•„์š”ํ•œ ๊ณต๋ฐฑ, ์ค„๋ฐ”๊ฟˆ, ์ฃผ์„, ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ ๋“ฑ์„ ์ œ๊ฑฐํ•˜์—ฌ ๋ฒˆ๋“ค ํŒŒ์ผ์˜ ํฌ๊ธฐ๋ฅผ ์ค„์ธ๋‹ค.
    • ๋ณ€์ˆ˜๋ฅผ ๋” ์งง์€ ์ด๋ฆ„์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ , ์ฝ”๋“œ์˜ ๋ณต์žก๋„๋ฅผ ์ค„์ด๋Š” ๋ฐฉ์‹์œผ๋กœ ํฌ๊ธฐ๋ฅผ ์ค„์ธ๋‹ค.์ด๋ ‡๊ฒŒ ์••์ถ•๋œ ํŒŒ์ผ์€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋” ๋นจ๋ฆฌ ๋‹ค์šด๋กœ๋“œ ๋  ์ˆ˜ ์žˆ๋‹ค.
    • // Before Minification function add(a, b) { return a + b; } // After Minification function a(b,c){return b+c}
  2. ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์†๋„ ํ–ฅ์ƒ
    • ํŒŒ์ผ ํฌ๊ธฐ ๊ฐ์†Œ๋กœ ์ธํ•ด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ฒˆ๋“ค ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ์‹œ๊ฐ„์ด ์ค„์–ด๋“ ๋‹ค. ์ด๋Š” ํŠนํžˆ ๋„คํŠธ์›Œํฌ ์†๋„๊ฐ€ ๋Š๋ฆฐ ํ™˜๊ฒฝ์—์„œ ์œ ๋ฆฌํ•˜๋ฉฐ, ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. ๋” ๋น ๋ฅธ ๋ธŒ๋ผ์šฐ์ € ํŒŒ์‹ฑ
    • ์••์ถ•๋œ ์ฝ”๋“œ๋Š” ๋” ์ ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํŒŒ์‹ฑํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ์‹œ๊ฐ„์ด ์ค„์–ด๋“ ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ํŽ˜์ด์ง€๊ฐ€ ๋” ๋นจ๋ฆฌ ๋ Œ๋”๋ง๋˜๊ณ  ์‚ฌ์šฉ์ž์—๊ฒŒ ๋น ๋ฅธ ์‘๋‹ต์„ฑ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.
  4. SEO์™€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ๊ฐœ์„ 
    • ๋น ๋ฅธ ๋กœ๋”ฉ ์†๋„๋Š” SEO(๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”)์— ๊ธ์ •์ ์ธ ์˜ํ–ฅ์„ ์ค€๋‹ค. ๊ตฌ๊ธ€ ๊ฐ™์€ ๊ฒ€์ƒ‰ ์—”์ง„์€ ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์†๋„๋ฅผ ์ค‘์š”ํ•œ ์š”์†Œ๋กœ ํ‰๊ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ตœ์ ํ™”๋œ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฒ€์ƒ‰ ์ˆœ์œ„๊ฐ€ ๊ฐœ์„ ๋  ์ˆ˜ ์žˆ๋‹ค.
    • ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ๋Š” ์›น์‚ฌ์ดํŠธ๊ฐ€ ๋” ๋นจ๋ฆฌ ๋กœ๋“œ๋˜๋ฏ€๋กœ, ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX)๋„ ๊ฐœ์„ ๋  ์ˆ˜ ์žˆ๋‹ค. ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง€๋ฉด ์ดํƒˆ๋ฅ ์ด ๋†’์•„์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋น ๋ฅธ ๋กœ๋”ฉ์€ ์‚ฌ์šฉ์ž ์œ ์ง€์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋‹ค.
  5. ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ ์„ฑ๋Šฅ ์ตœ์ ํ™”
    • swcMinify: true๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Next.js๊ฐ€ SWC๋ฅผ ํ†ตํ•ด ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ์—์„œ ์ฝ”๋“œ๋ฅผ ์••์ถ•ํ•˜๊ณ  ์ตœ์ ํ™”ํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฌผ์˜ ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • SWC๋Š” ๊ธฐ์กด์˜ Babel๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋ฏ€๋กœ ๋นŒ๋“œ ์‹œ๊ฐ„๋„ ์ตœ์†Œํ™”ํ•˜๋ฉด์„œ ์ฝ”๋“œ ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
  6. ๋‚ฎ์€ ๋Œ€์—ญํญ๊ณผ ๋น„์šฉ ์ ˆ๊ฐ
    • ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ ์ค„์–ด๋“ค๋ฉด ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ์ „์†ก๋˜๋Š” ๋ฐ์ดํ„ฐ ์–‘๋„ ์ค„์–ด๋“ ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋„คํŠธ์›Œํฌ ๋Œ€์—ญํญ์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŠนํžˆ ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‚˜ ํŠธ๋ž˜ํ”ฝ์ด ๋งŽ์€ ์„œ๋น„์Šค์—์„œ๋Š” ์„œ๋ฒ„ ๋น„์šฉ ์ ˆ๊ฐ์—๋„ ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

SWC ์ฝ”๋“œ ์••์ถ• ์„ค์ • ๋ฐฉ๋ฒ•

//next.config.js
module.exports = {
  swcMinify: true,
}

 

๊ฒฐ๊ณผ

๋นŒ๋“œ ์‹œ๊ฐ„ ์ธก์ • ๋ฐฉ๋ฒ• - ๋กœ์ปฌ์—์„œ ํ…Œ์ŠคํŠธ

# ๋นŒ๋“œ ์‹œ๊ฐ„ ์ธก์ • ๋ช…๋ น์–ด
time yarn run build

 

(์ขŒ) ๋ฐ˜์˜ ์ „ (์šฐ) ๋ฐ˜์˜ ํ›„

 

SWC ์ฝ”๋“œ ์••์ถ• ์˜ต์…˜์„ ํ†ตํ•ด ๋นŒ๋“œ ์‹œ ๋นŒ๋“œ ์‹œ๊ฐ„์ด 20์ดˆ ๊ฐ€๋Ÿ‰ ๋‹จ์ถ• ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฝ”๋“œ ์••์ถ•์œผ๋กœ ์ธํ•ด ๋ฒˆ๋“ค ํฌ๊ธฐ๊ฐ€ ์ค„์–ด ๋” ๋น ๋ฅด๊ฒŒ ๋นŒ๋“œ๊ฐ€ ๋จ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

Reference

https://fe-developers.kakaoent.com/2022/220217-learn-babel-terser-swc/

https://nextjs.org/docs/architecture/nextjs-compiler#minification

https://nextjs-ko.org/docs/architecture/nextjs-compiler

https://swc.rs/

https://han-py.tistory.com/506

 

๋Œ“๊ธ€