[스프링 부트와 AWS로 혼자 구현하는 웹 서비스]무작정 따라하기 8일차

민지킴·2021년 4월 20일
1
post-thumbnail

*모든 내용은 책에 있는 내용을 기반으로 작성하였습니다.

8장 ----

8.1 EC2에 프로젝트 Clone 받기

깃허브 코드를 받아오게 EC2에 git 설치하기

sudo yum install git

설치가 완료되면 설치 상태 확인하기

git -- version

깃이 성공적으로 설치되면 git clone으로 프로젝트를 저장할 디렉토리를 생성하기

mkdir ~/app && mkdir ~/app/step1

방금 생성한디렉토리로 이동하고

git clone 복사한 깃 주소

잘 수행되는지 테스트로 검증

./gradlew test

Gradle을 EC2에 설치하지 않아도 Gradle을 설치할 수 있는 이유는 프로젝트 내부에 있는 gradlew 파일 때문이다. 이것은 해당 프로젝트에 한해서 그레이들이 설치 되어 있지 않은 환경에서도 그레이들을 쓸 수 있도록 지원하는 Wrapper 파일이다.

8.2 배포 스크립트 만들기

배포는 아래의 과정을 모두 포괄하는 의미이다.

  • git clone 혹은 git pull을 통해 새 버전의 프로젝트를 받음
  • Gradle이나 Maven을 통해 프로젝트 테스트와 빌드
  • EC2 서버에서 해당 프로젝트 실행 및 재실행

앞선 과정을 배포할 때마다 개발자가 하나하나 명열ㅇ어를 실행하는 것은 불편함이 많다.

그래서 이를 쉘 스크립트로 작성해 스크립트만 실행하면 앞의 과정이 차례로 진행되도록 한다.

쉘 스크립트는 .sh 라는 파일 확장자를 가진 파일이다. 리눅스에서 기본적으로 사용할 수 있는 스크립트 파일의 한 종류이다.

vim은 리눅스 환경과 같이 GUI가 아닌 환경에서 사용할 수 있는 편집 도구이다.

~/app/step1/에 deploy.sh 파일 하나를 생성한다.

deploy.sh

#!/bin/bash

REPOSITORY=/home/ec2-user/app/step1    //(1)
PROJECT_NAME=freelec-springboot2-webservice 

cd $REPOSITORY/$PROJECT_NAME/ //(2)

echo "> Git Pull" //(3)

git pull

echo "> 프로젝트 Build 시작"

./gradlew build //(4)

echo ">step1 디렉토리로 이동"

cd $REPOSITORY 

echo "> Build 파일복사"

cp $REPOSITORY/$PROJECT_NAME/build/libs/*.jar $REPOSITORY/ //(5)

echo "> 현재 구동중인 애플리케이션 pid 확인"

CURRENT_PID=$(pgrep -f ${PROJECT_NAME}.*.jar) //(6)

echo "현재 구동중인 애플리케이션 pid 확인"

if [ -z "$CURRENT_PID" ]; then     //(7)
        echo "> 현재 구동 중인 애플리케이션이 없으므로 종료하지 않습니다."
else
        echo "> kill -15 $CURRENT_PID"
        kill -15 $CURRENT_PID
        sleep 5
fi

echo "> 새 애플리케이션 배포"

JAR_NAME=$(ls -tr $REPOSITORY/ | grep jar | tail -n 1)  //(8)

echo "> JAR Name: $JAR_NAME"

nohup java -jar -  Dspring.config.location=classpath:/application.properties,/home/ec2-user/app/application-oauth.properties $REPOSITORY/$JAR_NAME 2>&1 &
//(9)

(1) REPOSITORY=/home/ec2-user/app/step1

  • 프로젝트 디렉토리 주소는 스크립트 내에서 자주 사용하는 값이기 때문에 이를 변수로 저장
  • 마찬가지로 PROJECT_NAME=freelec-springboot2-webservice도 동일하게 변수로 저장한다.
  • 쉘에서는 타입 없이 선언하여 저장한다.
  • 쉘에서는 $ 변수명으로 변수를 사용할 수 있다.

(2) cd Repository/Repository/PROJECT_NAME/

  • 제일 처음 git clone 받았던 디렉토리로 이동합니다.
  • 바로 위의 쉘 변수 설명을 따라 /home/ec2-user/app/step1/freelec-springboot2-webservice 주소로 이동한다.

(3) git pull

  • 디렉토리 이동 후, master 브랜치의 최신 내용을 받는다.

(4) ./gradlew build

  • 프로젝트 내부의 gradlew로 build를 수행한다.

(5) cp ./build/libs/*.jar $REPOSITORY/

  • build의 결과물인 jar 파일을 복사해 jar 파일을 모아둔 위치로 복사한다.

(6) CURRENT_PID=$(pgrep -f springboot-webservice)

  • 기존에 수행 중이던 스프링 부트 애플리케이션을 종료한다.
  • pgrep은 process id만 추출하는 명령어이다.
  • -f 옵션은 프로세스 이름으로 찾는다.

(7) if-else-fi

  • 현재 구동 중인 프로세스가 있는지 없는지를 판단해서 기능을 수행한다.
  • process id 값을 보고 프로세스가 있으면 해당 프로세스를 종료합니다.

(8) JAR_NAME=$(ls -tr $REPOSITORY/|grep jar|tail -n 1)

  • 새로 실행할 jar 파일명을 찾습니다.
  • 여러 jar 파일이 생기기 때문에 tail -n으로 가장 나중의 jar 파일(최신 파일)을 변수에 저장한다.

(9) nohup java -jar &REPOSITORY/$JAR_NAME 2>1 &

  • 찾은 jar 파일명으로 해당 jar 파일을 nohup으로 실행한다.
  • 스프링 부트의 장점으로 특별히 외장 톰캣을 설치할 필요가 없다.
  • 내장 톰캣을 사용해서 jar 파일마 있으면 바로 웹 어플리케이션 서버를 실행할 수 있다.
  • 일반적으로 자바를 실행할 때는 java -jar라는 명령어를 사용하지만, 이렇게 하면 사용자가 터미널 접속을 끊을 때 애플리케이션도 같이 종료된다.
  • 애플리케이션 실행자가 터미널을 종료해도 애플리케이션은 계속 구동될 수 있도록 nohup 명령어를 사용한다.

이렇게 생성한 스크립트에 실행 권한을 추가한다.

chmod +x ./deploy.sh

아래 명령어로 실행한다.

./deploy.sh

아래 명령어로 로그를 확인한다. (애플리케이션에서 출력되는 모든 내용을 가지고 있다.)

vim nohup.out

8.3 외부 Security 파일 등록하기

서버에서 application-oauth.properties의 정보를 가직 ㅗ잇어야 한다.

vim /home/ec2-user/app/application-oauth.properties

그리고 실제 application-oauth.properties의 값을 복사한다.

deploy.sh에서
/home/ec2-user/app/application-oauth.properties 이부분 추가

(1) -Dsrping.config.location

  • 스프링 설정 파일 위치를 지정합니다.
  • 기본 옵션들을 담고 있는 application.properties과 OAuth 설정들을 담고 있는 application-oauth.properties의 위치를 지정합니다.
  • classpath가 붙으면 jar 안에 있는 resources 디렉토리를 기준으로 경로가 생성된다.
  • application-oauth.properties 는 절대경로를 사용한다. 외부에 파일이 있기 때문이다.

8.4 스프링 부트 프로젝트로 RDS 접근하기

MariaDB에서 스프링부트 프로젝트를 실행하기 위해서는 몇가지 작업이 필요하다.

  • 테이블 생성
  • 프로젝트 생성
  • EC2 설정 -> EC2 서버 내부에서 접속 정보를 관리하도록 한다.

RDS 테이블 생성

  • JPA가 사용될 Entity 테이블
  • 스프링 세션이 사용될 테이블

스프링 세션 테이블은 schema-mysql.sql 파일에서 확인할 수 있다.

프로젝트 설정

build.gradle

compile("org.mariadb.jdbc:mariadb-java-client")

등록한다.

서버에서 구동될 환경을 하나 구성한다.

application-real.properties

spring.profiles.include=oauth,real-db
spring.jpa.properties.hibernate.dialect=org.hibernate
dialect.MySQL5InnoDBDialect
spring.session.store-type=jdbc

profile = real인 환경이 구성된다.
실제 운영도리 환경이기 때문에 보안, 로그상 이슈가 될만한 설정들을 모두 제거하며
RDS 환경 profile들이 추가된다.

EC2 설정

vim ~/app/application-real-db.properties

로 파일 생성

application-real-db.properties

spring.jpa.hiberante.ddl-auto=none
spring.datasource.url=jdbc:mariadb://rds주소:포트명/database이름
spring.datasource.useraname = db계정
spring.datasource.password = db계정 비밀번호
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver

(1) spring.jpa.hiberante.ddl-auto=none

  • jpa로 테이블이 자동 생성되는 옵션을 non으로 지정한다.
  • rds에는 실제 운영으로 사영될 테이블이니 절대 스프링 부트에서 새로 만들지 않도록 해야함
  • 주의해야 하는 옵션이다

8.5 EC2에서 소셜 로그인하기

책에 있는 내용을 보며 똑같이 진행했습니다.

profile
하루하루는 성실하게 인생 전체는 되는대로

1개의 댓글

comment-user-thumbnail
2022년 10월 26일

외부 Security 파일 등록한 후에 구동 되시던가요?? ㅠㅠ

답글 달기