Dev Tool/Git & Github

Husky๋กœ Java ์ž๋™ ํฌ๋งทํŒ… ์„ค์ •ํ•˜๊ธฐ (google-java-format)

UNarD 2026. 3. 9. 14:45

๐Ÿพ macOS + Husky๋กœ Java ์ž๋™ ํฌ๋งทํŒ… ์„ค์ •ํ•˜๊ธฐ (google-java-format)

์ปค๋ฐ‹ํ•  ๋•Œ๋งˆ๋‹ค ์ฝ”๋“œ ์Šคํƒ€์ผ ๋งž์ถ”๋Š” ๊ฒŒ ์€๊ทผํžˆ ๋ฒˆ๊ฑฐ๋กญ๋”๋ผ๊ตฌ์š” ใ… ใ… 
๊ทธ๋ž˜์„œ Husky์™€ google-java-format์„ ์—ฐ๋™ํ•ด์„œ ์ปค๋ฐ‹ ์ „์— ์ž๋™์œผ๋กœ ํฌ๋งทํŒ…๋˜๊ฒŒ ์„ธํŒ…ํ•ด๋ดค์Šต๋‹ˆ๋‹ค ๐Ÿ˜€

โ„น๏ธ ์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

google-java-format์€ Java ๊ธฐ๋ฐ˜ ๋„๊ตฌ๋ผ JDK ์—†์œผ๋ฉด ์‹คํ–‰ ์ž์ฒด๊ฐ€ ์•ˆ ๋ฉ๋‹ˆ๋‹ค.
์‹œ์ž‘ ์ „์— JDK๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ๋Š”์ง€ ๋จผ์ € ํ™•์ธํ•ด ์ฃผ์„ธ์š”!


๐Ÿ›  ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐํ™”

ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์—์„œ ์•„๋ž˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
npm init -y

์‹คํ–‰ํ•˜๋ฉด package.json์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

Husky๋Š” npm ํŒจํ‚ค์ง€๋กœ ๊ด€๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— package.json์ด ์—†์œผ๋ฉด ์„ค์น˜๊ฐ€ ์•ˆ ๋ฉ๋‹ˆ๋‹ค.


๐Ÿถ Husky ์„ค์น˜

1๏ธโƒฃ Git Hook์„ ์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•ด ์ฃผ๋Š” Husky๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
npm install --save-dev husky
2๏ธโƒฃ ์„ค์น˜๊ฐ€ ๋๋‚ฌ๋‹ค๋ฉด Husky๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
npx husky init
3๏ธโƒฃ ์‹คํ–‰ํ•˜๋ฉด .husky ํด๋”์™€ ๊ธฐ๋ณธ Hook ํŒŒ์ผ์ด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
.husky/
 โ””โ”€โ”€ pre-commit
4๏ธโƒฃ package.json์—๋„ ์•„๋ž˜ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.
"scripts": {
  "prepare": "husky"
}

prepare ์Šคํฌ๋ฆฝํŠธ ๋•๋ถ„์— ํŒ€์›์ด npm install๋งŒ ํ•ด๋„ Husky๊ฐ€ ์ž๋™์œผ๋กœ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.
ํŒ€ ํ”„๋กœ์ ํŠธ์—์„œ ์“ฐ๋ฉด ๋”ฐ๋กœ ์„ธํŒ… ์•ˆ ํ•ด๋„ ๋ผ์„œ ์ง„์งœ ํŽธํ•ด์š” ๐Ÿ‘


โ„น๏ธ Hook์ด๋ž€?
Hook์€ ํ”„๋กœ๊ทธ๋žจ์ด ์–ด๋–ค ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๋Š” ํŠน์ • ์ˆœ๊ฐ„์— ๋ผ์–ด๋“ค์–ด ์ถ”๊ฐ€ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋Š” ์žฅ์น˜์ž…๋‹ˆ๋‹ค.
Git์—์„œ๋Š” commit์ด๋‚˜ push ๊ฐ™์€ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ "์ž ๊น! ์ด ์ž‘์—… ํ•˜๊ธฐ ์ „์— ์ด๊ฒƒ๋„ ๊ฐ™์ด ์‹คํ–‰ํ•˜์ž" ๋ผ๊ณ  ์ž‘์—…์„ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ… Husky ์„ค์น˜ ํ™•์ธ

์•„๋ž˜ ๋ช…๋ น์œผ๋กœ ์„ค์น˜๊ฐ€ ์ œ๋Œ€๋กœ ๋๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
npm list husky
๐Ÿ“ฅ ์ถœ๋ ฅ ์˜ˆ์‹œ
husky@9.x.x

๋ฒ„์ „์ด ํ‘œ์‹œ๋˜๋ฉด ์ •์ƒ์ ์œผ๋กœ ์„ค์น˜๋œ ๊ฒ๋‹ˆ๋‹ค


โฉ google-java-format ์‚ฌ์šฉ ์ค€๋น„

google-java-format์€ Google Java Style Guide ๊ธฐ์ค€์œผ๋กœ Java ์ฝ”๋“œ๋ฅผ ์ž๋™ ์ •๋ฆฌํ•ด ์ฃผ๋Š” ํฌ๋งทํ„ฐ์ž…๋‹ˆ๋‹ค.

์›๋ž˜๋Š” JAR ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜๋Š” CLI ๋„๊ตฌ์ธ๋ฐ,
Husky ๊ฐ™์€ Node ๊ธฐ๋ฐ˜ ๋„๊ตฌ์™€ ์—ฐ๋™ํ•˜๊ธฐ ํŽธํ•˜๋„๋ก npm ํŒจํ‚ค์ง€๋„ ๋”ฐ๋กœ ์ œ๊ณตํ•˜๊ณ  ์žˆ์–ด์š”.

์ด ๊ธ€์—์„œ๋Š” npm ํŒจํ‚ค์ง€ ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

goole-java-format์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค
npm install --save-dev google-java-format
โ„น๏ธ ์ฝ”๋“œ ์Šคํƒ€์ผ์„ ์ง์ ‘ ์„ค์ •ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด?
google-java-format์€ ์„ค์ • ํŒŒ์ผ ์—†์ด Google Java Style์„ ๊ทธ๋Œ€๋กœ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
๋“ค์—ฌ์“ฐ๊ธฐ๋‚˜ ์ค„ ๊ธธ์ด ๊ฐ™์€ ์„ธ๋ถ€ ์Šคํƒ€์ผ์€ ์ง์ ‘ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์Šคํƒ€์ผ์„ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด clang-format์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์Šต๋‹ˆ๋‹ค. .clang-format ์„ค์ • ํŒŒ์ผ๋กœ ๋‹ค์–‘ํ•œ ์˜ต์…˜์„ ์ง์ ‘ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”.

๐Ÿ”— clang-format ์‚ฌ์šฉ๋ฒ• ๋ณด๊ธฐ


๐Ÿช„ Husky Pre-Commit Hook ์„ค์ •

์ด์ œ ์ปค๋ฐ‹ ์ „์— Java ํŒŒ์ผ์„ ์ž๋™์œผ๋กœ ํฌ๋งทํŒ…ํ•˜๋Š” Hook์„ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค โœจ

1๏ธโƒฃ .husky ํด๋” ์ƒ์„ฑ

mkdir -p .husky

Husky ์ดˆ๊ธฐํ™” ๋•Œ ์ด๋ฏธ ์ƒ์„ฑ๋์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
-p ์˜ต์…˜์„ ์“ฐ๋ฉด ํด๋”๊ฐ€ ์ด๋ฏธ ์žˆ์–ด๋„ ์˜ค๋ฅ˜ ์—†์ด ๋„˜์–ด๊ฐ€๋‹ˆ๊นŒ ๊ทธ๋ƒฅ ์‹คํ–‰ํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ pre-commit ํŒŒ์ผ ์ƒ์„ฑ

touch .husky/pre-commit
ํŒŒ์ผ์„ ์—ด๊ณ  ์•„๋ž˜ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
#!/bin/bash
echo "๐Ÿงน Running google-java-format..."

git diff --cached --name-only --diff-filter=ACM | grep '\.java$' | while IFS= read -r file; do
  echo "Formatting $file"
  ./node_modules/.bin/google-java-format --replace "$file"
  git add "$file"
done
์ €์žฅ ํ›„ ์‹คํ–‰ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.
chmod +x .husky/pre-commit

๐ŸŽฏ ์œ„ ๊ณผ์ • ํ•œ๋ฒˆ์— ์‹คํ–‰ํ•˜๊ธฐ

๋งค๋ฒˆ ํ•˜๋‚˜์”ฉ ์น˜๊ธฐ ๊ท€์ฐฎ๋‹ค๋ฉด ์•„๋ž˜ ๋ช…๋ น์œผ๋กœ ํ•œ ๋ฒˆ์— ๋๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

mkdir -p .husky

cat > .husky/pre-commit <<'EOF'
#!/bin/bash
echo "๐Ÿงน Running google-java-format..."

git diff --cached --name-only --diff-filter=ACM | grep '\.java$' | while IFS= read -r file; do
  echo "Formatting $file"
  ./node_modules/.bin/google-java-format --replace "$file"
  git add "$file"
done
EOF

chmod +x .husky/pre-commit

๐Ÿš€ ๋™์ž‘ ํ…Œ์ŠคํŠธ

์ด์ œ ์‹ค์ œ๋กœ ์ปค๋ฐ‹ํ•ด์„œ ์ž˜ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

git add .
git commit -m "test(husky): verify java formatting hook"
๐Ÿ“ฅ ์ •์ƒ ๋™์ž‘ ์˜ˆ์‹œ
๐Ÿงน Running google-java-format...
Formatting src/main/java/Test.java

Java ํŒŒ์ผ์ด ์ž๋™์œผ๋กœ ํฌ๋งทํŒ…๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๐ŸŽ‰


๐Ÿงพ .gitignore

node_modules/

๐Ÿ“‚ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ์˜ˆ์‹œ

java-project/
โ”œโ”€โ”€ .husky/
โ”‚   โ””โ”€โ”€ pre-commit
โ”œโ”€โ”€ src/
โ”‚   โ””โ”€โ”€ main/java/
โ”œโ”€โ”€ .gitignore
โ”œโ”€โ”€ package.json
โ””โ”€โ”€ README.md

๐ŸŽ‰ ๋งˆ๋ฌด๋ฆฌ

์ฒ˜์Œ ์„ธํŒ…ํ•  ๋•Œ๋Š” ์กฐ๊ธˆ ๋ฒˆ๊ฑฐ๋กญ๊ฒŒ ๋А๊ปด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ํ•œ ๋ฒˆ๋งŒ ํ•ด๋‘๋ฉด ์ปค๋ฐ‹ํ•  ๋•Œ๋งˆ๋‹ค ์ฝ”๋“œ ์Šคํƒ€์ผ์ด ์ž๋™์œผ๋กœ ์ •๋ฆฌ๋˜๋‹ˆ๊นŒ ๊ทธ ์ดํ›„๋กœ๋Š” ์‹ ๊ฒฝ ์•ˆ ์จ๋„ ๋ฉ๋‹ˆ๋‹ค.
์ฝ”๋“œ ๋ฆฌ๋ทฐํ•  ๋•Œ ์Šคํƒ€์ผ ์–˜๊ธฐ ์•ˆ ๋‚˜์˜ค๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ์ถฉ๋ถ„ํžˆ ๊ฐ’์–ด์น˜ ์žˆ์–ด์š” ๐Ÿ˜„