이 포스팅은 "스프링 부트와 AWS로 혼자 구현하는 웹 서비스" 책을 보고 정리한 내용입니다. 이번 포스팅에서는 이전에 구축한 EC2 서버에 스프링 웹 애플리케이션을 배포해보겠습니다. 깃허브에 스프링 웹 프로젝트가 생성되어있다고 가정하고 진행합니다.
sudo yum install git
git --version
mkdir ~/app && mkdir ~/app/step1
cd ~/app/step1
git clone 복사한 주소
./gradlew test
chmod +x ./gradlew
배포란 작성한 코드를 서버 컴퓨터에 반영하는 것을 말한다. 구체적으로 설명하자면 아래와 같다.
배포할 때 명령어를 일일히 타이핑하고 실행하는 것은 불편하므로 쉘 스크립트를 작성해 스크립트를 실행하면 자동으로 진행되도록 한다.
쉘 스크립트는 .sh라는 확장자를 가진 파일이다.
vim ~/app/step1/deploy.sh
#!/bin/bash
# 변수 선언
REPOSITORY=~/app/step1
PROJECT_NAME=todo-app
EXECUTABLE_NAME=todo
# 디렉토리 경로 변경
cd $REPOSITORY/$PROJECT_NAME
# 문자열 출력
echo "> Git Pull"
git pull
echo "> 프로젝트 Build 시작"
# 프로젝트 빌드
./gradlew build
echo "> step1 디렉토리로 이동"
cd $REPOSITORY
echo "> Build 파일 복사"
cp $REPOSITORY/$PROJECT_NAME/build/libs/*.jar $REPOSITORY
echo "> 현재 구동중인 애플리케이션 pid 확인"
# 명령어 실행결과를 변수에 할당 $()
# todo.*.jar => "."는 하나의 문자 매치, "*"는 0개 이상의 문자 매치
CURRENT_PID=$(pgrep -f ${EXECUTABLE_NAME}.*.jar)
echo "> 현재 구동중인 애플리케이션 pid: $CURRENT_PID"
# [ -z ] 는 문자열의 길이가 0이면 참
if [ -z "$CURRENT_PID" ]; then
echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다."
else
echo "> kill -15 $CURRENT_PID"
kill -15 $CURRENT_PID
sleep 5
fi
echo "> 새 애플리케이션 배포"
# ls: $REPOSITORY 디렉토리 내용 출력, -tr 옵션은 newest first sorting 결과를 reverse 따라서 최신파일이 나중에 출력
# grep: ls 결과를 받아서 jar가 들어간 행 출력
# tail: grep 결과를 받아서 마지막 행부터 1번째 줄 출력
JAR_NAME=$(ls -tr $REPOSITORY | grep jar | tail -n 1)
echo "> JAR Name: $JAR_NAME"
# nohup은 터미널이 끊겨도 실행한 프로세스는 계속 동작하게 함. 실행 중 생기는 메시지를 nohup.out 파일을 만들어 이 파일에 출력
# 2>&1는 표준오류(stderr)를 표준출력(stdout)이 전달되는 곳으로 보냄. 따라서 nohup.out에 표준오류도 같이 씀
# 마지막 &는 명령을 백그라운드 작업으로 실행함
nohup java -jar $REPOSITORY/$JAR_NAME --spring.profiles.active=prod 2>&1 &
chmod +x ./deploy.sh
./deploy.sh
vim nohup.out
스프링 부트 프로젝트에서 RDS를 연동하기 위해서 몇 가지 작업을 해야한다.
스프링 웹 애플리케이션 실행시 발생하는 create table 로그를 복사하여 MySQL Workbench로 RDS에 접속하여 테이블을 생성한다.
build.gradle에 MariaDB 의존성을 등록한다.
runtimeOnly 'org.mariadb.jdbc:mariadb-java-client'
EC2 서버에 RDS 접속 정보를 담은 application-prod.yml 파일을 생성한다.
spring:
config:
activate:
on-profile: prod
datasource:
url: jdbc:mariadb://rds주소/database이름
driver-class-name: org.mariadb.jdbc.Driver
username: db계정
password: db계정 비밀번호
jpa:
hibernate:
ddl-auto: none
properties:
hibernate:
#show_sql: true
dialect: org.hibernate.dialect.MariaDB103Dialect
format_sql: true
default_batch_fetch_size: 100
logging:
level:
org.hibernate.SQL: debug
# org.hibernate.type: trace
지금까지 EC2 서버에 프로젝트를 클론하고 스크립트를 통해 자동으로 빌드 및 실행을 하도록 설정하였다. 다음 포스팅에서는 깃허브에 푸시하면 자동으로 EC2서버에서 빌드와 배포가 되도록 개선한다.