공부/Server

[AWS + spring boot] 서버 배포하기 _ 2 rds mysql 데이터 베이스 생성 spring boot 연동 spring boot 프로젝트 배포

jihyee 2022. 1. 16. 04:20

얼른 써야지 했는데 생각보다 2번째 포스팅이 오래 걸렸다 ㅠ

 

 

 

[AWS + spring boot] 서버 배포하기 _ 1

 

[AWS + spring boot] 서버 배포하기 _ 1

서버는 왜 배포해야할까 서버를 24시간 작동하게 하는 방법은 3가지 내 pc를 24시간 구동시킨다. 호스팅 서비스를 이용한다. 클라우드 서비스를 이용한다. 그 중 유동적으로 트래픽 관리가 가능한

jihyee.tistory.com

↑↑↑ 전 포스팅!! ↑↑↑

 

 

 

 

 

 

에서

aws 계정 생성하고

ec2 서버 생성하고

putty로 접속하고

Java 프로젝트 구동을 위한 기초 세팅(git, java)

들을 했다.

 

 

 

 

 

 

 

 

웹 프로젝트 배포 과정을 크게 구분하면

서버 생성 - 데이터 베이스 구축 및 연동 - 프로젝트 빌드 및 실행

이게 다인데

 

 

서버 생성했으니 이제 데이터 베이스 구축 및 연동을 해주고 프로젝트를 빌드 구동해주면 된다!

 

 

 

 

 

 

 

 

 

 

데이터 베이스 구축 및 spring boot 연동

 

 

aws에서 관계형 데이터 베이스 관리를 하기 위해 제공하는 서비스가 rds이다.

 

 

데이터 베이스 생성을 클릭해준다.

 

 

 

원하는 데이터 베이스 유형을 선택해준다.

 

 

템플릿은 무료로 이용하려면 꼭 프리 티어를 선택해줘야 한다.

 

 

퍼블릭 엑세스는 예를 선택

 

 

그대로 생성 !!

 

 

 

 

 

생성을 완료하면 해당 데이터 베이스로 들어가서 보안 그룹파라미터 그룹을 수정해줘야 한다.

 

 

 

보안 그룹은 해당 origin 접속 가능한 서버들을 명시하는 것이고

파라미터 그룹은 타입 인코딩 정보를 저장한다고 생각하면 된다.

 

 

 

 

 

보안 그룹 수정 → 모든 IP 에서 3306 포트로의 접속 허가

 

 

생성된 데이터 베이스로 들어가서 보안 그룹을 클릭하면 우측 하단에 인바운드 규칙 편집 버튼이 있다.

해당 버튼을 클릭하여 데이터 데이스 서버에 접속이 가능한 ip 주소들을 편집할 수 있다.

3306 포트에 모든 ip4 접속을 허가하는 규칙을 추가해주면 어느 ip 주소에서도 암호만 입력하면 해당 데이터 베이스에 연결할 수 있다.

보안을 위해 접속을 막고 싶다면 내 ip 를 선택하거나 직접 ip 주소를 명시해 특정 주소에서만 연결이 가능하게 변경할 수도 있다.

 

 

 

 

 

파라미터 그룹 수정 → 타입 인코딩 정보 변경

 

왼쪽 목록에 파라미터 그룹에 들어간 후 데이터 베이스에 적용할 파라미터 그룹을 하나 생성하고 해당 파라미터 그룹 정보를 아래와 같이 변경해주면 된다.

 

 

 

 

 

charset (아래 이미지 6개) → utf8mb4

collection_server → utf8mb4_general_ci

collection_database → utf8mb4_general_ci

 

이는 데이터 베이스의 한글 사용(utf8)이모티콘 사용(mb4)등을 가능하게 하는 타입 인코딩 설정이다.

 

 

 

 

 

생성을 완료되면 데이터 베이스 생성 주소로 mysql-workbench에서 connection 생성해주면 된다.

 

 


 

hostname : database 연결 주소

username : rds 는 default 가 admin 인 것 같다. root 로 되어 있는 경우 연결이 안되니 주의하자

port : 3306 db 는 포트 주소가 default 가 3306 이다.

password : rds database 생성 시 입력했던 비밀번호

 

 

 

 

 

 

 

 

ok 누르고 connection 완성되면 들어가서 스키마 만들고 테이블 만들고 수정하고 관리하면 된다.

 

 

 

 

 

 

서버 자체에서 mysql 접속해서 터미널로 관리할 수도 있는데 workbench 가 있으니까 gui 서비스를 굳이 안 쓸 필요는 없을 것 같다. workbench 없으면 안 된다.. 너무 편해//..,, ヽ(^。^) ノ

 

 

 

 

데이터 베이스를 구축했으니 이제 작성하고 있는 프로젝트와 연동시켜줘야 한다. node를 쓰던 django를 쓰던 spring boot를 쓰던 데이터 베이스 연동 부분은 맥락이 비슷하니 방식도 비슷할 거라고 생각한다.

 

 

 

spring boot에 mysql 데이터 베이스 연동하는 방법은 

 

 

application.properties 파일에 데이터 베이스를 명시하는 것이다. 해당 파일은 db 말고도 외부 api key 나 token과 같이 프로젝트 전반적으로 관리해야 하는 값들을 저장하고 있다고 생각하면 된다.

 

spring.profiles.active=local
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://{rds주소}/{스키마명}?serverTimezone=UTC&characterEncoding=UTF-8
spring.datasource.username={username}
spring.datasource.password={password}
spring.datasource.hikari.pool-name=jpa-hikari-pool
spring.datasource.hikari.maximum-pool-size=5
spring.datasource.hikari.jdbc-url=${spring.datasource.url}
spring.datasource.hikari.username=${spring.datasource.username}
spring.datasource.hikari.password=${spring.datasource.password}
spring.datasource.hikari.driver-class-name=${spring.datasource.driver-class-name}
spring.datasource.hikari.data-source-properties.rewriteBatchedStatements=true
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
spring.jpa.properties.hibernate.hbm2ddl.import_files_sql_extractor=org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor
spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate5.SpringSessionContext
spring.jpa.properties.hibernate.default_batch_fetch_size=${chunkSize:100}
spring.jpa.properties.hibernate.jdbc.batch_size=20
spring.jpa.properties.hibernate.order_inserts=true
spring.jpa.properties.hibernate.order_updates=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect

위와 같은 코드로 구축한 데이터 베이스를 spring boot 프로젝트와 연동할 수 있다.

 

 

이러면 데이터 베이스 구축과 연동까지 끝났다! 이제 프로젝트만 서버에서 실행시키면 배포는 끝난다. ٩(¨ )ว

 

 

 

 

 

 

 

 

 

 

 

외부 서버에 spring boot 실행

 

 

저번 포스팅에서 생성한 ec2 서버에 들어가서 git java 등을 다운로드하였으면 

생성한 프로젝트를 git clone을 통해 clone 한다.

 

git clone {clone 할 프로젝트 깃 저장소 주소}

 

프로젝트를 받아왔으면 실행할 스트립트를 생성해줘야 한다 → deploy.sh

 

vim ~/{프로젝트주소}/deploy.sh

 

스크립트 파일을 clone 받은 프로젝트와 같은 위치에 생성시키고 내부 코드를 아래와 같이 작성해준다.

 

#!/bin/bash

REPOSITORY={프로젝트 주소}
PROJECT_NAME={프로젝트명}

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 확인"

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

echo "현재 구동 중인 애플리케이션 pid: $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 -tr $REPOSITORY/ | grep *.jar | tail -n 1)

echo "> JAR Name: $JAR_NAME"

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

 

 

 

실행 스크립트 코드에 대해 설명하면

 

  1. 우선 프로젝트 위치와 프로젝트 명을 변수에 저장해 관리하고 ($REPOSITORY & $PROJECT_NAME)
  2. git pull을 해서 만약 프로젝트가 최신 상태가 아니라면 최신 상태로 update 해준다.
  3. 프로젝트를 build 하고
  4. jar 파일을 만들어 nohup (백그라운드 실행)으로 jar 파일 실행시켜서 프로젝트를 실행해준다.

 

 

 

 

실행을 위한 파일이기 때문에 build와 같은 실행 시에 어떤 조건들을 주고 싶다 하면 이 파일 내부의 코드들을 수정하면 된다. 

다른 포스팅에서 설명했지만 나는 queryDsl 설정 관련해서 build 전에 해줘야 할 설정이 있어서 이 deploy.sh 파일 코드를 조금 수정했다.

또 포트 kill 관련해서도 8080 포트가 살아있는지 확인하고 재실행시키는데 살아있으면 kill 하는 코드도 여기에 넣었다.

 

 

 

 

 

↓↓↓↓↓↓ 이 부분을 확인하고 싶으면 ↓↓↓↓↓↓

 

[AWS + Spring Boot ] 스프링부트 QueryDSL 연동 배포

드디어 spring boot 에 querydsl 적용하고 배포까지 구현했다. 나중에 또 하면 1시간 넘게 헤맬 수 있으니 기억이 온전할 때 바로 내용 정리해놓고 두고두고 공부해야겠다. ๑・̑◡・̑๑ querydsl 이란?

jihyee.tistory.com

 

 

 

 

 

이렇게 deploy.sh 파일을 만들면

 

// deploy.sh 파일 실행 권한 부여
chmod +x ./deploy.sh

// 실행
./deploy.sh

파일에 실행 권한 부여하고 실행시켜 주면 된다.

 

 

 

 

실행하면 프로젝트 폴더 위치에 nohup.out 파일이 생기는데

 

여기에 로컬로 spring boot 돌렸을 때 run terminal에 뜨는 log들이 기록된다. 만약 서버가 갑자기 꺼지거나 에러로 인해 실행이 안되면 이 파일 열어서 확인해보면 된다.

 

 

 

 

 

 

 

 

 

드디어 aws ec2 서버에 spring boot 프로젝트 배포하기 정리 끝!!!

 

데이터 베이스 구축이랑 연동까지 설명하려니까 글이 정말 길어진 것 같다...

 

 

 

 

 

 

 

 

이제 다음은 gcpnaver cloud platform이다...

어떤 클라우드 서버 서비스를 쓰는지에는 관계 없이 위 방식은 동일하게 적용되는 것 같다. 

단, paas-ta 제외.. ㅎ

 

 

 

 

 

클라우드 공부도 꾸준히 해서 방학에 자격증도 한번 도전해봐야겠다.

 

 

 

 

아자아자 ੧ᐛ੭