대외활동/UMC 4th

[FlagApp] SpringBoot - Server 배포

oxdjww 2023. 8. 7. 02:08
728x90
반응형

UMC 4th Master Course로 팀원들과 앱 프로젝트를 진행하고 있습니다.

Demo day에 앞서, back server를 배포하려 합니다.


목차

0. 개발환경

1. AWS EC2 생성

2. SSH Connection & git clone

3. Build with jar

4. 배포

 

cf. 하단 글의 db와 연동되어 있는 프로젝트입니다.

 

[SpringBoot] Springboot - AWS RDS(MySQL) Connection

개발환경 SpringBoot 2.7.13 JDK 11.0 MySQL 8.0.32 해당 ERD를 기반으로 Database Schema를 구축하였습니다. Relationship을 활용해 User, Flag(만남약속), 친구목록 등의 Entity-Relationship 관계를 표현하고자 했습니다.

oxdjww.tistory.com


0. 개발환경

SpringBoot 2.7.13

JDK 11.0

MySQL 8.0.32

 

aws ec2를 활용해 배포를 하기로 하였습니다. github에 있는 project를 clone 하여 jar를 이용하여 build를 할 것입니다!

 

1. AWS EC2 생성

 

 

AWS EC2 인스턴스를 생성합니다.

 

Ubuntu Image를 사용하고, 과금하지 않는 선에서 프리티어가 사용가능한 볼륨을 선택합니다.

키 페어를 통해 ssh 접속을 해야 하기 때문에 '새 키 페어 생성'을 통해 키를 만듭니다.

이때 생성한 키(*.pem)는 local에 편한 위치에 저장하시면 됩니다!

 

필자는 C:\Users\username\keys 에 저장하였습니다.

 

인바운드 설정을 해주어야 하기 때문에 디폴트값인 launch-wizard-1을 사용하지 않고 새로운 보안그룹을 생성해야 합니다.

보안 그룹 생성을 선택 후 넘어갑니다.

 

볼륨값은 프리티어 최대 크기인 30GB로 설정합니다.

이를 넘게 설정하면 과금될 수 있습니다!

 

마찬가지로 설정 중 나머지 값들은 다 기본값으로 해주셔야 합니다

 

그리고 생성 완료 합니다.

 

2. SSH Connection & git clone

2-1 SSH Connection

생성해 준 인스턴스의 정보에서 연결로 들어가시면 다음과 같은 화면입니다.

 

예: 부분에 있는 명령어를 복사합니다.

 

그리고 이전에 *.pem 파일을 위치해 준 디렉터리에서 terminal을 실행 후, 복사한 명령어를 입력합니다.

필자는 아래와 같이 입력하였습니다.

2-2 git clone

$ sudo apt-get install git
$ git --version

기본적으로 내장되어 있는 것 같긴 하지만 그래도 명령어를 통해 설치 후 확인합니다.

 

그리고 github에 등록해줄 ssh-key를 만들어야 합니다.

$ ssh-keygen -t rsa -C "github email address"

Enter ~ 로 나오며 입력창이 띄워지는데 그냥 계속 엔터 눌러줍니다.

key 생성 후 하단과 같은 명령어를 통해 공개키를 확인하고 복사합니다.

$ cat id_rsa.pub

그리고 github에 Settings -> SSH and GPG keys -> Add new SSH Key에 들어가 새로운 key를 만듭니다.

 

이때 휴대폰 github 앱에서 인증절차가 있을 수 있습니다!

 

그 후 SSH로 git clone을 합니다.

아까 접속해 둔 EC2 terminal로 가서 원하는 디렉터리에 git clone 합니다.

$ git clone "복사해둔 git@github~~"

무사히 clone한 모습입니다!

 

3. Build with jar

빌드 및 실행에 앞서 jdk를 설치합니다.

기본적으로 설치되어 있지 않기에 직접 설치해주어야 합니다.

 

$ sudo apt install openjdk-11-jdk

역시는 역시입니다.

 

웬일로 순조롭게 진행되나 싶었습니다.

linux에서 뭔가 이상할 땐 일단 update & upgrade를 하면 될 수도 있다는 것을 깨달았던 저는

 

일단 냅다 하단의 명령어들을 실행했습니다.

$ sudo apt update
$ sudo apt upgrade

역시는 역시입니다.

trouble shooting이 웬일로 1트만에 성공합니다.

 

그리고 바로 build 때려줍니다!

$ ./gradlew build

네 안 되네요

 

저 에러로그를 구글링해보니 main에서 처음 실행할 파일을 못 찾는 오류라는 얘기가 있어 소스코드를 조금 수정했습니다.

 

build.gradle에 하단의 코드도 추가하고..

bootJar.enabled = false

 

push pr merge pull..

 

친구한테 계속 approve 해달라고 하기 미안해서 3번째 수정부터는 그냥 세팅 바꾸고 혼자 master에 push 했습니다..

 

master branch push 하지 말라고 제가 팀원들한테 그렇게 강조했는데 제가 어기네요

삽질 끝에 원인을 찾았습니다.

 

bootJarClassMainName에 매달려 있었는데 하단의 이 문구를 못 보고 있었습니다.

네 jdbc 문제인 것 같아 바로 의존성 부분 가주었습니다.

runtimeOnly 'com.mysql:mysql-connector-j'
runtimeOnly 'mysql:mysql-connector-java'

mysql connector가 두 개나 설정되어 있어 우리 스프링부트가 헷갈렸나 봅니다..

 

범인은 찾지 않기로 했습니다 ^

 

그리고 다시

$ ./gradlew build

잘 되다가 76%에서 멈추길래 뭘까.. 했는데

 

이런 글이 있더군요?

 

 

 

[JAVA]gradlew build 76%에서 멈추는 경우 해결

AWS EC2 인스턴스 중지 후 재시작하고 다시 빌드하면된다.

minha0220.tistory.com

 

감사합니다

역시 각종 버그에는 reboot가 최고네요

 

그러고 다시 빌드해서 광명을 찾았습니다..

$ ./gradlew build

 

4. 배포

이제 ll명령어를 입력하면 build 디렉터리가 새로 생긴 것을 확인할 수 있습니다.

아래처럼 디렉터리 이동 후 jar파일을 실행합니다.

$ cd ./build/libs
ubuntu@ip-172-31-41-105:~/flag-app-back/build/libs$ nohup java -jar flag_back-0.0.1-SNAPSHOT.jar &

 

여기서 nohup의 역할이 중요한데요

터미널 세션이 끊겨도 프로세스가 계속 백그라운드에서 실행되게 해 줍니다!

 

$ cat nohup.out

명령어를 통해 log를 확인해 봅시다.

Spring 글씨는 봐야죠

 

그러고 나서 AWS 홈페이지로 돌아가서 EC2 instance 정보에 들어갑니다.

 

public ip address나 public DNS address를 확인 후, url에 둘 중에 하나를 다음과 같이 입력합니다.

아무거나 하셔도 상관없습니다. 포트만 8080 해주세요!

public ip address:8080
public DNS address:8080

 

그러면 이제 예쁘게 Whitelabel page가..

 

아니라 유니코드가 깨진 못생긴 화면이 나오네요

 

서버 배포라서 의미는 없지만 그래도 기분이 안 좋으니 인코딩 설정 해줍시다.

 

옵션을 넣어 실행도 해주고

$ nohup java -jar -Dfile.encoding=UTF-8 flag_back-0.0.1-SNAPSHOT.jar &

 

yml파일도 바꿔서 재빌드 후 재배포해주고

spring:
  http:
    encoding:
      charset: UTF-8
      force: true

 

.. 이래도 깨져있네요

 

일단 기능적인 문제는 없을 테니 배포 완료..라고 보고 했습니다!

 


이로서 서버 배포를 마쳤습니다!

 

BoB 과제만 하다가 배포하니까 은근히 재밌네요..?

 

긴 글 읽어주셔서 감사합니다!!

728x90
반응형

'대외활동 > UMC 4th' 카테고리의 다른 글

CI/CD with Github Action & AWS S3  (2) 2023.09.06
Ch 7 API : 당근마켓 CRUD  (0) 2023.05.18
Ch4 SQL : RDS실습  (0) 2023.05.17
Ch3 데이터베이스 : AWS RDS 구축  (0) 2023.05.17
Ch2 클라우드 구축 : AWS EC2 실습  (0) 2023.05.06