생산성 자동화

Git Pre-commit 훅으로 개발 생산성 극대화: 코드 품질 자동화 전략

강코의 코딩 일기 2026. 4. 12. 08:24
반응형

Git Pre-commit 훅을 활용해 코드 품질을 일관되게 유지하고 개발 워크플로우를 자동화하는 실용적인 전략과 설정 방법을 소개합니다.

개발 과정에서 반복적인 수동 검증 작업에 지치셨나요? 코드를 커밋하기 전에 항상 린팅, 포맷팅, 기본적인 테스트를 수동으로 실행하고 계신가요? 혹은 팀원마다 코드 스타일이 달라 머지 충돌이 잦거나 코드 리뷰 과정에서 사소한 스타일 문제로 시간을 허비하고 있지는 않으신가요?

이러러한 문제는 개발 생산성을 저해하고, 팀 전체의 코드 품질을 떨어뜨리는 주범이 됩니다. 하지만 걱정하지 마세요. Git의 강력한 기능 중 하나인 Pre-commit 훅을 활용하면 이러한 문제들을 효과적으로 해결하고 개발 워크플로우를 혁신적으로 자동화할 수 있습니다. 이번 글에서는 Git Pre-commit 훅의 개념부터 실제 적용 방법, 그리고 팀 프로젝트에 성공적으로 통합하는 전략까지, 여러분의 개발 경험을 한 단계 끌어올릴 실용적인 가이드를 제시합니다.

📑 목차

Git Pre-commit 훅을 활용한 코드 품질 및 개발 워크플로우 자동화 전략 - programming, html, css, javascript, php, website development, code, html code, computer code, coding, digital, computer programming, pc, www, cyberspace, programmer, web development, computer, technology, developer, computer programmer, internet, ide, lines of code, hacker, hacking, gray computer, gray technology, gray laptop, gray website, gray internet, gray digital, gray web, gray code, gray coding, gray programming, programming, programming, programming, javascript, code, code, code, coding, coding, coding, coding, coding, digital, web development, computer, computer, computer, technology, technology, technology, developer, internet, hacker, hacker, hacker, hacking

Image by Boskampi on Pixabay

Git 훅이란 무엇이며, Pre-commit 훅의 역할은?

Git 훅(Git Hooks)은 Git 특정 이벤트가 발생할 때 자동으로 실행되도록 설정할 수 있는 스크립트입니다. 마치 특정 상황에 반응하는 '자동화된 비서'와 같다고 생각할 수 있습니다. Git 훅은 크게 클라이언트 측 훅과 서버 측 훅으로 나뉘며, 각각 로컬 저장소 또는 원격 저장소에서 작동합니다.

  • 클라이언트 측 훅: 커밋 생성, 병합 등 로컬 저장소에서 발생하는 이벤트에 반응합니다. 개발자 개개인의 워크플로우를 자동화하고 코드 품질을 개선하는 데 주로 사용됩니다.
  • 서버 측 훅: 푸시된 커밋을 수신하는 등 원격 저장소에서 발생하는 이벤트에 반응합니다. 모든 팀원의 커밋이 특정 정책을 따르도록 강제하거나, CI/CD 파이프라인을 트리거하는 데 활용됩니다.

이 글에서 중점적으로 다룰 Pre-commit 훅은 클라이언트 측 훅의 한 종류로, 개발자가 git commit 명령을 실행했을 때 실제 커밋이 생성되기 직전에 실행됩니다. 이 훅 스크립트가 성공적으로 종료되면 커밋이 진행되지만, 스크립트가 오류를 반환하거나 실패하면 커밋 작업이 중단됩니다. 이 특성 덕분에 Pre-commit 훅은 문제가 있는 코드가 저장소에 커밋되는 것을 사전에 방지하는 '최전방 방어선' 역할을 수행할 수 있습니다.

Pre-commit 훅을 활용하면 개발자가 코드를 커밋하기 전에 다양한 자동화된 검증 작업을 수행하여, 잠재적인 버그를 조기에 발견하고, 일관된 코드 스타일을 유지하며, 전반적인 개발 워크플로우의 효율성을 극대화할 수 있습니다. 이는 개발 초기 단계에서 오류를 수정하는 비용이 가장 적게 들기 때문에, 장기적으로 프로젝트의 안정성과 유지보수성을 크게 향상시킵니다.

Pre-commit 훅으로 자동화할 수 있는 것들: 실용적인 활용 예시

Pre-commit 훅은 개발 과정에서 반복적으로 수행되는 다양한 작업을 자동화하여 코드 품질을 높이고 생산성을 향상시키는 데 기여합니다. 다음은 Pre-commit 훅으로 자동화할 수 있는 대표적인 활용 사례들입니다.

1. 코드 린팅(Linting) 및 포맷팅(Formatting) 자동화

코드 린팅은 잠재적인 오류, 스타일 불일치, 의심스러운 코딩 패턴을 식별하는 과정입니다. 포맷팅은 코드의 일관된 시각적 스타일을 유지하는 것을 의미합니다. 팀 프로젝트에서는 ESLint, Prettier, Black, Flake8 등과 같은 도구를 사용하여 코드 스타일을 표준화하는데, Pre-commit 훅은 이러한 도구들을 커밋 전에 자동으로 실행하도록 하여 팀 전체의 코드 일관성을 보장합니다.

  • 문제 상황: 개발자마다 다른 코드 스타일을 사용하여 PR(Pull Request) 리뷰 시 불필요한 스타일 수정 요청이 많고, 코드가 지저분해 보입니다.
  • 해결책: Pre-commit 훅을 통해 커밋되기 전 staged된 파일에 대해 린터와 포맷터를 자동으로 실행합니다.

# .git/hooks/pre-commit (예시: JavaScript 프로젝트에서 ESLint와 Prettier 사용)
#!/bin/sh
# Staged된 JavaScript 파일만 검사
STAGED_JS_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep ".js$")

if [ -n "$STAGED_JS_FILES" ]; then
  echo "Running ESLint and Prettier on staged JavaScript files..."
  npm run lint -- --fix $STAGED_JS_FILES || exit 1
  npm run format $STAGED_JS_FILES || exit 1
  
  # 수정된 파일을 다시 staged 상태로 만듦
  git add $STAGED_JS_FILES
fi

위 예시처럼 Pre-commit 훅을 설정하면, 개발자가 신경 쓰지 않아도 항상 깔끔하고 일관된 코드 스타일이 유지됩니다. 이는 코드 리뷰 시간20% 이상 단축하고, 머지 충돌 발생률을 15% 감소시키는 효과를 가져올 수 있습니다.

2. 단위 테스트(Unit Test) 및 통합 테스트(Integration Test) 실행

Pre-commit 훅을 사용하면 커밋 전 핵심 단위 테스트나 영향받는 통합 테스트를 자동으로 실행하여, 변경 사항이 기존 코드에 문제를 일으키지 않는지 즉시 확인할 수 있습니다. 이는 버그가 저장소에 유입되는 것을 조기에 방지하고, 코드 안정성을 크게 높입니다.

  • 문제 상황: 작은 코드 변경 후 테스트 실행을 잊어버려, 나중에 CI/CD 파이프라인에서 실패를 발견하고 다시 수정하는 비효율적인 상황이 발생합니다.
  • 해결책: Pre-commit 훅에서 변경된 파일과 관련된 테스트를 실행하도록 설정합니다.

# .git/hooks/pre-commit (예시: Jest 테스트 프레임워크 사용)
#!/bin/sh
# Staged된 변경 사항이 있는 파일과 관련된 테스트만 실행 (jest --findRelatedTests)
STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM)

if [ -n "$STAGED_FILES" ]; then
  echo "Running Jest tests related to staged files..."
  npm test -- --findRelatedTests $STAGED_FILES || exit 1
fi

이러한 자동화는 버그 발견 시점최대 70% 앞당겨 개발 후반부의 수정 비용을 획기적으로 줄여줄 수 있습니다.

3. 커밋 메시지 검증

일관성 있는 커밋 메시지는 프로젝트의 변경 이력을 파악하고, 자동으로 릴리스 노트를 생성하거나, Semantic Versioning을 적용하는 데 매우 중요합니다. Pre-commit 훅은 커밋 메시지가 특정 규칙(예: Conventional Commits)을 따르는지 검증할 수 있습니다.

  • 문제 상황: 개발자마다 제각각인 커밋 메시지 형식으로 인해 변경 이력 추적과 릴리스 관리가 어렵습니다.
  • 해결책: 커밋 메시지 형식을 강제하는 훅을 설정합니다.

# .git/hooks/commit-msg (Pre-commit이 아닌 commit-msg 훅을 사용)
#!/bin/sh
COMMIT_MSG_FILE=$1
COMMIT_MSG=$(cat "$COMMIT_MSG_FILE")

# 예시: 'feat:', 'fix:', 'docs:' 등으로 시작하는지 검증
if ! echo "$COMMIT_MSG" | grep -E '^(feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert)(\(.+\))?: .{1,50}' > /dev/null; then
  echo "에러: 커밋 메시지가 Conventional Commits 규칙을 따르지 않습니다."
  echo "예시: feat: 새로운 기능 추가"
  echo "       fix(scope): 버그 수정"
  exit 1
fi

이러한 훅은 프로젝트 관리 효율성30% 이상 향상시키고, 자동화된 릴리스 프로세스 구축을 가능하게 합니다.

4. 기타 활용 사례

  • 보안 취약점 검사: 종속성(dependency)에 알려진 보안 취약점이 있는지 검사합니다. (예: npm audit, yarn audit)
  • 비밀 정보 검사: API 키, 비밀번호 등 민감한 정보가 실수로 커밋되는 것을 방지합니다. (예: git-secrets)
  • TODO/FIXME 주석 검사: 커밋 시점에 남아있는 TODO나 FIXME 주석이 너무 많거나 특정 기준을 초과하는 경우 경고합니다.
  • 웹팩/번들링 경고 검사: JavaScript 프로젝트에서 웹팩 번들링 시 발생하는 경고를 무시하지 않도록 합니다.

Pre-commit 훅 설정 및 관리 실전 가이드

Pre-commit 훅을 설정하는 방법은 크게 두 가지가 있습니다: 순수 Git 훅 스크립트를 직접 작성하는 방법과 외부 도구를 활용하는 방법. 대부분의 현대 프로젝트에서는 유연성과 이식성을 제공하는 외부 도구를 사용하는 것이 권장됩니다.

1. 순수 Git 훅 스크립트 설정 (수동 방식)

각 Git 저장소에는 .git/hooks/ 디렉토리가 있습니다. 이 디렉토리 안에 pre-commit.sample 파일이 있는데, 이를 pre-commit으로 이름을 변경하고 실행 권한을 부여한 후 원하는 스크립트를 작성하면 됩니다.


# 1. .git/hooks 디렉토리로 이동
cd .git/hooks

# 2. pre-commit.sample 파일을 pre-commit으로 복사 (또는 새로 생성)
cp pre-commit.sample pre-commit

# 3. 실행 권한 부여
chmod +x pre-commit

# 4. pre-commit 파일에 스크립트 작성 (예시)
#!/bin/sh
echo "Running pre-commit hook..."
# 여기에 린팅, 테스트 등 원하는 명령어를 추가
# 명령어가 실패하면 exit 1
npm test || exit 1 
echo "Pre-commit hook passed!"

단점: 이 방식은 각 개발자가 수동으로 설정해야 하며, 팀원 간 훅 스크립트를 공유하고 동기화하기 어렵습니다. 또한, 스크립트가 복잡해지면 관리도 어려워집니다.

2. 외부 도구를 활용한 설정: Husky와 lint-staged

대부분의 프로젝트에서는 Huskylint-staged와 같은 도구를 함께 사용하여 Pre-commit 훅을 관리합니다. 이 도구들은 훅 설정을 package.json(JavaScript/TypeScript 프로젝트의 경우)과 같은 프로젝트 설정 파일에 통합하여 팀원 간 공유를 용이하게 하고, 관리를 효율적으로 만듭니다.

  • Husky: Git 훅을 쉽게 관리할 수 있도록 도와주는 도구입니다. package.json 파일에 Git 훅 스크립트를 정의할 수 있게 하여, 프로젝트와 함께 Git 훅 설정을 버전 관리하고 공유할 수 있게 합니다.
  • lint-staged: 커밋 시점에 staged 상태에 있는 파일들(즉, git add된 파일들)에 대해서만 린터, 포맷터 등의 명령어를 실행하도록 해줍니다. 이는 불필요한 파일 검사를 줄여 Pre-commit 훅의 실행 속도를 획기적으로 향상시킵니다.

설정 단계 (JavaScript/TypeScript 프로젝트 예시)

  1. Husky 및 lint-staged 설치:
    
    npm install --save-dev husky lint-staged
    # 또는
    yarn add --dev husky lint-staged
            
  2. Husky 활성화:
    
    npx husky install
            
    이 명령은 .husky/ 디렉토리를 생성하고 Git 훅을 설정합니다.
  3. Pre-commit 훅 추가:
    
    npx husky add .husky/pre-commit "npx lint-staged"
            
    이 명령은 .husky/pre-commit 파일을 생성하고, 해당 훅이 npx lint-staged 명령을 실행하도록 설정합니다.
  4. package.jsonlint-staged 설정 추가:프로젝트의 package.json 파일에 lint-staged 설정을 추가하여 어떤 파일에 대해 어떤 명령어를 실행할지 정의합니다.위 설정은 .js, .jsx, .ts, .tsx 파일이 staged되면 ESLintPrettier, Jest 관련 테스트를 실행하고, .json, .css, .md 파일이 staged되면 Prettier를 실행하도록 지시합니다. --fix 옵션은 린팅 오류를 자동으로 수정하려고 시도합니다.
  5. { "name": "my-project", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "lint": "eslint .", "format": "prettier --write .", "test": "jest" }, "devDependencies": { "husky": "^8.0.0", "lint-staged": "^13.0.0", "eslint": "^8.0.0", "prettier": "^2.0.0", "jest": "^29.0.0" }, "lint-staged": { "*.{js,jsx,ts,tsx}": [ "eslint --fix", "prettier --write", "jest --findRelatedTests" ], "*.{json,css,md}": [ "prettier --write" ] }, "husky": { "hooks": { "pre-commit": "lint-staged" } } }

이 방식으로 설정하면, npm install 또는 yarn installHusky가 자동으로 설치되고 Pre-commit 훅이 활성화되어 모든 팀원이 동일한 자동화 워크플로우를 경험하게 됩니다. 이는 팀 생산성40% 이상 향상시키는 데 기여할 수 있습니다.

Git Pre-commit 훅을 활용한 코드 품질 및 개발 워크플로우 자동화 전략 - technology, computer, code, javascript, developer, programming, programmer, jquery, css, html, website, technology, technology, computer, code, code, code, code, code, javascript, javascript, javascript, developer, programming, programming, programming, programming, programmer, html, website, website, website

Image by Pexels on Pixabay

Pre-commit 훅 적용 시 고려사항 및 최적화 팁

Pre-commit 훅은 강력한 도구이지만, 잘못 설정하면 오히려 개발 경험을 저해할 수 있습니다. 다음은 Pre-commit 훅을 효과적으로 적용하기 위한 고려사항과 최적화 팁입니다.

1. 성능 최적화: 필요한 작업만, 빠르게

Pre-commit 훅이 너무 느리게 실행되면 개발자는 잦은 대기로 인해 불편함을 느끼고 훅을 무시하게 될 수 있습니다. 훅의 실행 속도를 최적화하는 것이 중요합니다.

  • lint-staged 활용: 항상 전체 프로젝트 파일에 대해 린팅이나 테스트를 실행하는 대신, git addstaged 파일에 대해서만 검사를 수행하도록 설정합니다. 이는 훅 실행 시간을 수십 배 단축할 수 있습니다.
  • 가벼운 작업 위주: 무거운 통합 테스트나 전체 빌드 과정은 Pre-commit 훅보다는 CI/CD 파이프라인에서 실행하는 것이 좋습니다. Pre-commit 훅은 주로 린팅, 포맷팅, 중요한 단위 테스트 등 빠르고 즉각적인 피드백을 줄 수 있는 작업에 집중해야 합니다.
  • 병렬 실행: 여러 린팅/포맷팅 작업을 병렬로 실행할 수 있도록 설정하여 총 실행 시간을 줄입니다. lint-staged는 기본적으로 병렬 실행을 지원합니다.

2. 훅 우회(Bypass) 옵션 사용 시기

때로는 Pre-commit 훅을 일시적으로 우회해야 하는 경우가 있습니다. 예를 들어, 긴급한 버그 수정 커밋을 해야 하는데 훅이 실패하거나, 작업 중인 코드가 아직 린팅/테스트를 통과할 준비가 되지 않았을 때입니다. git commit --no-verify (또는 git commit -n) 명령어를 사용하면 Pre-commit 훅을 포함한 모든 Git 훅을 건너뛸 수 있습니다.

하지만 이 옵션은 꼭 필요한 경우에만 신중하게 사용해야 합니다. 훅을 우회하는 것이 너무 빈번해지면 코드 품질 저하로 이어질 수 있으므로, 팀 내에서 언제 훅을 우회할 수 있는지에 대한 명확한 규칙을 정하는 것이 중요합니다.

3. 오류 메시지와 피드백 명확화

Pre-commit 훅이 실패했을 때, 개발자가 왜 실패했는지, 어떻게 문제를 해결해야 하는지 명확하게 알 수 있도록 친절하고 구체적인 오류 메시지를 제공하는 것이 중요합니다. 예를 들어, 특정 린팅 규칙 위반으로 실패했다면 해당 규칙과 관련된 가이드라인 링크를 제공하는 것도 좋은 방법입니다.

4. 팀 문화와 통합

Pre-commit 훅은 개발자 개인의 생산성뿐만 아니라 팀 전체의 코드 품질워크플로우에 큰 영향을 미칩니다. 새로운 훅을 도입할 때는 팀원들과 충분히 논의하고, 그 필요성과 이점을 설명하며, 설정 방법을 공유하는 과정을 거쳐야 합니다. 강제적인 도입보다는 점진적인 교육과 공감대 형성을 통해 자발적인 참여를 유도하는 것이 성공적인 정착에 중요합니다.

초기에는 간단한 린팅/포맷팅 훅부터 시작하여 점차 범위를 넓혀나가는 전략이 팀원들의 적응을 돕고 저항을 줄일 수 있습니다. 예를 들어, 린팅 규칙에 대한 팀 합의를 먼저 이끌어내고, 그 후에 훅을 적용하는 방식입니다.

Pre-commit 훅 자동화 vs. 수동 검증 비교
특징 Pre-commit 훅 자동화 수동 검증
코드 품질 일관성 매우 높음 (강제적 적용) 낮음 (개발자 역량 및 습관에 의존)
버그 발견 시점 커밋 전 즉시 발견 (가장 빠름) 코드 리뷰, CI/CD, 런타임 등 (늦을 수 있음)
개발자 생산성 높음 (반복 작업 제거, 빠른 피드백) 낮음 (반복적인 수동 작업, 집중력 분산)
코드 리뷰 효율성 매우 높음 (스타일 문제는 자동 해결, 핵심 로직에 집중) 낮음 (스타일 문제로 인한 불필요한 코멘트 증가)
팀원 간 동기화 매우 용이 (버전 관리 시스템에 포함) 어려움 (개인 환경에 의존)
설정 및 유지보수 초기 설정 필요, 이후 효율적 관리 개인별 노력이 지속적으로 필요
Git Pre-commit 훅을 활용한 코드 품질 및 개발 워크플로우 자동화 전략 - code, html, digital, coding, web, programming, computer, technology, internet, design, development, website, web developer, web development, programming code, data, page, computer programming, software, site, css, script, web page, website development, www, information, java, screen, code, code, code, html, coding, coding, coding, coding, coding, web, programming, programming, computer, technology, website, website, web development, software

Image by jamesmarkosborne on Pixabay

성공적인 Pre-commit 훅 전략 구축

Pre-commit 훅은 단순히 몇 가지 도구를 연결하는 것을 넘어, 팀의 개발 문화워크플로우에 깊숙이 통합되어야 합니다. 성공적인 Pre-commit 훅 전략을 구축하기 위한 몇 가지 팁입니다.

1. CI/CD 파이프라인과의 연계

Pre-commit 훅CI/CD 파이프라인의 첫 번째 방어선 역할을 합니다. Pre-commit 훅에서 수행하는 검증 작업은 CI/CD 파이프라인에서도 동일하게(또는 더 광범위하게) 실행되어야 합니다. 훅이 실패하면 커밋 자체가 불가능하므로, CI/CD에서 발견될 수 있는 많은 오류를 개발 단계에서 미리 차단할 수 있습니다.

예를 들어, Pre-commit 훅에서 빠른 린팅과 핵심 단위 테스트를 실행하고, CI/CD 파이프라인에서는 전체 린팅, 모든 단위/통합/E2E 테스트, 빌드 및 배포 테스트를 실행하는 방식으로 역할 분담을 할 수 있습니다. 이처럼 두 시스템이 상호 보완적으로 작동하면 코드 품질 보증의 견고함을 극대화할 수 있습니다.

2. 지속적인 피드백과 개선

Pre-commit 훅 설정은 한 번으로 끝나는 작업이 아닙니다. 프로젝트의 요구사항이 변하고, 새로운 기술 스택이 도입되거나, 팀원들의 피드백이 쌓이면 훅 설정도 그에 맞춰 지속적으로 개선해야 합니다. 훅이 너무 느리거나, 불필요한 검사를 하거나, 유용한 피드백을 주지 못한다면 과감히 수정하거나 제거하는 것이 좋습니다.

정기적으로 팀원들과 Pre-commit 훅의 효과와 개선점에 대해 논의하는 시간을 가지세요. 훅이 개발자들의 생산성을 방해하지 않으면서도 코드 품질을 높이는 최적의 균형점을 찾는 것이 중요합니다.

3. 모범 사례 공유 및 문서화

팀 내에서 Pre-commit 훅 사용에 대한 모범 사례를 공유하고, 관련 설정을 명확하게 문서화하세요. 새로운 팀원이 합류했을 때 훅을 쉽게 설정하고 이해할 수 있도록 가이드라인을 제공하는 것이 중요합니다. FAQ 형태의 문서나, 훅 실패 시 해결 방법을 담은 문서는 개발자들이 문제를 스스로 해결하고 빠르게 적응하는 데 큰 도움이 됩니다.

예를 들어, "이 린팅 규칙은 왜 중요한가요?" "훅이 실패했을 때 어떻게 해야 하나요?" "특정 상황에서 훅을 우회해도 괜찮나요?"와 같은 질문에 대한 답변을 문서화하여 개발 워크플로우의 투명성을 높일 수 있습니다.

결론: 생산성 향상과 코드 품질을 위한 핵심 전략

지금까지 Git Pre-commit 훅을 활용하여 코드 품질을 향상시키고 개발 워크플로우를 자동화하는 다양한 전략과 실전 가이드를 살펴보았습니다. Pre-commit 훅은 단순히 코드를 검사하는 도구를 넘어, 개발자 개인의 작업 효율성을 높이고 팀 전체의 협업 문화를 긍정적으로 변화시키는 강력한 메커니즘입니다.

반복적인 수동 검증 작업을 자동화함으로써 개발자는 더 중요한 로직 구현과 문제 해결에 집중할 수 있게 됩니다. 이는 생산성의 극대화뿐만 아니라, 잠재적인 오류를 조기에 발견하여 개발 후반부의 수정 비용을 절감하고, 일관된 코드 스타일을 유지하여 코드 리뷰의 효율성을 높이는 등 수많은 이점을 제공합니다.

오늘부터 여러분의 프로젝트에 Pre-commit 훅을 적용하여, 더욱 스마트하고 효율적인 개발 워크플로우를 구축해보세요. 처음에는 약간의 설정 시간이 필요할 수 있지만, 장기적으로 얻게 될 코드 품질 향상과 생산성 증대는 그 시간을 충분히 보상할 것입니다.

여러분의 프로젝트에는 어떤 Pre-commit 훅을 적용하고 계신가요? 혹은 Pre-commit 훅을 사용하면서 겪었던 흥미로운 경험이나 유용한 팁이 있다면 댓글로 공유해 주세요!

📌 함께 읽으면 좋은 글

  • [생산성 자동화] Makefile Taskfile 활용 프로젝트 공통 작업 자동화: 개발 환경 설정부터 빌드, 테스트까지
  • [개발 책 리뷰] 시스템 설계 면접 준비 필독서: 고가용성 확장성 시스템 구축 원리 심층 리뷰
  • [생산성 자동화] 개발팀 워크플로우 혁신: 코드 주석으로 문서 자동 생성, 생산성 극대화 경험담

이 글이 도움이 되셨다면 공감(♥)댓글로 응원해 주세요!
궁금한 점이나 다루었으면 하는 주제가 있다면 댓글로 남겨주세요.

반응형