* 이 포스트는 전 배달의민족, 현재 인프런에 계시고 유튜브 개발바닥의 크리에이터이신 개발자 이동욱님의 '스프링부트와 AWS로 혼자 구현하는 웹 서비스'를 기반으로 작성되었음을 알립니다. 포스트 맨 아래에 관련 링크가 있습니다. 책의 내용을 기반으로 작성되기에 실습 중이라면 책을 main 해당 포스트를 sub로 참고해주세요. 책의 설명이 부족한 부분 위주로 포스트가 구성됩니다.
* 6장부터인 배포 과정은 빌드 부분 포스트들과 달리 문제 해결 위주로 포스트가 구성되어 있습니다. 전체 과정이 궁금하시다면 책이나 다른 블로그들을 참고해주세요.
* 한번에 되시는 분은 정말 아무 문제 없으실 수 있지만 배포시 문제가 생긴다면 정말 고생합니다. 필자 역시 빌드 부분은 프로젝트도 포스팅도 금방 완성했지만 배포 부분은 진행하며 엄청나게 시간을 썼습니다. 따라서 배포 과정 중 문제가 해결이 안되신다고 해서 무작정 시간을 들이는 것은 추천하지 않습니다.
** 8장부터는 처음하신다면 저처럼 헤매기 정말 쉬운 파트입니다. 시작 전에 이 포스트에서는 진행하다 제가 만난 문제 목록을 서두에 적어놓겠습니다. 문제에 직면하셨다면 먼저 https://github.com/jojoldu/freelec-springboot2-webservice/issues 이곳에 가셔서 검색해보시고 그래도 안된다면 리스트업으로 색인하시거나 구글링하셔서 해결하시길 바랍니다. 또한 이 포스트의 해결방법은 제가 겪은 방법이라 보시는 분에게 도움이 되지 않을 수도 있습니다.
** 필자는 이전 포스트들과 달리 이번장에서 인텔리제이 커뮤니티(무료) 버전이 아닌 인텔리제이 얼티메이트(유료) 버전을 사용해서 진행
- 책의 db navigator가 아무리 해도 작동하지 않아 유료 버전부터 존재하는 자체 database 툴을 사용했습니다.
$ 문제 리스트업 (그대로 Ctrl+F하시면 됩니다)
# Git Clone
1. 테스트 실패
2. git pull시 오류
3. permission denied
# deploy.sh
1. syntax error
2. no such file or directory / invalid or corrupt jarfile
3 permission denied(2)
4. cannot execute binary file
# rds 설정
1. org.h2.jdbc.JdbcSQLNonTransientConnectionException
2. org.springframework.dao.InvalidDataAccessResourceUsageException
8.0 준비과정
# 시작 전 알아야할 내용
시작 전에 이번 포스트는 문제가 발생할 여지가 굉장히 많기에 꽤나 내용이 깁니다. 그렇기에 이번 포스트에서 만나게 될 장애를 해결하는데 필요한 사항을 먼저 언급해두겠습니다..
- 리눅스 사용법
- insert, normal 모드 전환 등의 기초적인 내용은 반드시 숙지
- 디렉토리 편집기 : $vi . 입력시 이동 가능
- 권한 관련 : $ll 입력시맨 왼쪽에 나오는 퍼미션(-rw-rw-r-- 등), $chmod 사용법 등
- 포트 관련 : $netstat -tnlp 입력시 포트 정보 뷰, $fuser -k -n tcp 8080 입력시 포트 킬
- include 등 yml 설정 변경
- 블로그에도 나와있지만 yml의 profiles 수정 필요
관련 내용은 포스트에서 더 자세히 다룰 것이지만 궁금하시다면 검색을 먼저 해보셔도됩니다. 문제 리스트업과 시작전 내용을 바탕으로 문제 해결 과정이 어땠는지 진행하겠습니다.
8.1 프로젝트 Clone
# Git Clone
1. 테스트 실패 : 8장 시작부터 문제를 만나실 수 있습니다. 저와 같이 h2 db 설정을 하신 분이라면 빌드 진행 과정에서 테스트 코드가 실패할 것입니다.

따라서 일단 저같이 고생하지 마시라고 드리는 조언은 일단 테스트를 전부 주석처리 하시길 바랍니다. 어차피 이후 설정파일을 따로 쓸 것이기 때문에 테스트는 서버에 배포하지 않을겁니다.
2. git pull시 오류: 저처럼 만약 테스트 성공을 띄우고싶어서 설정을 건드리시고 git pull을 다시 하신분은 아마

이렇게 뜨실텐데 간단하게 github에서 pull받을 정보가 로컬에서 수정된 경우 뜨는 화면입니다. git을 잘 모르시는 분들은 그냥 평소 하던게 add > commit > push 가 끝일텐데(저도 비슷합니다) 사실 VCS는 협업 툴이고 항상 수정을 할때는 1. 최신 수정본을 pull > 2 수정 > 3 내 수정사항 commit 후 push 를 지켜야하는데 그게 안된게 주 이유일 가능성이 큽니다. 따라서 해당 문제때문에 오류가 나시는 분은 1. git stash 관련 내용 구글링 2. 어려우면 아래 코드를 입력
git add -A
git stash
git pull
stash란 간단하게 임시 수정사항 저장소입니다. 내 수정사항이 pull을 막고있으므로 수정되기 전처럼 보이기위해 git stash로 수정사항을 옮겨버리고 pull을 받는 것이라 생각하시면 됩니다. 위에 나온 코드를 간단히 설명하자면 1 github 의 최신 커밋을 불러오려는데 ec2내 프로젝트 working directory가 존재해서 충돌이 발생 2 git add -A로 로컬 변경 사항을 싹다 로드 3 변경 사항을 전부 stash를 사용해 임시로 스택으로 치워두고 이 때 pull을 가로막는 working directory 청소 4 git pull 가능 (5 stash drop으로 임시 저장소 청소를 해야하지만 안해도 됨)
git pull은 이따 deploy.sh에도 사용되니 그때 다시 언급하겠습니다.
3. permission denied
책 내용처럼 $chmod +x [파일명]를 써도됩니다. 하지만 맨 처음 언급했듯이 권한때문에 문제가 생길 가능성이 엄청 많습니다. 그래서 해당 내용을 먼저 대략적으로 파악하시길 바랍니다. 이에 대해선 https://recipes4dev.tistory.com/175 에 정리가 잘 되어있는 것 같습니다.
하지만 모든 내용을 다 알긴 시간이 걸리니 우리가 우선적으로 알아야할 건 +x란 execute(실행) 권한을 주는 것이고 $chmod -R 777 [폴더명] 을 하게되면 현재 및 하위 디렉터리 모두 모든 권한을 얻는다는 것입니다. 따라서 지금부터 이후 스크립트까지 어떤 파일이 생성되는 시점 바로 다음에 이 명령어를 시행하면 그 파일도 모든 권한을 얻습니다. 일단 저는 스크립트 과정에서 오류가 발생해서 현재는 이미지가 없습니다. 이후 다시 언급하겠습니다.
8.2 배포 스크립트 만들기
# deploy.sh

1. syntax error
만약 어떤 이슈가 정말 너무 해결이 안되면 스크립트 오타 문제일 확률이 매우 큽니다. 다음 사항을 체크해보세요.
- 자신이 입력한 스크립트의 글씨 색과 위 첨부된 사진이 동일한지 : echo 내의 글자는 대소문자나 오타가 생겨도 상관 없지만 실행 과정에서 대소문자 구분, 역슬래시 등 문자 구분을 엄격히 해야합니다. 사진과 글씨 색이 다르다면 무조건 수정해주세요. 구글링하며 자주 본 문제는 1 역슬래시가 노란색이 아님 2 중요 과정명에 공백이 껴 색깔이 흰색
- 공백을 확인할 것 : 공백의 경우 오타가 허용되는 지점이 있고 아닌 지점이 있습니다. 작성한 내용이 책과 공백이 다른데 오류가 났다면 확인해보세요. 또한 줄 사이의 공백 한줄도 신경써야합니다. 구글링하며 자주 본 문제는 1 스크립트 마지막에 쓸데 없는 공백과 문자가 들어감 2 역슬래시 다음줄이 공백줄인 문제(이후 다시 언급하겠습니다)
2. no such file or directory / invalid or corrupt jarfile



이런 오류가 뜨는 경우는 대부분 스크립트가 제대로 실행되지 않아서 파일이 생성되지 않아 생깁니다. 이 경우 1 스크립트 오타를 다시 확인 2 폴더 트리 구조가 app/step1/S1이고 파일들이 제 위치에 있는지 확인 3 터미널을 재부팅 후 다시 실행 4 스크립트를 전체 삭제한 뒤 다시 작성 을 추천드리며 제 경우 터미널 재부팅 후 문제가 해결되었습니다. 스크립트 삭제는 맨처음에 알려드린 $vi . 명령어를 이용하여 편집기에서 D > y 입력을 하시면 됩니다.
3 permission denied(2)
이 문제가 제일 곤란합니다. 저 역시 해결을 이것저것 해보다 안되서 마지막으로 재부팅을 했더니 해결된 케이스라 정확히 문제가 무엇인지 파악이 어렵습니다만 이에 대해 알아본 것을 알려드리자면
- 앞서 언급한 chmod -R 777을 통해 권한 부여 : 아래와 같이 빌드 직후 생긴 .jar가 포함된 폴더에 명령어를 씁니다.

- sudo를 통한 root 권한 빌리기 : 원인으로 예상되는 명령어 맨 앞에 sudo를 붙여봅니다. $sudo su를 통해 root 계정으로 로그인하는 것도 가능하지만 디렉토리를 새로 찾아야해서 추천하진 않습니다.
- jdk 권한 부어: jdk가 깔린 usr/bin의 권한을 chmod -R 777로 올려줍니다. 이때 root계정이 필요할 수도 있습니다. 또한 디렉토리 찾는게 어려울 수도 있으니 파일 탐색 명령어를 잘 써야합니다.
4. cannot execute binary file
해당 문제는 보통 .jar를 실행할때 발생하는데 os와 jdk버전이 맞지 않아서 생긴 문제일 확률이 큽니다. $java -version 명령어로 jdk버전, $getconf LONG_BIT 명령어로 리눅스의 버전을 체크합니다. 저 같은 경우는 버전이 둘다 64비트로 문제가 없었고 그런 분들은 1 deploy.sh를 다시 작성 2 .jar와 nohup.out을 모두 지운 뒤 다시 실행 3 jdk 재설치 4 서버 재부팅 을 해보시길 바랍니다. 저는 deploy.sh를 다시 작성하여 문제가 해결되었습니다.
* 마지막으로 nohup.out을 vim으로 여시면 배포된 서비스의 로그를 확인할 수 있는데 컴퓨터에 따라 한번에 출력되지 않을 수도 있습니다. 이럴 경우 닫고 다시 여시거나 nohup.out을 지우고 다시 배포해보시길 바랍니다.
8.3 외부 Security 파일 등록
# application.yml과 spring.profiles.group
일단 이 부분은 바뀐 내용을 모르면 헤맬 여지가 있습니다. 블로그에도 언급된 내용이지만 spring.profiles.include를 다시 설정해줘야합니다. 일단 profiles를 짧게 설명하고 가자면 우리가 개발을 할때 테스트 환경, 로컬 빌드 환경, 프로덕트 배포 환경의 사용 db 등 설정이 다릅니다. 그럴때마다 코드를 변경할 수 없으니 미리 설정파일을 test, local, real으로 생성해두고 필요할때마다 설정만 바꿔가며 톰캣을 켭니다. 이 때 이 프로필 설정이 책의 내용과 달라 혼란스러울 수도 있기 때문에 설명하고 가겠습니다.
spring:
profiles:
group:
local-real: local-real, oauth
real: real, real-db, oauth
application.yml의 원래 내용은 application-local-real.yml로 전부 옮겨 적으시고 application.yml은 위 내용만 남깁니다. 이러면 우리가 -Dspring.profiles.active=real 설정으로 jar를 실행하면 real, real-db, oauth 설정파일이 실행됩니다.

nohup java -jar \
-Dspring.config.location=classpath:/application.yml,/home/ec2-user/app/application-oauth.yml,/home/ec2-user/app/application-real-db.yml,classpath:/application-real.yml \
-Dspring.profiles.active=real \
책에 있는 이 부분이 배포할때의 설정을 선택해주는 코드입니다. 이 과정을 풀어보면 1 config.location부분 : classpath로 github에 있는 application.yml과 application-real.yml, github에 없고 ec2에 작성된 oauth, real-db 설정의 절대경로를 입력해 환경변수로 등록 2 profiles.active부분 : real-group를 사용해 배포하는 설정
8.4 rds 접근
# rds 설정
지금까지는 테이블을 JPA가 생성해줬지만 이제는 직접 생성해줘야 합니다. 또한 매번 테이블이 리셋되지 않게 설정해줘야합니다. 이 과정에서 생길 수 있는 문제를 나열해보겠습니다.
1. org.h2.jdbc.JdbcSQLNonTransientConnectionException

이 예외는 십중팔구 설정파일이 mariaDB가 아닌 기존의 h2 DB를 사용하게끔 되어있어 발생합니다.

저 네모 표시된 곳이 앞서 있었던 사진처럼 real, real-db, oauth로 되어 있지 않을 가능성이 제일 큽니다.
- 앞서 말한 application.yml을 살펴보고 real 그룹이 아래처럼 되어 있는지 확인
spring:
profiles:
group:
local-real: local-real, oauth
real: real, real-db, oauth
- application-real.yml의 include가 아래처럼 되어 있는지 확인
spring:
profiles:
include: real-db, oauth
- 위가 다 정상이라면 ~/app 폴더에(step1아님) application-real-db.yml과 application-oauth.yml이 있는지, deploy.sh가 제대로 작성되어 있는지 확인(config.location에 등록해야함)
- 이걸로 해결안되면 build.gradle의 dependency에 org.mairadb.jdbc:mariadb를 추가했는지 확인
2. org.springframework.dao.InvalidDataAccessResourceUsageException

해당 예외는 rds에 설정된 mariaDB 테이블에 문제가 있을때 발생합니다.
1 mariaDB의 table, column명의 대소문자가 쿼리와 일치하는지 2 각 테이블을 구성하는 column이 제대로 들어가 있는지(모든 객체의 필드값이 들어갈 수 있어야합니다) 3 session 테이블이 제대로 작성되어 있는지 4 column명 오타 확인(ex/ picture pictures)
8.5 EC2 소셜로그인
# 구글로그인
책의 내용과 좀 다른 점은 이제 리디렉션 URL만 작성하면 승인된 도메인은 입력할 필요가 없습니다.

여기까지 끝내셨으면 드디어 도메인을 가진 내 서비스가 스크립트로 배포되어 24시간 돌아가게됩니다. 무중단 배포 내용부터는 저희 포스트에서 다루지않겠습니다.(후에 시간나면...) 다음 포스트는 해당 프로젝트의 마지막 글이 될 것 같네요.
refer
이동욱님 블로그의 관련 포스트 : https://jojoldu.tistory.com/539?category=717427
개발바닥 유튜브 :https://www.youtube.com/channel/UCSEOUzkGNCT_29EU_vnBYjg
개발바닥
본격 세계최초 DEV 엔터테인먼트 토크쇼 두 스타트업 개발자의 요절복통 이야기 구독 안하면 장애남!!
www.youtube.com
이동욱님 github의 해당 repository : https://github.com/jojoldu/freelec-springboot2-webservice
'Project' 카테고리의 다른 글
P1_게시판 프로젝트_1_thymeleaf 시작 (0) | 2022.04.15 |
---|---|
P1_클론 프로젝트(feat. 스프링부트와 AWS로 혼자 구현하는 웹 서비스)_책 부분 End (0) | 2022.04.08 |
P1_클론 프로젝트(feat. 스프링부트와 AWS로 혼자 구현하는 웹 서비스)_7 (0) | 2022.04.08 |
P1_클론 프로젝트(feat. 스프링부트와 AWS로 혼자 구현하는 웹 서비스)_6 (0) | 2022.04.08 |
P1_클론 프로젝트(feat. 스프링부트와 AWS로 혼자 구현하는 웹 서비스)_5-2 (0) | 2022.03.30 |