Skip to content

Husky โ€‹

๐Ÿงฉ Reference

  • Husky: Git hooks๋ฅผ ์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋„๊ตฌ
  • Git hooks: Git ์ด๋ฒคํŠธ(์ปค๋ฐ‹, ํ‘ธ์‹œ ๋“ฑ) ๋ฐœ์ƒ ์‹œ ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ
  • pre-commit: ์ปค๋ฐ‹ ์ „์— ์‹คํ–‰๋˜๋Š” Git hook

์™œ Husky๊ฐ€ ํ•„์š”ํ• ๊นŒ? โ€‹

ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋‹ค ๋ณด๋ฉด ์ด๋Ÿฐ ์ƒํ™ฉ์ด ์ƒ๊ธด๋‹ค:

  • ์ปค๋ฐ‹ ํ›„์— ESLint ์—๋Ÿฌ๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ณ  ๋‹ค์‹œ ์ปค๋ฐ‹
  • ํฌ๋งท์ด ๋งž์ง€ ์•Š๋Š” ์ฝ”๋“œ๊ฐ€ ์˜ฌ๋ผ์™€์„œ ๋ฆฌ๋ทฐ ์‹œ๊ฐ„ ๋‚ญ๋น„
  • ํƒ€์ž… ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ์ฝ”๋“œ๊ฐ€ ๋จธ์ง€๋˜์–ด ๋นŒ๋“œ ์‹คํŒจ

์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ์ปค๋ฐ‹ ์ „์— ์ž๋™์œผ๋กœ ๊ฒ€์‚ฌํ•˜๋ฉด ๋ถˆํ•„์š”ํ•œ ์ปค๋ฐ‹๊ณผ ๋ฆฌ๋ทฐ ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.
Husky๋Š” Git hooks๋ฅผ ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋„๊ตฌ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํŒ€ ์ „์ฒด๊ฐ€ ๋™์ผํ•œ ์ปค๋ฐ‹ ๊ทœ์น™์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.


๐Ÿงฉ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•˜๋ฉด์„œ ๊นจ๋‹ฌ์€ ์ 

  • Git hooks๋ฅผ ์ง์ ‘ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค Husky๋ฅผ ์“ฐ๋Š” ๊ฒŒ ํ›จ์”ฌ ํŽธํ•˜๋‹ค.
  • ์ปค๋ฐ‹ ์ „ ์ž๋™ ๊ฒ€์‚ฌ๋กœ ์ปค๋ฐ‹ ํ›„ ์ˆ˜์ • โ†’ ๋‹ค์‹œ ์ปค๋ฐ‹ ์‚ฌ์ดํด์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.
  • ํŒ€์› ๊ฐ„ ์ฝ”๋“œ ํ’ˆ์งˆ ๊ธฐ์ค€์„ ์ž๋™์œผ๋กœ ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ๋‹ค.

Git hooks๋ž€? โ€‹

Git hooks๋Š” Git ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋‹ค.

์ฃผ์š” Git hooks:

  • pre-commit: ์ปค๋ฐ‹ ์ „์— ์‹คํ–‰
  • commit-msg: ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์ž‘์„ฑ ํ›„ ์‹คํ–‰
  • pre-push: ํ‘ธ์‹œ ์ „์— ์‹คํ–‰

์ด ํ”„๋กœ์ ํŠธ์—์„œ๋Š” pre-commit hook์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปค๋ฐ‹ ์ „์— ESLint, Prettier, Type Check๋ฅผ ์ž๋™์œผ๋กœ ์‹คํ–‰ํ•œ๋‹ค.


Husky vs ์ง์ ‘ Git hooks ๊ด€๋ฆฌ โ€‹

์ง์ ‘ Git hooks ๊ด€๋ฆฌ์˜ ๋ฌธ์ œ์  โ€‹

Git hooks๋Š” .git/hooks/ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

bash
# .git/hooks/pre-commit (Git์— ํฌํ•จ๋˜์ง€ ์•Š์Œ)
#!/bin/sh
npm run lint
npm run type-check

๋ฌธ์ œ์ :

  • .git ํด๋”๋Š” Git์— ํฌํ•จ๋˜์ง€ ์•Š์•„ ํŒ€์›๊ณผ ๊ณต์œ  ๋ถˆ๊ฐ€
  • ๊ฐ ํŒ€์›์ด ์ˆ˜๋™์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ•จ
  • ์Šคํฌ๋ฆฝํŠธ ์ˆ˜์ • ์‹œ ๋ชจ๋“  ํŒ€์›์—๊ฒŒ ๊ณต์ง€ ํ•„์š”

Husky์˜ ์žฅ์  โ€‹

Husky๋Š” Git hooks ์„ค์ •์„ ํ”„๋กœ์ ํŠธ ํŒŒ์ผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

  • .husky/ ํด๋”๊ฐ€ Git์— ํฌํ•จ๋˜์–ด ํŒ€์›๊ณผ ์ž๋™ ๊ณต์œ 
  • npm install ์‹œ ์ž๋™์œผ๋กœ Git hooks ์„ค์ •
  • ์ˆ˜์ • ์‚ฌํ•ญ์ด ์ž๋™์œผ๋กœ ๋ชจ๋“  ํŒ€์›์—๊ฒŒ ์ ์šฉ

์„ค์น˜ ๋ฐ ์„ค์ • โ€‹

1. Husky ์„ค์น˜ โ€‹

bash
npm install -D husky

2. Husky ์ดˆ๊ธฐํ™” โ€‹

bash
npx husky init

์‹คํ–‰ ์‹œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ณ€ํ™”๊ฐ€ ์ƒ๊ธด๋‹ค:

  • .husky/ ํด๋” ์ƒ์„ฑ
  • package.json์— prepare ์Šคํฌ๋ฆฝํŠธ ์ถ”๊ฐ€
  • .husky/pre-commit ํŒŒ์ผ ์ƒ์„ฑ (๊ธฐ๋ณธ ์˜ˆ์‹œ)
json
// package.json
{
  "scripts": {
    "prepare": "husky"
  }
}

prepare ์Šคํฌ๋ฆฝํŠธ๋ž€?

prepare๋Š” npm์—์„œ ์ •์˜ํ•œ ํŠน์ˆ˜ ์Šคํฌ๋ฆฝํŠธ๋กœ, npm install ์‹คํ–‰ ์‹œ ์ž๋™์œผ๋กœ ์‹คํ–‰๋œ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ํŒ€์›์ด ํ”„๋กœ์ ํŠธ๋ฅผ ํด๋ก ํ•˜๊ณ  npm install์„ ์‹คํ–‰ํ•˜๋ฉด Husky๊ฐ€ ์ž๋™์œผ๋กœ Git hooks๋ฅผ ์„ค์ •ํ•˜๊ฒŒ ๋œ๋‹ค.


3. pre-commit hook ์„ค์ • โ€‹

.husky/pre-commit ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜์—ฌ ์ปค๋ฐ‹ ์ „์— ์‹คํ–‰ํ•  ๋ช…๋ น์–ด๋ฅผ ์„ค์ •ํ•œ๋‹ค.

bash
# .husky/pre-commit
npx lint-staged

์ด์ œ git commit ์‹คํ–‰ ์‹œ ์ž๋™์œผ๋กœ lint-staged๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

lint-staged์™€์˜ ๊ด€๊ณ„

Husky๋Š” ์–ธ์ œ ์‹คํ–‰ํ• ์ง€(์ปค๋ฐ‹ ์ „)๋ฅผ ๋‹ด๋‹นํ•˜๊ณ ,
lint-staged๋Š” ๋ฌด์—‡์„ ์‹คํ–‰ํ• ์ง€(ESLint, Prettier, Type Check)๋ฅผ ๋‹ด๋‹นํ•œ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ lint-staged ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ .


์‹คํ–‰ ํ๋ฆ„ โ€‹

๊ฐœ๋ฐœ์ž๊ฐ€ git commit ์‹คํ–‰
     โ†“
Husky์˜ pre-commit hook ์‹คํ–‰
     โ†“
lint-staged ์‹คํ–‰
     โ†“
๋ณ€๊ฒฝ๋œ ํŒŒ์ผ์— ๋Œ€ํ•ด ESLint, Prettier, Type Check ์‹คํ–‰
     โ†“
๋ชจ๋‘ ํ†ต๊ณผํ•˜๋ฉด ์ปค๋ฐ‹ ์™„๋ฃŒ
์‹คํŒจํ•˜๋ฉด ์ปค๋ฐ‹ ์ค‘๋‹จ

Husky ์šฐํšŒํ•˜๊ธฐ (๊ธด๊ธ‰ ์ƒํ™ฉ) โ€‹

ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ Husky๋ฅผ ์ผ์‹œ์ ์œผ๋กœ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ๋‹ค.

bash
git commit --no-verify -m "urgent fix"

๐Ÿšจ ์ฃผ์˜

--no-verify๋Š” ๊ธด๊ธ‰ํ•œ ์ƒํ™ฉ์—์„œ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
๋‚จ๋ฐœํ•˜๋ฉด Husky๋ฅผ ์„ค์ •ํ•œ ์˜๋ฏธ๊ฐ€ ์—†์–ด์ง„๋‹ค!




๐Ÿ’ก ์ •๋ฆฌ

  • Husky๋Š” Git hooks๋ฅผ ์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋„๊ตฌ๋‹ค.
  • .husky/ ํด๋”๋ฅผ ํ†ตํ•ด Git hooks ์„ค์ •์„ ํŒ€์›๊ณผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • prepare ์Šคํฌ๋ฆฝํŠธ๋กœ npm install ์‹œ ์ž๋™์œผ๋กœ Git hooks๋ฅผ ์„ค์ •ํ•œ๋‹ค.
  • ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ์—์„œ๋Š”:
    • pre-commit โ†’ lint-staged ์‹คํ–‰
    • lint-staged โ†’ ESLint + Prettier ์‹คํ–‰
      ๊ตฌ์กฐ๋กœ ์ปค๋ฐ‹ ํ’ˆ์งˆ์„ ์ž๋™ ๊ด€๋ฆฌํ–ˆ๋‹ค.