Spring Boot 서버 재시작 없는 동적 로딩과 무중단 배포 방법
Spring Boot 애플리케이션 운영 중 코드를 변경할 때마다 서버를 재시작해야 하는 번거로움은 안정적인 운영에 큰 부담이 됩니다. 이번 글에서는 서버를 재시작하지 않고 동적 로딩을 지원하거나, 안정적으로 서비스를 제공하면서 새로운 버전을 배포할 수 있는 무중단 배포 방법들을 다룹니다.
1. JRebel을 이용한 코드 변경 실시간 반영
JRebel은 Spring Boot와 같은 Java 애플리케이션에서 코드가 변경되면 서버 재시작 없이 실시간으로 반영할 수 있도록 해주는 도구입니다. 이를 사용하면 개발 속도를 크게 높일 수 있습니다.
JRebel 설치 및 설정 방법
- JRebel 설치
JRebel 공식 웹사이트에서 설치 파일을 다운로드하여 설치합니다. 설치가 완료되면 IDE에 JRebel 플러그인을 추가합니다. IntelliJ와 Eclipse에서 사용 가능합니다. - JRebel 라이선스 등록
JRebel은 상용 도구이므로 라이선스가 필요합니다. JRebel 계정을 생성한 후 평가판이나 유료 라이선스를 등록합니다. - 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 Boot 애플리케이션을 개발할 때 유용한 도구로, 코드 수정 시 애플리케이션이 자동으로 재시작되거나 브라우저가 새로 고침되도록 지원합니다.
DevTools 설치 방법
- 의존성 추가
build.gradle
또는pom.xml
에 DevTools 의존성을 추가합니다.// Gradle 예시 dependencies { developmentOnly("org.springframework.boot:spring-boot-devtools") }
<!-- Maven 예시 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> </dependency>
- 브라우저 새로 고침을 위한 LiveReload 사용
DevTools에는 자동으로 새로 고침하는 LiveReload 기능이 포함되어 있습니다. Chrome, Firefox 등에 LiveReload 플러그인을 설치하면, HTML, CSS, JS 파일 변경 시 브라우저가 자동으로 새로 고침됩니다.
3. Spring Cloud Config로 설정 파일 동적 업데이트
Spring Cloud Config는 애플리케이션이 외부 설정 서버에서 설정을 가져와 서버를 재시작하지 않고도 설정을 업데이트할 수 있도록 해주는 도구입니다.
Spring Cloud Config 서버 설정 방법
- Config 서버 프로젝트 생성
Spring Initializr에서Config Server
를 선택해 프로젝트를 생성합니다.application.yml
파일에서 Config 서버 URI를 설정합니다. # application.yml 예시 spring: cloud: config: uri: http://localhost:8888 enabled: true
- 클라이언트 애플리케이션 설정
Config 서버를 참조하는 클라이언트 애플리케이션을 설정합니다. # application.yml 예시 (클라이언트 애플리케이션) spring: cloud: config: uri: http://localhost:8888 management: endpoints: web: exposure: include: refresh
- 설정 업데이트 반영
/actuator/refresh
엔드포인트를 호출하여 변경 사항을 실시간으로 반영할 수 있습니다. 이 엔드포인트를 호출하면 서버 재시작 없이 설정 파일 변경 사항이 반영됩니다.
4. Docker와 Kubernetes를 이용한 Rolling Update
Kubernetes의 Rolling Update
는 기존 버전을 순차적으로 교체하여 무중단 배포를 가능하게 합니다. Docker와 Kubernetes 환경에서 주로 사용되는 배포 방식으로, 컨테이너 기반 애플리케이션에 적합합니다.
Rolling Update 예제
- Dockerfile 생성
FROM openjdk:11 COPY ./target/myapp.jar /app/myapp.jar ENTRYPOINT ["java", "-jar", "/app/myapp.jar"]
- Kubernetes Deployment 설정
Deployment.yaml
파일을 작성하여 Kubernetes에 적용합니다. 여기서RollingUpdate
전략을 지정합니다. 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
- Rolling Update 배포 실행
kubectl apply -f Deployment.yaml
명령어를 실행하여 애플리케이션을 Rolling Update 방식으로 배포합니다. 이로 인해 트래픽이 새로운 버전으로 점진적으로 이전되며 서비스 중단이 발생하지 않습니다.
각 도구를 활용해 Spring Boot 애플리케이션을 개발하고 배포할 때 서버 재시작 없이 코드 변경 사항을 반영하거나 무중단 배포를 구현할 수 있습니다. JRebel과 DevTools는 개발 단계에서 유용하고, Spring Cloud Config와 Kubernetes Rolling Update는 운영 환경에서 안전한 배포를 보장하는 데 효과적입니다.
'컴퓨터 > 개발' 카테고리의 다른 글
SSH 프레임워크 오류 해결 방법: antlr.collections.AST.getLine() 문제 해결하기 (0) | 2024.10.08 |
---|---|
java.lang.NoClassDefFoundError: scala/collection/GenTraversableOnce$class 에러 해결방법 (0) | 2024.06.26 |