지금까지 EC2와 RDS는 많이 사용을 해봐서 EC2와 RDS는 기존에 사용하던 것을 그대로 사용했다.
이제 내가 만든 spring파일을 EC2에 배포해볼려고 한다.
Git Clone으로 파일 가져오기
git에 파일을 올려놓고 관리하면 좋은점이 바로 clone이다. 이런 EC2 서버나 다른 곳에 한 번에 복사해서 사용할 수가 있다.
깃허브 페이지에서 https 주소를 복사한다.
git clone 주소
를 하면 내가 원하는 폴더에 자동으로 복사가 된다.
이제 지금까지 내가 해왔던 test를 한번 돌려보자!!
배포 스크립트 만들기
저번 방학때 배포를 하기 위해서 맨날 똑같은 코드를 쳤던 기억이 있다. git에서 pull을 받고 gradle을 빌드하고 실행하고 있던 파일이 있으면 끄고 재실행 이것을 매번 반복했다. 이건 굉장히 비효율적이고 재미가 없다는 느낌을 그때도 받았다.
이 책에서는 이런 반복된 코드를 하나의 파일로 만들어 그것을 실행하면 한 번에 해결할 수 있도록 만들었다. 바로 쉘 스크립트 파일이다. 쉘 스크립트는. sh라는 파일 확장자를 가진 파일이다. 리눅스에서 기본적으로 사용가능하다.
#!/bin/bash
REPOSITORY=/home/ubuntu/app/step1
PROJECT_NAME=freelec-springboot2-webservice
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 &
REPOSITORY=/home/ubuntu/app/step1
PROJECT_NAME=freelec-springboot2-webservice
- 자주 사용하는 파일의 위치와 파일의 이름을 변수로 지정해 주었다.
- 쉘에서는 타입 없이 선언하여 저장한다.
- 쉘에서는 $ 변수명으로 변수를 사용할 수 있다.
cd $REPOSITORY/$PROJECT_NAME/
- 제일 처음 git clone 받았던 디렉토리로 이동한다.
git pull
- 디렉토리 이동 후, master 브랜치 최신 내용을 받는다.
./gradlew build
- 프로젝트 내부의 gradlew로 build를 수행한다.
cp $REPOSITORY/$PROJECT_NAME/build/libs/*.jar $REPOSITORY/
- build의 결과물인 jar 파일을 복사해 jar 파일을 모아둔 위치로 복사한다.
CURRENT_PID=$(pgrep -f ${PROJECT_NAME}.*.jar)
- 기존에 수행 중이던 스프링 부트 애플리케이션을 종료한다.
- pgrep은 process id만 추출하는 명령이다.
- -f 옵션은 프로세스 이름으로 찾는다.
if ~ else ~ fi
- 현재 구동 중인 프로세스가 있는지 없는지를 판단해서 기능을 수행한다.
- 프로세스가 있으면 id값을 보고 삭제한다.
CURRENT_PID=$(pgrep -f ${PROJECT_NAME}.*. jar)
- 새로 실행할 jar 파일명을 찾는다.
- 여러 jar 파일이 생기기 때문에 tail -n로 가장 나중의 jar 파일을 변수에 저장한다.
nohup java -jar $REPOSITORY/$JAR_NAME 2>&1 &
- 찾은 jar 파일명으로 해당 jar 파일을 nohup으로 실행한다.
- 스프링 부트의 장점으로 특별히 외장 톰켓을 설치할 필요가 없다.
- 내장 톰캣을 사용해서 jar 파일만 있으면 바로 웹 애플리케이션 서버를 실행할 수 있다.
- 일반적으로 java를 실행할 때는 java -jar라는 명령어를 사용하지만, 이렇게 하면 사용자가 터미널 접속을 끊을 때 애플리케이션도 같이 종료된다.
- 그러므로 종료해도 애플리케이션을 계속 구동될 수 있도록 nohup 명령어를 사용한다.
이걸 만든 뒤 이 쉘 파일을 실행해 보면 시작이 된다.
하지만 이런 에러가 발생했다.
읽어 보니 Security 파일이 등록이 안되어 있다는 것이다. 생각해 보니 local에서는 application-oauth.properties가 있었지만 이 파일은 git에 올리지 않았다. 그래서 이런 에러가 발생한 것 같다. app폴더에 application-oauth.properties를 만들고 이제 이것을 읽어 와야 한다. nohup java -jar 부분을 변경해야겠다.
nohup java -jar \
-Dspring.config.location=classpath:/application.properties,/home/ubuntu/app/application-oauth.properties \
$REPOSITORY/$JAR_NAME 2>&1 &
-Dspring.config.location
- 스프링 설정 파일 위치를 저장한다.
- 기본 옵션들을 담고 있는 application.properties와 OAuth 설정들을 담고 있는 application-oauth.properties의 위치를 지정한다.
- classpath가 붙으면 jar 안에 있는 resources 디렉터리를 기준으로 경로가 생선 된다.
- application-oauth.properties는 절대경로를 사용한다. 왜냐하면 외부에 파일이 존재하기 때문이다.
트러블 슈팅
계속해서 에러가 발생했다. 에러는 파일에 접근할 수 없다이다. 이것 때문에 몇 시간을 날려먹은지 모르겠다. 계속 찾아보고 구글링 해봤다. 알고 보니 정말로 간단한 문제였는데 띄어쓰기 잘못이었다. 학교에서 리눅스 수업을 들을 때, 교수님께서 리눅스는 띄어쓰기가 민감해 조금만 달라도 실행을 못한다고 하셨었다. 실제로 체험해 보니 이제 띄어쓰기는 철저하게 지켜야겠다.
스프링 부트 프로젝트로 RDS 접근하기
RDS 접근은 간단하다. RDS의 앤드포인트를 그대로 인텔리제이에서 접속하면 된다. 이것을 하기 전에 RDS의 보안에서 VPC 보안 그룹을 설정해줘야 한다.
VPC 보안 그룹에서 인바운드 규칙을 나는 내 IP와 나의 EC2 보안 그룹 2개를 연결해줬다!! 그러면 연결이 가능해진다.
EC2에서 접근하기
ec2에서도 RDS에 접근해야한다. application-real-db.properties를 만들어서 연결해줘야 한다.
이 파일은 app 폴더에 만들어서 다른 곳에서도 접근 가능하게 만들 것이다.
// application-real-db.properties
spring.jpa.hibernate.ddl-auto=none
spring.datasource.url=jdbc:mariadb://rds 주소:3306/데이터베이스 이름
spring.datasource.username=db계정
spring.datasource.password=db계정 비밀번호
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.jpa.hibernate.ddl-auto=none
- JPA로 테이블이 자동 생성되는 옵션을 none으로 지정한다.
- RDS에는 실제 운영으로 사용될 테이블이니 절대 스프링 부트에서 새로 만들지 않도록 한다.
- 이 옵션을 하지 않으면 테이블이 새로 생성될 수 있다.
이제 nohub을 실행 할 때, application-real-db.properties를 연결해야 한다.
nohup java -jar \
-Dspring.config.location=classpath:/application.properties,/home/ubuntu/app/application-oauth.properties,/home/ubuntu/app/application-real-db.properties,classpath:/application-real.properties \
-Dspring.profiles.actice=real \
$REPOSITORY/$JAR_NAME 2>&1 &
-Dspring.profiles.actice=real
- application-real.properties를 활성화 시킨다.
- application-real.properties의 spring.profile.include = oauth,real-db 옵션 때문에 real-db 역시 함께 활성화 대상에 포함된다.
이렇게 하면 성공적으로 연결된다.
이제 소셜로그인 API 페이지에 들어가서 리다이렉트 URL만 aws 퍼블릭 DNS로 바꾸면 된다!!
실행
성공적으로 실행된 모습이다.
로그인도 성공했다!!!
'토이프로젝트 > 스프링 부트로 구현한 웹' 카테고리의 다른 글
Github Actios를 사용하여 자동배포하기 (0) | 2023.03.14 |
---|---|
서브모듈을 이용해 application관리하기 (1) | 2023.03.12 |
스프링 시큐리티와 OAuth2.0으로 로그인 기능 구현하기 - 네이버 (0) | 2023.03.09 |
세션 저장소로 데이터베이스 사용하기 (0) | 2023.03.09 |
구글 로그인 어노테이션 기반으로 개선하기 (0) | 2023.03.09 |