✅ 1. CI (지속적 통합)란?
- Continuous Integration: 지속적인 코드 통합 및 자동 테스트
- 개발자들이 코드를 GitHub와 같은 원격 저장소에 푸시할 때마다
자동으로 빌드 및 테스트가 수행되어 안정성을 확보
- 보통
v1.0
,v1.1
처럼 버전 태깅을 통해 변경 이력을 관리함
- CI의 핵심 목표: "로컬에서만 잘 돌아가는 코드" → "모든 환경에서 안정적으로 작동하도록"
⚠️2. 로컬에서 잘 되더라도 서버에선 잘 안 될 수 있다?
로컬 환경 = 개인 개발 환경 (Windows, 내 JDK, 내 DB)서버 환경 = 운영 환경 (리눅스, 다른 설정, 클라우드 IP 등)
- 로컬에서는 모든 게 내 기준으로 돌아감 → 운영 서버와는 환경이 다름
- 그래서 "로컬에선 되는데 서버에선 안 됨" 현상이 잦음
- 이를 해결하기 위해 필요한 것이 테스트 서버 + 배포 자동화 시스템
🌐 3. 서버 테스트를 위해 필요한 로컬 테스트 환경 , 배포 서버 환경 요소 (AWS 기준)
🖥️ 로컬 테스트 환경
- 운영체제: Windows
- JDK: 21버전
- DBMS: MySQL
- 버전관리: GitHub에 업로드
- CI (지속적 통합):
main
브랜치 기준으로 로컬에서 문제없이 작동하는 것을 확인
- 문제점: 로컬에서 잘 돌아가는 코드가 서버에서는 잘 동작한다는 보장이 없음
☁️ 배포용 서버 환경 (AWS 기준)
운영 환경과 유사한 테스트를 위해 AWS 서버 사용
✅ 서버 환경 구성 조건
조건 | 설명 |
공인 IP (Public IP) | 외부에서 접속 가능한 고유 IP 주소. 서버는 localhost 대신 반드시 필요 |
고정 IP (Static IP) | IP가 바뀌지 않도록 고정 필요 (AWS에서는 Elastic IP 사용) |
무료 OS 사용 가능 | Ubuntu 등 리눅스 계열 OS 대부분 무료 |
CLI 환경 | GUI 없음. 리눅스 명령어 숙지 필수 ( cd , ls , vim , kill 등) |
🛠️ 서버 작업 순서 (초기 세팅 기준)
- 리눅스 OS 설치 (예: Ubuntu)
- JDK 21 설치
- GitHub에서 프로젝트 클론
./gradlew build
로 빌드 실행
java -jar build/libs/xxx.jar
로 실행
🐧 4. 왜 서버 OS는 리눅스를 많이 쓸까?
항목 | 리눅스 | 윈도우 |
가격 | 무료 (오픈소스) | 유료 |
자원 | 가볍고 효율적 | 상대적으로 무거움 |
보안 | 보안성 높음 | 취약점이 더 많음 |
인터페이스 | CLI (명령어 기반) | GUI (화면 기반) |
따라서 서버에서는 CLI 기반의 리눅스가 압도적으로 사용됨→ 필수:리눅스 명령어
에 대한 이해 필요 (cd
,ls
,mkdir
,vim
,ps
,kill
등)
🔧 5. 서버에서 포스트맨 테스트? 너무 귀찮다!
- 로컬 포스트맨에서 서버 IP로 API 테스트 가능하지만:
- 매번 주소 복붙
- 헤더 입력
- 요청 본문 작성 → 시간 낭비 + 사람 실수 가능성
✅ 해결 방법: 자동 테스트 코드 작성
- 빌드시 테스트 코드 실행 포함
- 테스트 통과한 경우에만 배포 (CI 자동화 기준)
- → "빌드가 성공했다 = 서비스에 이상이 없다"는 신뢰 확보
🔄 6. 서버 업데이트하면 다운되는 이유와 해결 방법 3가지
① 작은 사이트라면?
- 업데이트 시 서버가 몇 분 꺼져도 괜찮음
→ 직접 jar 던지고 재시작하면 끝
② 테스트 서버 빌드 방식
- 테스트 서버에서 먼저
.jar
파일 생성
→ 운영 서버에 jar만 교체
→ 배포 속도 향상 + 장애 시간 최소화
③ 대형 서비스 (예: 쿠팡)
- 한 번이라도 서버가 멈추면 매출 손해
- 해결책: 로드 밸런서(Load Balancer) 사용
구성 예시
테스트 서버
운영 서버 A
운영 서버 B
Load Balancer
✅ 무중단 배포 (Zero Downtime Deploy)의 핵심 기술!
💬 추가로 물어본 질문 정리
🔹 포스트맨은 어떻게 서버를 테스트하나요?
- 로컬 포스트맨 → 서버의
공인 IP:포트
로 요청 - 예:
http://43.201.xx.xx:8080/api/products
- 내부 서버에서는 별도 보안 설정 필요할 수 있음 (포트 개방 등)
🔹 도커(Docker)는 뭐에요?
"CD 굽듯이 프로그램 실행 환경 전체를 패키징하는 기술"
- OS, JDK, DB, 프로젝트 jar 등을 하나의 이미지로 묶어 실행 가능
- 장점:
- 로컬과 서버 환경을 완벽하게 일치시킴
- 실행 환경 통제 가능 (예: Ubuntu + MySQL + JDK 21)
- “로컬에선 되는데 서버에선 안 돼요” 문제 해결
📦 전체 요약
개념 | 설명 |
CI | 지속적 통합. 자동 빌드 및 테스트 |
CD | 지속적 배포. 자동 서버 반영 |
도커 | 실행 환경을 컨테이너로 묶어 배포 |
포스트맨 테스트 | 수동 테스트 → 자동화 필요 |
jar 빌드 배포 | 서버에 jar만 전송해서 배포 시간 최소화 |
로드밸런싱 | 무중단 배포, 대규모 트래픽 분산 처리 |
리눅스 | 서버 OS로 자주 사용. CLI 기반, 가볍고 무료 |
Share article