* 프로그래머스, 타입스크립트로 함께하는 웹 풀 사이클 개발(React, Node.js) 5기 강의 수강 내용을 정리하는 포스팅.
* 원활한 내용 이해를 위해 수업에서 제시된 자료 이외에, 개인적으로 조사한 자료 등을 덧붙이고 있음.
CI(Continuous Integration, 지속적 통합) 파이프라인은 코드 변경 사항이 자동으로 빌드, 테스트, 배포되는 과정을 자동화하는 시스템이다.
개발자가 새로운 기능을 추가하거나 버그를 수정하면, CI 시스템이 이를 검증한 후 코드베이스에 병합하는 방식으로 동작한다.
CI/CD에서 "파이프라인"은 하나의 프로세스가 완료되면 다음 단계로 자동 연결되는 일련의 절차를 의미한다.
예를 들어, 다음과 같은 순서로 진행될 수 있다.
docker build → docker push → kubectl create → kubectl expose
Jenkins를 활용한 기본 CI 파이프라인은 다음과 같은 단계로 이루어진다.
1. 코드 변경 감지: GitHub 등 코드 저장소에서 변경 사항을 감지
2. 빌드(Build) 수행: 소스를 컴파일 및 패키징
3. 테스트 수행: 단위 테스트 및 통합 테스트 자동 실행
4. 컨테이너 이미지 생성: Docker를 사용해 애플리케이션을 컨테이너화
5. 배포(Deployment) 수행: 쿠버네티스(k8s) 등에 배포
간단한 웹 애플리케이션을 만들고 CI 파이프라인을 적용하는 실습을 진행한다.
GitHub의 비공개(private) 저장소에 접근할 때는 HTTPS보다 SSH 프로토콜을 더 많이 사용한다.
SSH 인증은 username/password 방식보다 보안성이 높고, public-private key 기반으로 동작한다.
ssh-keygen을 사용하여 public-private keypair 생성Settings → SSH and GPG keys → New SSH Keyid_xxxx.pub 파일의 공개 키를 GitHub에 등록private key는 외부에 노출되지 않도록 관리해야 함CI/CD 환경에서 빌드를 효율적으로 수행하기 위해 커스텀 에이전트 컨테이너를 제작하여 적용한다.
Dockerfile 작성 (필요한 패키지 및 환경 포함)
컨테이너 이미지 빌드 및 푸시
docker build -t my-custom-agent .
docker push my-custom-agent
Jenkins에서 해당 에이전트를 사용하도록 설정
단위 테스트(Unit Testing)는 개별적인 코드 단위를 검증하는 테스트 기법이다.
주로 함수나 모듈 수준에서 실행되며, 코드의 잠재적 결함을 조기에 발견하는 데 중요한 역할을 한다.
코드를 작성할 때 조기에 오류를 발견하여 유지보수 비용 절감
전체 애플리케이션의 품질과 안정성 향상
테스트 커버리지(Test Coverage) 확보: 작성된 코드가 테스트 코드에 의해 어느 정도 검증되는지를 나타내는 지표
테스트 종류 설명
단위 테스트 함수/클래스 단위의 최소 기능 검증
통합 테스트 여러 모듈이 함께 동작하는지 검증
인수 테스트 사용자 관점에서 기대한 기능이 정상 동작하는지 검증
👉 다음 실습에서는 테스트 커버리지까지 다룰 예정
좋은 코드란 단순히 "잘 동작하는 코드"가 아니라, 가독성이 높고 유지보수가 쉬운 코드를 의미한다.
기능성: 요구사항에 맞게 올바르게 동작하는가?
가독성: 다른 개발자가 쉽게 이해할 수 있는가?
재사용성: 중복을 최소화하고 유지보수가 쉬운가?
테스트 가능성: 단위 테스트가 충분히 적용될 수 있는가?
복사
편집
// ❌ 나쁜 코드: 가독성이 낮고, 의미 없는 변수명
int a = 10;
int b = 20;
int c = a + b;
System.out.println(c);
// ✅ 좋은 코드: 변수명을 명확하게 정의
int firstNumber = 10;
int secondNumber = 20;
int sum = firstNumber + secondNumber;
System.out.println(sum);
모든 프로젝트에서 동일한 코드 스타일을 유지하는 것은 필수적이다.
Java: Google Java Style Guide
JavaScript/TypeScript: Airbnb 스타일 가이드, Prettier
Python: PEP8
ESLint (JavaScript)
Checkstyle (Java)
Pylint (Python)
이번 강의에서는 CI 파이프라인의 기초 및 단위 테스트의 중요성을 다루었다.
다음 강의에서는 테스트 커버리지 확장 및 코드 품질 분석 도구 적용을 다룰 예정.
인수 테스트는 요구사항대로 기능이 구현되었는지를 확인하는 과정이다.
사용자의 관점에서 애플리케이션이 정상적으로 동작하는지를 검증하는 블랙박스 테스트를 포함한다.
도커 레지스트리 구성
애플리케이션 패키지 빌드 및 이미지 푸시
UAT 프레임워크 적용
CI/CD 파이프라인에서 소프트웨어 개발 산출물(예: 패키지, 바이너리 등)을 관리하는 저장소이다.
파이프라인의 모든 단계에서 동일한 바이너리를 사용하여 일관된 빌드 및 배포 환경을 보장한다.
도커 레지스트리는 컨테이너 이미지를 저장하고 관리하는 리포지토리이다.
클라우드 레지스트리
자체 호스팅 레지스트리
데이터 볼륨 관리
SSL 인증서 적용
REST API의 경우 curl 등을 이용해 테스트할 수 있지만,
비기술적 사용자에게는 이해하기 어렵고 유지보수에 불리하다.
👉 해결책: 사용자가 직접 읽고 이해할 수 있는 인수 테스트 작성
BDD(행동 주도 개발)는 사용자의 요구사항을 코드에 반영하기 위한 방법론이다.
| 도구 | 설명 |
|---|---|
| Cucumber | 인수 테스트 자동화를 위한 대표적인 BDD 도구 |
| Selenium | UI 테스트 자동화에 주로 사용 |
👉 실습에서는 Cucumber를 이용한 인수 테스트를 다룸
.feature 파일 작성dependencies {
testImplementation 'io.cucumber:cucumber-java:7.0.0'
testImplementation 'io.cucumber:cucumber-spring:7.0.0'
}
총 3개의 컨테이너를 포함하는 Pod 스펙 작성
커스텀 레지스트리의 접근 URI 및 태그 설정
총 9개 스테이지 설정 (Compile부터 Acceptance Test까지)
후처리(Post-Stage) 작업
docker stop을 사용해 스테이징 환경 정리
GitHub Poll SCM 설정 복원
매 5분마다 변경 사항 확인 및 자동 빌드 실행
TDD는 코드 작성 전에 테스트를 먼저 작성하는 방식이다.
인수 테스트는 기술보다 사람 중심이므로 TDD가 적합하다.
인수 기준 사양을 먼저 작성
인수 테스트가 통과되면 기능 구현 완료
이슈 추적 도구와 연동하여 기능 명세 관리
이번 강의에서는 인수 테스트 자동화 및 도커 레지스트리 구성을 다루었다.
다음 강의에서는 CI/CD 파이프라인을 개선하고 TDD 적용을 진행할 예정.
👉 CI/CD 파이프라인을 고도화하고 자동화를 강화하는 것이 목표!