본문 바로가기
컴퓨터/개발

SpringBoot 서버 재시작 없이 동적 로딩 및 무중단 배포 방법 총정리

by 토크미 2024. 10. 8.

Spring Boot 서버 재시작 없는 동적 로딩과 무중단 배포 방법

Spring Boot 애플리케이션 운영 중 코드를 변경할 때마다 서버를 재시작해야 하는 번거로움은 안정적인 운영에 큰 부담이 됩니다. 이번 글에서는 서버를 재시작하지 않고 동적 로딩을 지원하거나, 안정적으로 서비스를 제공하면서 새로운 버전을 배포할 수 있는 무중단 배포 방법들을 다룹니다.


1. JRebel을 이용한 코드 변경 실시간 반영

JRebel 무중단 방법

JRebel은 Spring Boot와 같은 Java 애플리케이션에서 코드가 변경되면 서버 재시작 없이 실시간으로 반영할 수 있도록 해주는 도구입니다. 이를 사용하면 개발 속도를 크게 높일 수 있습니다.

JRebel 설치 및 설정 방법

  1. JRebel 설치
    JRebel 공식 웹사이트에서 설치 파일을 다운로드하여 설치합니다. 설치가 완료되면 IDE에 JRebel 플러그인을 추가합니다. IntelliJ와 Eclipse에서 사용 가능합니다.
  2. JRebel 라이선스 등록
    JRebel은 상용 도구이므로 라이선스가 필요합니다. JRebel 계정을 생성한 후 평가판이나 유료 라이선스를 등록합니다.
  3. JRebel을 프로젝트에 적용
    설치 후 IDE에서 Spring Boot 프로젝트에 JRebel을 적용합니다. JRebel이 활성화된 상태에서 애플리케이션을 실행하면, 코드를 수정할 때마다 변경 사항이 실시간으로 반영됩니다.

코드 예제

@RestController
public class SampleController {

    @GetMapping("/greeting")
    public String greet() {
        return "Hello, World!";
    }
}

위 코드를 수정하고 저장하면, 서버를 재시작할 필요 없이 JRebel이 변경 사항을 자동으로 반영하여 새 응답이 반영됩니다. 예를 들어, return "Hello, JRebel!"로 변경하면 브라우저에서 /greeting 엔드포인트를 새로고침할 때 바로 반영됩니다.

주요 설정

IntelliJ 기준으로 JRebel 설정은 다음과 같이 진행됩니다:

  • Run Configurations에서 JRebel Agent를 선택하고 Enable JRebel for this project를 활성화합니다.
  • 애플리케이션을 JRebel로 실행하여 코드 수정 시 즉각적인 반영을 확인합니다.

2. Spring DevTools로 코드 자동 반영하기

Spring DevTools 자동화

Spring DevTools는 Spring Boot 애플리케이션을 개발할 때 유용한 도구로, 코드 수정 시 애플리케이션이 자동으로 재시작되거나 브라우저가 새로 고침되도록 지원합니다.

DevTools 설치 방법

  1. 의존성 추가
    build.gradle 또는 pom.xml에 DevTools 의존성을 추가합니다.
    // Gradle 예시
    dependencies {
        developmentOnly("org.springframework.boot:spring-boot-devtools")
    }
  2. <!-- Maven 예시 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> </dependency>
  3. 브라우저 새로 고침을 위한 LiveReload 사용
    DevTools에는 자동으로 새로 고침하는 LiveReload 기능이 포함되어 있습니다. Chrome, Firefox 등에 LiveReload 플러그인을 설치하면, HTML, CSS, JS 파일 변경 시 브라우저가 자동으로 새로 고침됩니다.

3. Spring Cloud Config로 설정 파일 동적 업데이트

Spring Cloud  배포

Spring Cloud Config는 애플리케이션이 외부 설정 서버에서 설정을 가져와 서버를 재시작하지 않고도 설정을 업데이트할 수 있도록 해주는 도구입니다.

Spring Cloud Config 서버 설정 방법

  1. Config 서버 프로젝트 생성
    Spring Initializr에서 Config Server를 선택해 프로젝트를 생성합니다. application.yml 파일에서 Config 서버 URI를 설정합니다.
  2. # application.yml 예시 spring: cloud: config: uri: http://localhost:8888 enabled: true
  3. 클라이언트 애플리케이션 설정
    Config 서버를 참조하는 클라이언트 애플리케이션을 설정합니다.
  4. # application.yml 예시 (클라이언트 애플리케이션) spring: cloud: config: uri: http://localhost:8888 management: endpoints: web: exposure: include: refresh
  5. 설정 업데이트 반영
    /actuator/refresh 엔드포인트를 호출하여 변경 사항을 실시간으로 반영할 수 있습니다. 이 엔드포인트를 호출하면 서버 재시작 없이 설정 파일 변경 사항이 반영됩니다.

4. Docker와 Kubernetes를 이용한 Rolling Update

k8s 배포

KubernetesRolling Update는 기존 버전을 순차적으로 교체하여 무중단 배포를 가능하게 합니다. Docker와 Kubernetes 환경에서 주로 사용되는 배포 방식으로, 컨테이너 기반 애플리케이션에 적합합니다.

Rolling Update 예제

  1. Dockerfile 생성
  2. FROM openjdk:11 COPY ./target/myapp.jar /app/myapp.jar ENTRYPOINT ["java", "-jar", "/app/myapp.jar"]
  3. Kubernetes Deployment 설정
    Deployment.yaml 파일을 작성하여 Kubernetes에 적용합니다. 여기서 RollingUpdate 전략을 지정합니다.
  4. apiVersion: apps/v1 kind: Deployment metadata: name: myapp-deployment spec: replicas: 3 strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 1 maxSurge: 1 template: metadata: labels: app: myapp spec: containers: - name: myapp-container image: myapp-image:latest ports: - containerPort: 8080
  5. Rolling Update 배포 실행
  6. kubectl apply -f Deployment.yaml 명령어를 실행하여 애플리케이션을 Rolling Update 방식으로 배포합니다. 이로 인해 트래픽이 새로운 버전으로 점진적으로 이전되며 서비스 중단이 발생하지 않습니다.

각 도구를 활용해 Spring Boot 애플리케이션을 개발하고 배포할 때 서버 재시작 없이 코드 변경 사항을 반영하거나 무중단 배포를 구현할 수 있습니다. JRebel과 DevTools는 개발 단계에서 유용하고, Spring Cloud Config와 Kubernetes Rolling Update는 운영 환경에서 안전한 배포를 보장하는 데 효과적입니다.