JaeWon's Devlog
article thumbnail
반응형

해당 글은 전'우아한 형제들' 현'인프런'의 개발자이신 jojoldu님의 블로그 책(스프링 부트와 AWS로 혼자 구현하는 웹서비스)을 참고하여 작성하였습니다.


이전 글에서 서비스를 구현하기 위해 서버와 DB를 구성하였습니다.

이번 글에서는 개발한 프로젝트를 해당 서버(EC2)에 배포해보도록 하겠습니다.

 

1. EC2에 Java 및 Git 설치

- 현재 서버(EC2)에는 아무런 설치가 되어 있지 않은 빈 서버입니다.

- 그렇기 때문에, 서버에 우리가 사용하는 프로그램(Java, Git 등)을 설치해야 합니다.

  • Java

- 현재 프로젝트를 Java8로 개발하고 있기 때문에 서버에도 Java8을 설치 하도록 하겠습니다.

- EC2에 접속하여 아래의 명령어를 통해 Java를 설치합니다.

EC2 접속 : Mac에선 터미널을 키고 ssh config에서 지정한 이름 (ex: ssh springboot-webservice)
sudo yum install -y java-1.8.0-openjdk-devel.x86_64

- Java 설치가 완료되었다면, 설치한 Java를 서버에 설정합니다.

sudo /usr/sbin/alternatives --config java

- 서버에 Java version을 확인합니다.

java -version
  • Git

- 프로젝트를 불러오기 위해 Git을 이용하겠습니다.

- EC2에 Git을 설치합니다.

sudo yum install git

- 설치한 Git을 확인합니다.

git --version

- Git을 설치하였으니, 프로젝트를 Clone 해보도록 하겠습니다.

 

2. EC2에 프로젝트 Clone

- 프로젝트를 Clone 할 디렉토리를 생성 합니다.

mkdir app
mkdir app/git

- 생성한 디렉토리를 이동합니다.

cd ~/app/git

- clone을 진행할 프로젝트의 주소를 github 웹페이지에서 ssh 주소를 복사합니다.

- 디렉토리에서 git clone 을 진행합니다.

git clone 복사한 주소 (ex : git clone https://github.com/jaewon0913/jaewon-study.git)

- git clone 이 정상적으로 진행되었다면, 해당 프로젝트 디렉토리로 이동하여 파일 목록을 확인합니다.

cd 프로젝트명           <-- 디렉토리 이동
ll                                  <-- 파일목록 확인(or ls -al)

- git branch -a 를 통해 현재 브랜치 확인도 가능합니다.

- clone 한 프로젝트가 정상적으로 받아졌는지 확인을 하기 위해 테스트를 수행합니다.

테스트 코드!!!
해당 글은 프로젝트에서 테스트 코드를 작성하였습니다.
만약, 테스트 코드가 없이 main에서만 개발을 진행하셨다면, 아래 명령어는 진행하지 않으셔도 됩니다.
테스트 코드 내용은 여기 를 클릭하여 확인해주세요!
./gradlew test

- 테스트가 정상적으로 통과되는 것을 확인합니다.

 

3. 배포 스크립트 생성 및 실행

- 프로젝트를 개발하고, 서버에 반영하는 작업을 배포라고 합니다.

- 해당 글에서 배포는 아래의 의미를 가집니다.

  • git clone 혹은 git pull을 통해 새 버전의 프로젝트 받음
  • Gradle / Maven을 통해 프로젝트 Test & Build
  • EC2 서버에서 해당 프로젝트 실행 및 재실행

- 위의 과정들을 배포할 때마다 개발자가 일일이 명령어를 실행하면 불편함이 많고, 시간이 오래걸립니다.

- 위의 과정들을 하나의 파일(쉘 스크립트)로 생성하여, 이 스크립트를 실행하면 위의 명령들이 실행되도록 하겠습니다.

  • 스크립트 생성

- 서버(EC2)에서 생성한 디렉토리에 이동하여 쉘 스크립트를 생성하겠습니다.

cd ~/app/git            <-- 디렉토리 이동
vi deploy.sh            <-- 스크립트 파일 생성(or vim delploy.sh)

- 아래의 코드를 스크립트에 추가합니다.

vi(vim)에서는
ESC -> i -> 입력
ESC -> :wq (저장 후 종료)
REPOSITORY=/home/ec2-user/app/git

cd $REPOSITORY/jaewon-study/

echo "> Git Pull"

git pull

echo "> 프로젝트 Build 시작"

./gradlew build

echo "> Build 파일 복사"

cp ./build/libs/*.jar $REPOSITORY/

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

CURRENT_PID=$(pgrep -f jaewon-study)

echo "$CURRENT_PID"

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

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

JAR_NAME=$(ls $REPOSITORY/ |grep 'jaewon-study' | tail -n 1)

echo "> JAR Name: $JAR_NAME"

nohup java -jar $REPOSITORY/$JAR_NAME &

- 위 배포 스크립트 파일에 대해 설명드리겠습니다.

  1. REPOSITORY=/home/ec2-user/app/git
    • 프로젝트가 있는 디렉토리를 변수로 선언합니다.
    • 쉘 스크립트에서는 변수=값 으로 저장합니다.
  2. cd $REPOSITORY/jaewon-study/
    • 변수로 선언한 디렉토리 + git clone 한 디렉토리로 이동합니다.
    • 쉘 스크립트에서는 위에서 선언한 변수를 $변수 로 사용합니다.
  3. git pull
    • 이동한 위치에서 git pull 을 통해 최신 프로젝트로 변경합니다.
  4. ./gradlew build
    • 프로젝트의 gradlew 를 통해 build를 진행합니다.
  5. cp ./build/libs/*.jar $REPOSITORY/
    • build를 통해 생성된 jar 파일을 $REPOSITORY로 복사합니다.
  6. CURRENT_PID=$(pgrep -f jaewon-study)
    • 현재 구동 중인 어플리케이션을 확인합니다.
    • pgrep : process id 확인 / -f 이름 : 이름으로 검색
    • 명령어에 대한 자세한 내용은 공식홈페이지를 통해 참고해주세요.
  7. if ~~ else ~~ fi
    • 현재 구동 중인 프로세스를 확인하여 추가 동작을 진행합니다.
    • process id 값을 조회하여 구동 중이면 해당 프로세스를 종료합니다.
  8. JAR_NAME=$(ls $REPOSITORY/ |grep 'jaewon-study' | tail -n 1)
    • 새로 구동 시킬 jar 파일을 검색하여 변수로 저장합니다.
    • -n 1 은 같은 이름으로 생길 경우 가장 마지막에 생성된 파일(최신)을 가지고 옵니다.
  9. nohup java -jar $REPOSITORY/$JAR_NAME &
    • 찾은 jar 파일을 nohup 을 통해 실행시킵니다.
    • 스프링부트는 내장 톰캣이 있기 때문에, 톰캣을 따로 설치할 필요가 없습니다.
    • 내장 톰캣을 통해 jar 파일만 있다면, 프로젝트를 실행 할 수 있습니다.

- 스크립트 파일을 생성하였다면, 이 파일에 실행 권한을 주어 실행시킬 수 있도록 하겠습니다.

chmod 755 ./deploy.sh

- 배포 스크립트 생성이 끝났습니다.

- 프로젝트에서 간단하게 변경하여 푸시 후 해당 스크립트를 실행해보도록 하겠습니다.

- 간단하게 프로젝트 버전을 변경하여 Git에 Push 합니다.

- Push가 정상적으로 진행되었다면, 쉘 스크립트를 실행합니다.

./deploy.sh

- 스크립트가 정상적으로 실행되어 끝났다면, 실행하고자 하는 프로젝트가 정상적으로 구동되었는지 확인합니다.

ps -ef|grep 프로젝트명 (ex :ps -ef|grep jaewon-study)

- 프로젝트에 관한 log도 확인 할 수 있습니다. 

cd ~/app/git/프로젝트명/           <--- 프로젝트 위치로 이동
tail -f nohup.out                       <--- 실시간 로그 확인

- 정상적으로 실행이 된 것을 확인 할 수 있습니다.

 

4. 외부에서 EC2 접속하기

- 이제 프로젝트는 서버(EC2)에서 구동 중 입니다.

- 웹브라우저에서 서버에 접속하여 프로젝트를 확인 해보도록 하겠습니다.

- 이전에 EC2를 생성 할 때에는 80, 443 포트만 접근 가능하도록 하였습니다.

- 서버에 접속하기 위해서는 8080포트를 열어 접속 가능하도록 해야합니다.

서버 포트!!!
개발 시 application.yml 또는 application.properties 에 server.port 를 지정하셨다면, 해당 포트를 열어 주시면 됩니다.

- AWS -> EC2 -> 보안 그룹 -> EC2에 할당한 보안그룹 -> 인바운드규칙 -> 인바운드 규칙 편집 클릭

- 사용자지정(TCP) -> 8080 포트를 추가합니다.

- 편집이 완료되었다면, 이제 웹브라우저를 통해서 서버에 접속해보도록 하겠습니다.

- EC2의 퍼블릭 DNS 를 확인하여, 해당 주소로 접속합니다.

- 스프링부트가 8080 포트로 열려있으므로, 해당 주소에 8080포트를 붙여서 접속합니다.(ex : 주소:8080)

작성자는 프로젝트에서느 포트를 8787로 사용하여, 8787 포트를 열어서 사용하였습니다.

- 정상적으로 외부에서 접속이 되는 것을 확인하실 수 있습니다.


출처

- https://jojoldu.tistory.com/263?category=635883 

반응형
profile

JaeWon's Devlog

@Wonol

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!