SVN 커밋(리비전) 단위로 변경 파일을 추출해 운영 반영용 ZIP으로 묶어주는 작은 웹 도구. "이번 핫픽스에 들어가는 파일만 모아서 zip으로 주세요" 같은 상황을 손 작업 없이 자동화한다.
운영 환경에 손으로 파일 반영을 해야 하는 레거시 SI 환경에서는 매번 같은 작업을 반복한다.
- 어느 리비전들이 이번 반영 대상인가
- 그 리비전들의 변경 파일 목록을 일일이 확인
- 각 파일을 워킹 카피에서 골라 zip 으로 묶기
- 빌드까지 되면
.class도 같이 묶기
이걸 SVN 리비전 번호 몇 개와 프로젝트명만 입력하면 끝나도록 만든 결과다.
- 리비전별 변경 파일 자동 추출 — 단일·범위·콤마 조합 모두 지원
- 단일:
12345 - 범위:
12340~12345 - 조합:
12340~12345,12350,12360
- 단일:
- Maven 빌드 자동 시도
- 성공: 컴파일된
.class파일로 ZIP 구성 (운영 반영 즉시 가능) - 실패: 소스 파일(
.java/.xml/.jsp/ 기타)을 타입별로 분류해서 ZIP
- 성공: 컴파일된
- 변경 파일 경로 목록(
file_list.txt) 자동 생성 - 삭제(D) 타입 파일은 제외 — 운영에 반영할 일 없음
- 같은 파일이 여러 리비전에 걸쳐 있으면 가장 최신 리비전 유지
| 항목 | 내용 |
|---|---|
| 프레임워크 | Spring Boot 2.7.18 |
| Java | 8 |
| SVN 라이브러리 | SVNKit 1.10.11 |
| Maven 실행 | maven-invoker 3.2.0 |
| 템플릿 | Thymeleaf, Bootstrap 5.3 |
| 기본 포트 | 8080 |
src/main/resources/application.yml을 본인 환경에 맞게 수정.
svn:
base-url: svn://your-svn-server/svn/
maven:
home: ${MAVEN_HOME:} # 환경변수 MAVEN_HOME 또는 application.yml에 직접
app:
temp-dir: ${java.io.tmpdir}/svn-extractormvn clean package -DskipTests
java -jar target/svn-extractor-1.0.0.jar브라우저에서 http://localhost:8080 접속.
- 화면에서 SVN 사용자명/비밀번호 입력
- 프로젝트명 입력 (SVN 저장소 루트 하위 폴더명)
- 리비전 입력 (단일·범위·조합 자유)
- 추출하기 클릭
- ZIP 자동 다운로드
curl -X POST http://localhost:8080/api/extract \
-H "Content-Type: application/json" \
-d '{
"username": "svn_user",
"password": "svn_pass",
"projectName": "my-project",
"revision": "12345"
}' \
--output result.zip프로젝트명/
├── com/
│ └── example/
│ └── *.class
└── ...
프로젝트명/
├── file_list.txt # 변경 파일 경로 목록
├── java/ # .java 파일
├── xml/ # .xml 파일
├── jsp/ # .jsp 파일
└── other/ # 기타 파일
controller/ExtractController.java # REST + 메인 페이지
service/
SvnService.java # SVN 연동 (SVNKit, export 기반)
BuildService.java # Maven 빌드 (maven-invoker)
PackageService.java # 파일 분류 + ZIP 생성
dto/
ExtractRequest.java # 요청 DTO
ExtractResult.java # 결과 DTO
- **체크아웃이 아닌
svn export**를 쓴다. 워킹 카피 폴더(.svn)를 만들지 않으므로 정리 비용이 없다. - pom.xml만 HEAD 리비전으로 덮어쓰는 트릭 — 빌드에 필요한 의존성·플러그인 최신 정의를 받기 위해. 변경 리비전에 pom.xml이 없어도 빌드가 가능하다.
- 각 변경 파일은 자기 리비전으로 가져온다. 단순히 HEAD로 가져오면 다른 리비전에 들어간 동일 파일까지 섞여 들어와서 사고가 난다.
application-prod.yml은 본 저장소에 포함하지 않았다. 운영 환경에서 직접 작성해서 사용.- 운영 서비스에 띄우는 경우 SVN 인증 정보가 평문으로 흐르지 않도록 HTTPS 종단(리버스 프록시) 뒤에 두는 것을 권장한다.
- 임시 작업 디렉토리(
app.temp-dir)는 ZIP 응답 직후 자동 정리된다.
- 인증 정보(사용자명/비밀번호)는 요청 파라미터로만 전달되고 서버에 저장하지 않는다.
- 내부망 사용 전제로 만들어졌다. 외부 노출 시에는 인증 레이어를 앞단에 추가하라.
MIT.