허원철의 개발 블로그

Spring Boot - jar로 Deploy(배포)하기 본문

web

Spring Boot - jar로 Deploy(배포)하기

허원철 2017. 1. 19. 16:27
Spring Boot를 jar로 배포하면서 생긴 이슈들을 공유하기 위한 글입니다.

Apache와 Tomcat 조합에서는 Tomcat에서 정의한 위치에 war를 올려 사용했습니다. 하지만 Spring Boot에서는 기존 방식과 달리 jar파일로 배포가 가능하다는 것입니다. (기본적으로 Tomcat이 내장되어 있고, Jetty나 Undertow로 대체할 수 있습니다.)

Server : Centos v6.5

1 . properties(yaml) 구분하기
2 . service 구성



1 . properties(yaml) 구분하기

- Spring Boot로 프로젝트를 구성하게 되면, 리소스폴더에 application.properties 가 생성 되는데, 어지간한 설정은 다 할 수 있습니다. (톰캣, DB 등등..) 그리고 구분이 필요한 프로퍼티는 아래와 같이 추가할 수있습니다.

1
application-{custom}.properties
cs

만약 로컬(개발) 설정과 서버 설정이 다르고 로컬에서는 실서버를 바로 볼 수 없는 상황이라고 생각해봅니다. 그리고 Spring Boot에서 jar를 만들 때 서버를 바라보게 하고 빌드를 하게 되면 빌드 과정에서 Exception를 내뿜으면서 실패하고 맙니다. 그래서 환경에 따라 설정을 달리하기 위해 profile을 이용하여 대처할 수 있습니다.

1) 로컬환경과 서버환경이 다를 경우, 각각의 프로퍼티 추가

1
2
application-local.properties
application-server.properties
cs

2) application.properties에 초기 설정을 추가

1
spring.profiles.active=local
cs

3) 실행

1
java -Dspring.profiles.active=server -jar myApp.jar
cs


2 . service 구성

- Putty로 java -jar myApp.jar 로 실행하고 Putty를 내리게 되면 jar 역시 꺼지게 됩니다. 그래서 service에 등록하여 손쉽게 끄고 킬 수 있게 할 수 있습니다Centos 7 이상에서는 Spring Guide를 보시면 systemd를 이용하여, 각각 설정과 service를 손쉽게 등록 할 수 있습니다.(공식 가이드)

하지만!!  Centos 7 미만에서는 지원을 하지 않아, 직접 service에 등록하여 사용할 수 있습니다. (다른 더 좋은 방법이 있을 수도 있으니.. 이런 방법도 있다라는 것을 참고만 하셔도 될 것 같습니다.)

1) 서비스 등록

1
sudo vi /etc/init.d/myApp
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/bin/sh
SERVICE_NAME=myApp
PATH_TO_JAR=/usr/local/myApp.jar
PID_PATH_NAME=/tmp/myApp-pid
JAVA_OPTS="-server -Dspring.profiles.active=server"
case $1 in
    start)
        echo "Starting $SERVICE_NAME ..."
        if [ ! -f $PID_PATH_NAME ]; then
            nohup java $JAVA_OPTS -jar $PATH_TO_JAR /tmp 2>> /dev/null >> /dev/null &
                        echo $! > $PID_PATH_NAME
            echo "$SERVICE_NAME started ..."
        else
            echo "$SERVICE_NAME is already running ..."
        fi
    ;;
    stop)
        if [ -f $PID_PATH_NAME ]; then
            PID=$(cat $PID_PATH_NAME);
            echo "$SERVICE_NAME stoping ..."
            kill $PID;
            echo "$SERVICE_NAME stopped ..."
            rm $PID_PATH_NAME
        else
            echo "$SERVICE_NAME is not running ..."
        fi
    ;;
    restart)
        if [ -f $PID_PATH_NAME ]; then
            PID=$(cat $PID_PATH_NAME);
            echo "$SERVICE_NAME stopping ...";
            kill $PID;
            echo "$SERVICE_NAME stopped ...";
            rm $PID_PATH_NAME
            echo "$SERVICE_NAME starting ..."
            nohup java $JAVA_OPTS -jar $PATH_TO_JAR /tmp 2>> /dev/null >> /dev/null &
                        echo $! > $PID_PATH_NAME
            echo "$SERVICE_NAME started ..."
        else
            echo "$SERVICE_NAME is not running ..."
        fi
    ;;
esac
cs

2) 권한 설정

1
sudo chmod +x /etc/init.d/myApp
cs

3) 실행/중지/재시작

1
2
3
sudo service myApp start
sudo service myApp stop
sudo service myApp restart
cs


'web' 카테고리의 다른 글

Spring Boot - Security + JWT  (423) 2017.02.13
Spring Boot - QueryDSL  (410) 2017.01.25
Spring Boot - Apache proxy를 이용한 로드밸런싱  (437) 2017.01.17
Spring Boot - RabbitMQ  (395) 2017.01.10
메시지 큐(Message Queue) 훑어보기  (441) 2017.01.08
Comments