[Spring Boot] 우여곡절 AWS EC2에 스프링부트 프로젝트 배포
생각보다 적은 시간 동안 삽질 끝에 스프링부트 프로젝트 배포에 성공했다.
수동 배포이다 보니 상시 실행 중 상태가 아니라
수정사항이 있을 경우라던지 한 번 서버를 가동할 때 손이 많이 가는 만큼
빠른 시일 내에 자동 배포를 어떤 방식으로 할지 고민해 보고 적용시켜 보아야겠다.
기존에 EC2, RDS는 생성해 두었던 상태고
RDS는 프로젝트에 미리 적용시켜 사용 중이었기 때문에
본론부터 바로! 서버 접속부터~어떤 과정으로 배포하였는지 기록해 본다.
먼저, 나는 node.js 프로젝트에서 사용한 3000번 포트만 열어둔 상태라
EC2 / 보안 그룹 / 인바운드 규칙에 8080 포트를 추가해 주었다. (본인 프로젝트 포트에 맞게 설정)
1. 서버에 접속 후 자바 설치
sudo apt-get install openjdk-11-jdk
// 설치된 자바 버전 확인
java --version
2. 깃허브 Repository에서 git clone / git pull
콘솔에서 아래 코드를 입력하여 프로젝트를 git clone, pull을 진행한다.
git clone https://github.com/jangmimi/LectureEvaluation-SpringBoot.git
git pull
3. 프로젝트 디렉터리로 이동
- ls로 현재 디렉토리의 폴더 및 파일 확인(보기)
- cd로 디렉토리 이동
4. Gradlew에 권한 부여 후 빌드
sudo chmod 777 ./gradlew
./gradlew build
여기서 테스트 코드 관련 에러가 발생헀는데
아래 에러 해결 부분에서 테스트 코드 제외 빌드에 관해 설명하였다.
5. 빌드 후 생성된 jar 파일을 java로 실행
빌드를 성공적으로 마친다면 build/libs 폴더에. jar 파일이 생성되었을 것이다.
나는 LectureEvaluationSpring-0.0.1-SNAPSHOT.jar 파일과 plane이 붙은 2개의 jar 파일이 생성되었다.
(plane jar 파일 생성에 대해서는 좀 더 알아보고, 다루는 글을 올려야겠다.)
./build/libs 폴더까지 진입해서 아래 코드와 같이 실행해도 되고
java -jar LectureEvaluationSpring-0.0.1-SNAPSHOT.jar
프로젝트 루트 폴더에서 경로를 같이 입력하고 실행해도 된다.
// jar 파일에 plane이 붙지 않은 파일로 선택
java -jar ./build/libs/생성된jar파일.jar
// 본인 프로젝트 예시
java -jar ./build/libs/LectureEvaluationSpring-0.0.1-SNAPSHOT.jar
이렇게 실행하면 매우 반가운 모습을 볼 수 있다.
URL창에 서버주소:8080(포트번호)를 입력하면 프로젝트 사이트가 정상적으로 가동된다.
아 물론, 위 내용은 정말 단순하게 기본적인 내용으로 작성된 글이다.
나는 프로젝트의 yml 파일에 중요한 정보들을 암호화했었고,
VM Options에 암호 키를 적용해서 프로젝트를 빌드해 왔어서
서버에 올린 프로젝트를 암호화 관련 설정 없이 빌드하면서
당연하게도 몇몇 에러를 마주하게 되었다.
아래에서 마주한 에러 내용들을 다뤄보겠다.
일단, 모든 코드에서 오타를 주의하도록 하자.
사소한 실수로 삽질하는 시간낭비는 최소화하는 것이 좋다. (경험에서 몸소 깨달은 바ㅎ)
1. 처음에 마주했던 에러 아닌 에러는 빌드 중 76% 정도에서 멈춤(무한대기) 현상이었는데
EC2 서버를 재부팅하고 다시 우분투 접속 후 빌드해 보니 해당 문제는 해결되었다.
2. 또다시 마주한 에러는 테스트코드에서의 빌드 실패였는데,
테스트 코드 빌드를 제외하고 실제 프로젝트 내용만 빌드하도록 설정하였다.
(테스트 코드가 완성되지 않은 것도 있고
본 스프링부트 프로젝트는 일단 배포하는 방식을 익혀보자는 목표로
테스트코드 빌드를 제외하게 되었다.)
*테스트코드 제외 빌드*
./gradlew build -x test
*여기서 나는 VM Options 설정 때문에 실제로 빌드 시에는 위 코드에 추가로 암호화 키 관련 코드를 넣어주었다.
(자바 실행할 때도 동일하게 암호화 키 관련 코드 삽입)
java -jar -Djasypt.encryptor.키변수명=키값 생성된jar파일명.jar
// 빌드에서도 동일하게 '-Djasypt.encryptor.키변수명=키값' 이부분을 추가
이 내용은 모두에게 해결책이 될 수는 없을 것이다.
나와 유사하게 yml 혹은 properties 파일의 중요 정보를 jasypt로 암호화하고
VM Options에 설정하고 빌드한 경우에만 유사한 에러를 마주하고
이와 같은 방식으로 해결이 될 수도 있을 것이며
다양하게 검색을 해보고 정확하게 원인을 파악한다면 생각보다 간단하게 해결할 수 있을 것이다.
물론 오랜 시간이 걸릴 수도 있지만...(예전에 STS 세팅만 반나절 해본 경험 有 ^^)
+
파이널 프로젝트에서 한 팀원이 채팅 관련 배포를 하게 되면서 마주했던 에러가 있었는데
컨트롤러의 매핑에서 경로 부분 return 값의 '/' 문제로 페이지 호출이 되지 았던 것이었고
이 부분은 이미 숙지한 상태라서 연관 에러는 전혀 발생하지 않았다. (뿌듯)
원인은 찾아보니 리눅스에서 파일 위치를 찾아 못하는 상황이 발생해서 그렇다고 한다.
(Thymeleaf 템플릿 엔진을 사용할 경우 발생한다고 하는 것 같다.)
// 에러 발생 가능성 코드
@RequestMapping("/join")
public String join() {
return "/user/join";
}
// 정상 작동 코드
@RequestMapping("/join")
public String join() {
return "user/join";
}
// return에서 맨 앞 '/' 제거
// redirect의 경우는 정상적으로
// return 'redirect:/'; 로 해주면 된다.