2025년 6월 26일 작성
SVN - 중앙 집중형 Version Management System
SVN은 중앙 server에 모든 version history를 저장하는 집중형 version management system입니다.
SVN : 중앙 집중형 Version Management System
- SVN(Subversion)은 중앙 집중형 version management system으로, file과 directory의 변경 사항을 추적하고 관리합니다.
- Apache Software Foundation에서 개발하여 무료로 제공되며, 대규모 project에서 안정적인 version 관리를 위해 널리 사용됩니다.
- 중앙 server에 모든 version history를 저장하고, 여러 개발자가 동시에 작업할 수 있도록 협업 환경을 제공합니다.
SVN의 핵심 개념
- SVN은 중앙 집중형 architecture를 기반으로 하여 단일 중앙 repository에서 모든 version 정보를 관리합니다.
- revision 번호를 통해 각 변경 사항을 추적하며, 전체 repository에 대해 순차적으로 증가하는 숫자를 부여합니다.
- atomic commit을 지원하여 여러 file의 변경 사항을 하나의 단위로 처리하고, 실패 시 모든 변경 사항을 rollback합니다.
Repository 구조
svn_repository/
├── trunk/
├── branches/
└── tags/
- trunk : 주요 개발이 이루어지는 main branch 역할을 하며, 최신 stable code를 포함합니다.
- branches : feature 개발이나 실험적인 작업을 위한 별도 분기를 저장하는 directory입니다.
- tags : 특정 시점의 snapshot을 저장하여 release version이나 milestone을 표시합니다.
Working Copy
- 개발자의 local machine에 존재하는 repository의 복사본으로, 실제 작업이 이루어지는 공간입니다.
.svndirectory를 통해 metadata와 version 정보를 유지하며, 중앙 repository와의 동기화 상태를 추적합니다.- local 변경 사항과 repository의 최신 상태를 비교하여 conflict를 감지하고 해결할 수 있습니다.
주요 Command
- SVN은 command line interface를 통해 다양한 version 관리 작업을 수행할 수 있습니다.
- 각 command는 특정 목적에 따라 repository와 working copy 간의 상호작용을 처리합니다.
기본 작업 Command
svn checkout: 중앙 repository에서 working copy를 생성하여 local environment에 project를 복사합니다.svn update: 중앙 repository의 최신 변경 사항을 working copy에 반영하여 동기화합니다.svn commit: local 변경 사항을 중앙 repository에 저장하고 새로운 revision을 생성합니다.svn add: 새로운 file이나 directory를 version control 대상에 추가합니다.svn delete: file이나 directory를 삭제하고 다음 commit에서 repository에서 제거합니다.
정보 조회 Command
svn status: working copy의 변경 상태를 확인하고 modified, added, deleted file을 표시합니다.svn diff: local 변경 사항과 repository의 기존 version 간의 차이점을 비교하여 보여줍니다.svn log: repository의 commit history와 각 revision의 변경 내용을 시간순으로 조회합니다.svn info: working copy나 repository의 기본 정보와 현재 revision 상태를 확인합니다.
Branch 관리 Command
svn copy: trunk에서 branch를 생성하거나 tag를 만들 때 사용하며, 효율적인 복사를 수행합니다.svn switch: working copy를 다른 branch나 tag로 변경하여 작업 대상을 전환합니다.svn merge: 다른 branch의 변경 사항을 현재 branch에 병합하여 code를 통합합니다.
SVN의 장점과 단점
- SVN은 중앙 집중형 architecture로 인해 특정 환경에서 유리한 점과 불리한 점이 있습니다.
장점
- 중앙 집중형 관리로 인해 관리자가 권한과 접근을 쉽게 제어할 수 있습니다.
- atomic commit을 통해 data 무결성을 보장하고 부분적인 변경으로 인한 오류를 방지합니다.
- directory version 관리를 지원하여 file뿐만 아니라 directory 구조 변경도 추적합니다.
- binary file 처리에 최적화되어 있어 image, document 등의 binary file을 효율적으로 관리합니다.
단점
- 중앙 server 의존성으로 인해 network 연결이 없으면 대부분의 작업이 불가능합니다.
- offline 작업 제한이 있어 commit, update, log 조회 등의 주요 기능을 사용할 수 없습니다.
- branch 생성 비용이 상대적으로 높아 빈번한 branching이 어렵습니다.
- merge 처리가 복잡하고 conflict 해결 과정에서 오류가 발생할 가능성이 높습니다.
Git과의 비교
- SVN과 Git은 서로 다른 architecture와 workflow를 가진 version management system입니다.
- 각각의 특성에 따라 project의 규모와 팀의 작업 방식에 적합한 선택이 달라집니다.
Architecture 차이점
| 구분 | SVN | Git |
|---|---|---|
| 구조 | 중앙 집중형으로 단일 repository에서 모든 history 관리 | 분산형으로 각 개발자가 완전한 repository 복사본 보유 |
| version 식별 | revision 번호를 순차적으로 부여하여 전체 project에 대한 일관된 version 관리 제공 | hash 기반 commit ID를 사용하여 분산 환경에서의 고유성 보장 |
작업 방식 차이점
| 구분 | SVN | Git |
|---|---|---|
| commit 방식 | 중앙 server에 직접 commit하여 즉시 다른 개발자와 변경 사항 공유 | local repository에 commit 후 push를 통해 remote repository에 변경 사항 전송 |
| branch 관리 | branch 생성과 merge가 상대적으로 복잡하고 비용이 높음 | 가벼운 branch 생성과 빠른 merge를 통해 유연한 workflow 지원 |
사용 사례
- SVN은 특정 환경과 요구 사항에서 Git보다 적합한 선택이 될 수 있습니다.
- 조직의 정책과 project 특성을 고려하여 적절한 version management system을 선택해야 합니다.
SVN이 적합한 경우
- 중앙 집중형 관리가 필요한 기업이나 조직에서 엄격한 접근 제어를 요구하는 경우입니다.
- binary file이 많은 project에서 효율적인 저장과 관리가 필요한 경우입니다.
- linear development를 선호하고 복잡한 branching strategy가 필요하지 않은 경우입니다.
- 기존 SVN infrastructure가 구축되어 있어 migration 비용이 부담스러운 경우입니다.
Git이 적합한 경우
- 분산 개발이 필요하고 offline 작업이 빈번한 환경에서 사용하는 경우입니다.
- frequent branching과 experimental feature 개발이 활발한 project에서 사용하는 경우입니다.
- open source project나 외부 contributor가 많은 환경에서 사용하는 경우입니다.
- modern development workflow를 도입하고 CI/CD pipeline과 통합이 필요한 경우입니다.
실무 사용 예시
- 실무에서는 매일 출근 후 최신 code를 받고, 퇴근 전 작업 내용을 commit하는 pattern이 일반적입니다.
- release 시점에 tag를 생성하고, 긴급 수정이 필요하면 해당 tag에서 branch를 만들어 hotfix를 진행합니다.
Project 최초 Checkout
- 신규 입사자나 새 PC 환경에서 처음 project를 받을 때
svn checkout을 사용합니다. - checkout 후에는
svn update만으로 최신 code를 받습니다.
# repository 주소 확인 후 checkout
svn checkout https://svn.company.com/repos/payment-api/trunk payment-api
# A payment-api/src
# A payment-api/src/service
# A payment-api/src/service/PaymentService.java
# ...
# Checked out revision 1542.
cd payment-api
# 현재 상태 확인
svn info
# Path: .
# Working Copy Root Path: /home/dev/payment-api
# URL: https://svn.company.com/repos/payment-api/trunk
# Revision: 1542
일일 작업 흐름
- 개발자는 출근 후
svn update로 다른 팀원의 변경 사항을 받고, 작업 완료 후svn commit으로 반영합니다.
# 출근 후 최신 code 받기
svn update
# Updating '.':
# U src/service/UserService.java
# U src/controller/OrderController.java
# Updated to revision 1542.
# 작업 수행 후 변경 사항 확인
svn status
# M src/service/PaymentService.java
# M src/dao/PaymentDao.java
# commit 전 변경 내용 검토
svn diff
# 퇴근 전 commit
svn commit -m "결제 취소 API 추가"
# Committed revision 1543.
Release Tag 생성
- 운영 배포 전 현재 trunk 상태를 tag로 저장하여 배포 시점의 snapshot을 보관합니다.
# release tag 생성
svn copy https://svn.company.com/repos/payment-api/trunk \
https://svn.company.com/repos/payment-api/tags/release-2.1.0 \
-m "Release 2.1.0 배포"
# 생성된 tag 확인
svn list https://svn.company.com/repos/payment-api/tags/
# release-2.0.0/
# release-2.1.0/
운영 Hotfix 처리
- 운영 환경에서 긴급 버그가 발견되면 release tag에서 hotfix branch를 생성하여 수정합니다.
- trunk의 개발 중인 code와 분리하여 안전하게 hotfix를 진행합니다.
# release tag에서 hotfix branch 생성
svn copy https://svn.company.com/repos/payment-api/tags/release-2.1.0 \
https://svn.company.com/repos/payment-api/branches/hotfix-2.1.1 \
-m "Hotfix branch for critical payment bug"
# hotfix branch로 전환
svn switch https://svn.company.com/repos/payment-api/branches/hotfix-2.1.1
# bug 수정 후 commit
svn commit -m "결제 금액 소수점 반올림 오류 수정"
# hotfix 완료 후 tag 생성
svn copy https://svn.company.com/repos/payment-api/branches/hotfix-2.1.1 \
https://svn.company.com/repos/payment-api/tags/release-2.1.1 \
-m "Hotfix release 2.1.1"
# trunk에도 hotfix 반영
svn switch https://svn.company.com/repos/payment-api/trunk
svn merge https://svn.company.com/repos/payment-api/branches/hotfix-2.1.1
svn commit -m "Merge hotfix-2.1.1 into trunk"
동시 작업으로 인한 Conflict 해결
- 여러 개발자가 같은 file을 수정하면
svn update시 conflict가 발생합니다. - conflict marker를 확인하고 수동으로 병합한 뒤
svn resolved로 해결 완료를 표시합니다.
# update 시 conflict 발생
svn update
# Conflict discovered in 'src/service/UserService.java'.
# Select: (p) postpone, (df) diff-full, (e) edit, ...
# p 입력하여 나중에 해결
svn status
# C src/service/UserService.java
# ? src/service/UserService.java.mine
# ? src/service/UserService.java.r1540
# ? src/service/UserService.java.r1543
# file을 열어 conflict marker 확인 및 수정
# <<<<<<< .mine
# private int maxRetryCount = 5;
# =======
# private int maxRetryCount = 3;
# >>>>>>> .r1543
# 적절한 값으로 수정 후 conflict 해결 완료 표시
svn resolved src/service/UserService.java
svn commit -m "Merge conflict 해결 : maxRetryCount 값 통합"
장애 발생 시 Rollback
- 배포 후 장애가 발생하면 이전 revision으로 rollback하여 빠르게 복구합니다.
# 최근 commit 이력 확인
svn log -l 5
# r1543 | kim | 2024-01-15 14:30:00 | 결제 흐름 변경 <- 문제 발생
# r1542 | lee | 2024-01-15 11:20:00 | 주문 조회 개선
# r1541 | park | 2024-01-14 17:00:00 | 회원 API 수정
# r1543 변경 사항 되돌리기
svn merge -c -1543 .
# Reverse-merging r1543 into '.':
# U src/service/PaymentService.java
# rollback commit
svn commit -m "Rollback r1543 : 결제 장애로 인한 긴급 복구"