001.png

스프링부트 애플리케이션을 로컬 IDE를 통해 작성하고, GitHub Repository에 소스코드를 push합니다. 각 배포 전략에 맞는 브랜치에 push가 이루어지면, GitHub Actions가 해당 브랜치에 설정된 배포 스크립트를 자동으로 실행합니다.

이 과정에서 Gradle을 사용해 애플리케이션을 빌드하고, 생성된 JAR파일을 AWS EC2 인스턴스로 전송한 후 무중단 배포 전략이 도입 전이라면 배포 스크립트를 통해 명령어로 애플리케이션을 실행시키고, 무중단 배포 전략 도입 후라면 deploy.sh 스크립트를 통해 무중단 배포가 이루어집니다.

Nginx는 로드 밸런서를 역할을 하여, 8081과 8082 포트에서 각각 구동 중인 스프링 부트 애플리케이션의 트래픽을 분산시킵니다. deploy.sh 스크립트 실행되는 과정에서 설정 파일에 적힌 트래픽을 라우팅할 포트가 바뀌며 무중단 배포를 구현합니다.

Termius를 사용해, EC2 서버에 접속하여 Java 와 Nginx 등 인프라를 구축하고 deploy.sh 파일을 작성, 배포 상태를 확인하고 관리합니다.

배포 후에는 Apache JMeter 를 통해 애플리케이션에 Simple HTTP Request 를 잦은 시간 주기적으로 보내 테스트 API 응답값과 실행 포트를 확인하며 다운타임이 없는지 테스트합니다. Postman을 사용하여 헬스 체크 API 요청을 보내 구 버전의 애플리케이션이 완전히 내려갔는지 확인하며 무중단 배포 후의 애플리케이션 상태를 점검합니다.

4.1. 프로젝트 기술 스택

4.1.1. Spring Boot

Spring Boot는 Spring Framework의 하위 프로젝트로 빠르고 간결하게 애플리케이션을 개발할 수 있도록 해줍니다. 애플리케이션 개발에 필요한 다양한 설정을 자동화하고, 내장 웹 서버(Tomcat 등)를 포함하여 별도의 서버 설정 없이도 애플리케이션을 실행할 수 있습니다. 이는 개발자가 비즈니스 로직에 집중할 수 있도록 도와주며, 배포 환경에서도 일관된 실행 환경을 제공합니다.

Spring Boot 사용 이유

  1. 간편한 설정: Spring Boot는 대부분의 설정을 기본값으로 제공해, 복잡한 설정 없이도 빠르게 애플리케이션을 시작할 수 있습니다.
  2. 내장 서버: 별도의 웹 서버 설정 없이도 애플리케이션을 실행할 수 있어, 개발 및 배포가 간편합니다.
  3. 의존성 관리: Spring Boot는 스타터 의존성을 제공하여 필요한 기능들을 쉽게 추가할 수 있도록 돕습니다.
  4. 확장성: 대규모 애플리케이션에서도 안정적인 성능을 발휘하며, 다양한 모듈과의 호환성이 뛰어납니다.

4.1.2. Spring Actuator

Spring Actuator는 Spring Boot 애플리케이션의 운영 및 모니터링을 지원하는 강력한 도구입니다. 애플리케이션 상태 점검, 메트릭 수집, 로그 추적 등의 기능을 제공하며, 특히 무중단 배포 환경에서 중요한 헬스 체크(Health Check) 기능을 쉽게 구현할 수 있습니다. Spring Actuator는 기본적으로 /actuator/health와 같은 엔드포인트를 제공해, 애플리케이션이 정상적으로 동작하고 있는지 실시간으로 확인할 수 있습니다.

Spring Actuator 사용 이유

  1. 헬스 체크: /actuator/health 엔드포인트를 통해 애플리케이션 상태를 쉽게 모니터링하고, 무중단 배포 시 중요한 상태 점검을 자동화할 수 있습니다.
  2. 메트릭 수집: CPU 사용률, 메모리 상태 등 다양한 메트릭을 수집하여 애플리케이션 성능을 모니터링할 수 있습니다.
  3. 운영 및 관리 기능: 로그 수준 조정, 트레이싱, 스레드 덤프 등의 기능을 제공하여 운영 중인 애플리케이션을 효과적으로 관리할 수 있습니다.