polnetuploadset — 폴넷 업로드 패키지 자동 생성
WAR 빌드 → 운영자 요청서 복사 → README 생성 → 전체 소스 복사를 한 번에 수행합니다. USB에 복사하여 운영자에게 전달할 수 있는 완성된 배포 패키지를 생성합니다.
환경 주의사항
- Claude Code는 Git Bash로 명령을 실행합니다.
- 한글 경로가 포함된 파일 복사는
powershell -Command "Copy-Item"사용. cmd /c출력 캡처 불가 → PowerShell 선호..env,.env.local파일은 절대 포함 금지.
Step 0: 프로젝트 정보 자동 탐지
아래 파일들을 읽어서 정보를 수집합니다:
0-1. settings.gradle → 프로젝트명
rootProject.name = 'car-reservation' → PROJECT_NAME = car-reservation
0-2. build.gradle → 버전, WAR 파일명
version = '1.0.0' → VERSION = 1.0.0
war { archiveFileName = 'X.war' } → WAR_FILENAME = X.war
war { archiveFileName }블록이 없으면:WAR_FILENAME = {PROJECT_NAME}.war- 표시 버전(DISPLAY_VERSION): 패치 제거 →
1.0.0→1.0
0-3. 날짜 + 폴더명
DATE = $(date +%y%m%d) → 예: 260315
UPLOAD_DIR = {PROJECT_ROOT}/polnet/polnet upload/{DATE} {PROJECT_NAME} {DISPLAY_VERSION}
0-4. 파일 존재 확인
docs/guides/polnet-operator-request.md— 없으면 경고 출력 후 skip
0-5. 탐지 결과 출력
수집한 정보를 사용자에게 테이블로 표시합니다:
| 항목 | 값 |
|---|---|
| 프로젝트명 | {PROJECT_NAME} |
| 버전 | {VERSION} |
| 표시 버전 | {DISPLAY_VERSION} |
| WAR 파일명 | {WAR_FILENAME} |
| 패키지 폴더 | {UPLOAD_DIR} |
| 운영자 요청서 | 있음/없음 |
Step 1: WAR 빌드
cd "{PROJECT_ROOT}" && ./gradlew clean build -x test -q
빌드 완료 후 확인:
ls -la "{PROJECT_ROOT}/build/libs/"
build/libs/{WAR_FILENAME}존재 확인- 파일 크기가 0보다 큰지 확인
- 빌드 실패 시 즉시 중단 + 에러 로그 출력
Step 2: 업로드 디렉토리 생성
경로: {UPLOAD_DIR}
- 디렉토리가 이미 존재하면 사용자에게 확인 (덮어쓰기 여부)
polnet/polnet upload/상위 디렉토리가 없으면 자동 생성
mkdir -p "{UPLOAD_DIR}"
Step 3: 파일 복사
3-1. WAR 파일 복사
powershell -Command "Copy-Item '{PROJECT_ROOT}\build\libs\{WAR_FILENAME}' '{UPLOAD_DIR}\{WAR_FILENAME}' -Force"
주의:
build/libs/안의 WAR 파일명은archiveFileName설정이 있으면 그 이름 그대로, 없으면{name}-{version}.war형식일 수 있음.archiveFileName이 명시된 경우 해당 파일을 바로 복사. 명시되지 않은 경우build/libs/안에서.war파일을 찾아서 복사하되, 업로드 디렉토리에는{PROJECT_NAME}.war로 이름 변경.
3-2. 운영자 요청서 복사
docs/guides/polnet-operator-request.md가 존재할 때만:
powershell -Command "Copy-Item '{PROJECT_ROOT}\docs\guides\polnet-operator-request.md' '{UPLOAD_DIR}\운영자-요청사항.md' -Force"
없으면 경고:
⚠️ 운영자 요청서(docs/guides/polnet-operator-request.md)가 없습니다. 건너뜁니다.
3-3. 전체 소스코드 복사
디렉토리: {UPLOAD_DIR}/전체 코드({DISPLAY_VERSION})/
복사 대상:
src/(전체 재귀)gradle/(wrapper)build.gradlesettings.gradlegradlewgradlew.bat
# 디렉토리 생성
mkdir -p "{UPLOAD_DIR}/전체 코드({DISPLAY_VERSION})"
# 파일/폴더 복사 (PowerShell — 한글 경로 안전)
powershell -Command "Copy-Item '{PROJECT_ROOT}\src' '{UPLOAD_DIR}\전체 코드({DISPLAY_VERSION})\src' -Recurse -Force"
powershell -Command "Copy-Item '{PROJECT_ROOT}\gradle' '{UPLOAD_DIR}\전체 코드({DISPLAY_VERSION})\gradle' -Recurse -Force"
powershell -Command "Copy-Item '{PROJECT_ROOT}\build.gradle' '{UPLOAD_DIR}\전체 코드({DISPLAY_VERSION})\' -Force"
powershell -Command "Copy-Item '{PROJECT_ROOT}\settings.gradle' '{UPLOAD_DIR}\전체 코드({DISPLAY_VERSION})\' -Force"
powershell -Command "Copy-Item '{PROJECT_ROOT}\gradlew' '{UPLOAD_DIR}\전체 코드({DISPLAY_VERSION})\' -Force"
powershell -Command "Copy-Item '{PROJECT_ROOT}\gradlew.bat' '{UPLOAD_DIR}\전체 코드({DISPLAY_VERSION})\' -Force"
절대 복사 금지 목록:
.git/build/.gradle/.idea/node_modules/polnet/docs/.env,.env.localuploads/
Step 4: README.txt 자동 생성
Write 도구로 {UPLOAD_DIR}/README.txt를 생성합니다.
README 템플릿
아래 템플릿의 {변수}를 실제 값으로 치환합니다.
{WAR_SIZE_MB}는 WAR 파일의 MB 크기 (소수점 1자리).
{BUILD_DATE}는 YYYY-MM-DD 형식.
{SPRING_BOOT_VERSION}은 build.gradle의 org.springframework.boot 플러그인 버전.
{JAVA_VERSION}은 build.gradle의 sourceCompatibility 또는 options.release 값.
===============================================
{PROJECT_NAME} v{DISPLAY_VERSION} — 배포 패키지
작성일: {BUILD_DATE}
===============================================
■ 파일 목록
1. {WAR_FILENAME} — 배포용 WAR 파일 (약 {WAR_SIZE_MB}MB)
2. 운영자-요청사항.md — 서버 설정 요청 (nginx/DB/디렉토리)
3. README.txt — 이 파일
4. 전체 코드({DISPLAY_VERSION})/ — 빌드 가능한 전체 소스코드
■ 배포 전 운영자 선행 작업 (운영자-요청사항.md 참조)
1. nginx 프록시 블록 추가: location ^~ /{PROJECT_NAME}/
2. MySQL DB 생성 (최초 배포 시)
3. 업로드/로그 디렉토리 생성 (최초 배포 시)
4. JDK {JAVA_VERSION} 설치 확인
■ WAR 배포 절차
1) Tomcat 중지
{TOMCAT_HOME}\bin\shutdown.bat
2) 기존 언팩 폴더 삭제 (업데이트 배포 시)
rmdir /s /q {TOMCAT_HOME}\webapps\{PROJECT_NAME}
3) WAR 파일 복사
copy {WAR_FILENAME} {TOMCAT_HOME}\webapps\{WAR_FILENAME}
4) Tomcat 시작
{TOMCAT_HOME}\bin\startup.bat
5) 접속 확인
http://10.14.65.249:8090/{PROJECT_NAME}
■ 기술 사양
- Java {JAVA_VERSION} + Spring Boot {SPRING_BOOT_VERSION}
- Context Path: /{PROJECT_NAME}
- 브라우저: Chrome 56 호환
- DB: MySQL (JPA ddl-auto: update — 테이블 자동 생성)
■ 문의
- 개발: 김도아
===============================================
운영자 요청서가 없는 경우: 파일 목록에서 2번 항목 제거, 선행 작업 "운영자-요청사항.md 참조" 문구 제거.
Step 5: 최종 보고
모든 파일 복사 완료 후 사용자에게 결과를 보고합니다.
5-1. 파일 목록 + 크기 테이블
# 패키지 내 파일 크기 확인
powershell -Command "Get-ChildItem '{UPLOAD_DIR}' -Recurse | Where-Object { -not $_.PSIsContainer } | Select-Object FullName, @{Name='SizeMB';Expression={[math]::Round($_.Length/1MB,1)}} | Format-Table -AutoSize"
마크다운 테이블로 변환하여 출력:
| 파일 | 크기 |
|---|---|
| {WAR_FILENAME} | {N} MB |
| 운영자-요청사항.md | {N} KB |
| README.txt | {N} KB |
| 전체 코드({DISPLAY_VERSION})/ | {N}개 파일 |
5-2. 안내 메시지
✅ 배포 패키지 생성 완료
📁 패키지 경로:
{UPLOAD_DIR}
📋 다음 단계:
이 폴더를 USB에 복사하여 운영자에게 전달하세요.
운영자는 '운영자-요청사항.md'의 선행 작업 완료 후 WAR 파일을 배포합니다.
에러 처리
| 상황 | 처리 |
|---|---|
settings.gradle 없음 | "Gradle 프로젝트가 아닙니다" 에러 후 중단 |
build.gradle에 war 플러그인 없음 | "WAR 플러그인이 설정되지 않았습니다" 에러 후 중단 |
| WAR 빌드 실패 | 에러 로그 출력 후 중단 |
| 업로드 디렉토리 이미 존재 | 사용자에게 덮어쓰기 확인 |
| 운영자 요청서 없음 | 경고 출력 후 skip (나머지 계속 진행) |
src/ 디렉토리 없음 | 경고 출력 후 소스코드 복사 skip |