본문 바로가기
Java/Spring

완전히 실행 가능한 Spring Boot 배포

by TheUphill 2018. 2. 6.

Spring Boot를 $ java -jar 명령어를 이용해 실행할 수도 있지만 spring boot 1.3.0 버전에서 추가된 기능을 이용해 별도 스크립트 없이 리눅스 환경에서 서비스로 등록해서 실행, 관리할 수 있다. 스프링 레퍼런스에서는 이런 형태를 완전히 실행 가능한 jar (fully executable jar)로 표현하고 있다.

실행 가능한 jar를 만들기 위해서는 maven에 아래 plugin을 추가해야 한다.

<plugin>
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-maven-plugin</artifactId> 
    <configuration>
        <executable>true</executable> 
    </configuration>
</plugin>

그리고 프로젝트를 빌드해서 생성되는 아티팩트를 그냥 스크립트처럼 아래와 같이 실행하면 된다.

$ ./my-application.jar

이는 위에 추가한 플러그인으로 인해 생성되는 실행 스크립트가 jar 안에 내장됨으로써 java -jar 명령어 없이도 실행 가능한 형태의 jar가 생성된다.

이 방법은 CentOS, Ubuntu 등의 대부분 Linux 배포 환경에서 테스트 됐지만 OS X 또는 FreeBSD에서 구동하기 위해서는 embeddedLaunchScript를 사용해야 한다.

CentOS 6 이하 버전에서 init.d를 활용한 서비스 등록

CentOS 6 이하에서 init.d를 활용해 서비스로 등록해 좀 더 쉽게 어플리케이션을 관리할 수 있다. 먼저 아래 명령어를 이용해서 init.d에 등록한다.

$ sudo ln -s /path/to/myapp.jar /etc/init.d/myapp

그리고 서비스를 실행하면 프로세스의 PID와 함께 앱이 구동됐다는 메세지가 보인다.

$ service myapp start

서비스가 동작하면서 보이지 않는 동작 몇 가지를 설명하면

  1. 프로세스는 jar 파일의 소유자로 실행됨.
  2. PID는 /var/run/<appname>/<appname>.pid에 저장.
  3. 로그 메세지는 /var/run/<appname>.log에 저장된다.

실행 파라미터 및 시스템 변수

Production 환경에 맞게 몇몇 설정들을 변경하고 싶으면 <appname>.conf 파일에 시스템 변수를 입력해서 조작할 수 있다. 실행 스크립트는 jar파일이 위치한 디렉토리에서 jar파일과 이름이 같지만 확장자가 .conf로 돼있는 파일을 찾아 안에 입력된 시스템 변수를 읽어서 기존 설정을 덮어쓴다.

##################### JVM  ######################
JAVA_OPTS="-Xmx512m \
-Xms256m \
-XX:PermSize=256m \
-XX:MaxPermSize=256m
-Dspring.profiles.active=production"

################## Logging ######################
LOG_FOLDER="/home/runuser/test"
LOG_FILENAME="app.log"

JAVA_OPTS는 JVM 파라미터들을 명시했다. 메모리 설정, 그리고 활성화할 프로파일을 설정했다. 그리고 LOG_FOLDER는 로그 파일이 저장될 위치, LOG_FILENAME은 로그 파일명이다.

그 외에 제공되는 환경변수들은 이곳에서 확인 가능하다.

application.properties

스프링 부트는 application.properties 파일을 아래 경로에서 찾는다. 순서상 위에 내용이 아래 내용을 덮어쓴다.

  • 현재 디랙토리의 /config 디랙토리 하위
  • 현재 디랙토리
  • 클래스 패스의 /config 패키지
  • 클래스 패스 루트

배포 환경에서 .jar와 같은 디렉토리에 application.properties파일을 생성하고 설정들을 추가하면 jar에 포함된 application.properties를 덮어쓴다.

참고

'Java > Spring' 카테고리의 다른 글

SpringBoot에 Let's Encrypt 적용  (1) 2020.02.23
[Spring] @Temporal annotation의 시간 업데이트 문제  (0) 2017.03.18

댓글