이번 글은 프로젝트를 진행하면서 문제가 됬었던 부분을 정리, 요약 하는 글 입니다.
(미래의 나를 위해!)
1. 문제의 상황
우리의 Spring 프로젝트에서 사용한 yml파일은 다음과 같습니다.
spring:
profiles:
active: local
datasource:
url: ${datasource}
driver-class-name: com.mysql.cj.jdbc.Driver
username: ${username}
password: ${password}
jwt:
token:
validate-time: 1800
token-secret: "Shine-Lucid"
kakao:
token-server-uri: "https://kauth.kakao.com/oauth/token"
oauth-server-uri: "https://kapi.kakao.com/v2/user/me"
client-id: ${KAKAO_CLIENT_ID}
redirect-uri: "http://3.38.93.166/api/login/oauth/kakao/callback"
github:
token-server-uri: "https://github.com/login/oauth/access_token"
oauth-server-uri: "https://api.github.com/user"
client-id: ${GITHUB_CLIENT_ID}
client-secret: ${GITHUB_CLIENT_SECRET}
- password: ${password} 같이 yml 설정파일에 지정후
- 리눅스 환경변수 로 해당 값들을 설정해준다.
- 스크립트 상에서 실행할때 환경변수의 비밀번호를 찾아와서 커맨드로 추가한다.
우선 was 를 새로 실행시키는 문제의 스크립트 는 다음과 같습니다.
#!/bin/bash
CURRENT_PORT=$(cat /home/ec2-user/service_url.inc | grep -Po '[0-9]+' | tail -1)
TARGET_PORT=0
USER_NAME=$(env | grep username | cut -c 10-14)
PASSWORD=$(env | grep password | cut -c 10-17)
DATASOURCE=$(env | grep datasource | cut -c 12-97)
GITHUB_CLIENT_SECRET=$(env | grep GITHUB_CLIENT_SECRET | cut -c 22-61)
GITHUB_CLIENT_ID=$(env | grep GITHUB_CLIENT_ID | cut -c 18-37)
KAKAO_CLIENT_ID=$(env | grep KAKAO_CLIENT_ID | cut -c 17-48)
echo "> Current port of running WAS is ${CURRENT_PORT}."
if [ ${CURRENT_PORT} -eq 8081 ]; then
TARGET_PORT=8082
elif [ ${CURRENT_PORT} -eq 8082 ]; then
TARGET_PORT=8081
else
echo "> No WAS is connected to nginx"
fi
TARGET_PID=$(lsof -Fp -i TCP:${TARGET_PORT} | grep -Po 'p[0-9]+' | grep -Po '[0-9]+')
if [ ! -z ${TARGET_PID} ]; then
echo "> Kill WAS running at ${TARGET_PORT}."
sudo kill ${TARGET_PID}
fi
nohup java -jar -Dserver.port=${TARGET_PORT} /home/ec2-user/airbnb-deploy/build/libs/* --username=${USER_NAME} --password=${PASSWORD} --datasource=${DATASOURCE} --KAKAO_CLIENT_ID=${KAKAO_CLIENT_ID} --GITHUB_CLIENT_ID=${GITHUB_CLIENT_ID} --GITHUB_CLIENT_SECRET=${GITHUB_CLIENT_SECRET} > /home/ec2-user/nohup.out 2>&1 &
echo "> Now new WAS runs at ${TARGET_PORT}."
exit 0
맨 처음 환경변수로 등록해둔 값들을 grep 과 cut을 통해 변수로 받는 과정이 있습니다.
저또한 변수가 늘어날 때 마다 위와 같은 과정을 거치는것이 너무 귀찮다는 생각을 하게 되었습니다.
역시는 역시군...
리뷰어 님께서 위와 같은 리뷰를 남겨 주셨다....
이를 어찌 해결해야 할까?
2. 해결 과정
우선 참고한 글은 다음과 같다.
Using env variable in Spring Boot's application.properties
We are working on a Spring Boot web application, and the database we are using is MySQL; the setup we have is we first test it locally (means we need to install MySQL on our PC); then we push to
stackoverflow.com
우선 위 글에서도 확인 가능하듯 2가지 방법이 있다.
2-1) 정적으로 환경변수 파일을 선택하는 방법
우선 properties의 구조는 다음과 같다.
application.yml 내부에서 다음과 같이 실행할 yml 파일을 선택하게 된다.
spring:
profiles:
active: local
application.yml에서 선택한 설정 파일을 메인으로 사용하게 된다.
나의 코드에서 애당초 다음과 같은 부분이 필요 없다는 내용이 가장 많은 추천을 받은 내용이였다.
USER_NAME=$(env | grep username | cut -c 10-14)
PASSWORD=$(env | grep password | cut -c 10-17)
DATASOURCE=$(env | grep datasource | cut -c 12-97)
GITHUB_CLIENT_SECRET=$(env | grep GITHUB_CLIENT_SECRET | cut -c 22-61)
GITHUB_CLIENT_ID=$(env | grep GITHUB_CLIENT_ID | cut -c 18-37)
KAKAO_CLIENT_ID=$(env | grep KAKAO_CLIENT_ID | cut -c 17-48)
그냥 yml 설정 파일에 다음과 같이 환경 변수로 받고 싶은 값들을 ${}로 설정해 두고,
url: ${datasource}
리눅스에서 해당 환경변수를 설정해 뒀다면,
Spring을 실행할 때 알아서 linux의 환경변수를 읽어다가 값을 binding 시켜준다는 의미였다.
애당초 저 위의 코드들이 필요 없었던것 이다!
또한 다음과 같이 --datasource=${DATASOURCE} 를 실행할때 옵션으로 추가해주지 않아도 된다는 것 이였다!
nohup java -jar -Dserver.port=${TARGET_PORT} /home/ec2-user/airbnb-deploy/build/libs/* --username=${USER_NAME} --password=${PASSWORD} --datasource=${DATASOURCE} --KAKAO_CLIENT_ID=${KAKAO_CLIENT_ID} --GITHUB_CLIENT_ID=${GITHUB_CLIENT_ID} --GITHUB_CLIENT_SECRET=${GITHUB_CLIENT_SECRET} > /home/ec2-user/nohup.out 2>&1 &
따라서 변경된 스크립트 파일은 다음과 같다.
#!/bin/bash
CURRENT_PORT=$(cat /home/ec2-user/service_url.inc | grep -Po '[0-9]+' | tail -1)
TARGET_PORT=0
echo "> Current port of running WAS is ${CURRENT_PORT}."
if [ ${CURRENT_PORT} -eq 8081 ]; then
TARGET_PORT=8082
elif [ ${CURRENT_PORT} -eq 8082 ]; then
TARGET_PORT=8081
else
echo "> No WAS is connected to nginx"
fi
TARGET_PID=$(lsof -Fp -i TCP:${TARGET_PORT} | grep -Po 'p[0-9]+' | grep -Po '[0-9]+')
if [ ! -z ${TARGET_PID} ]; then
echo "> Kill WAS running at ${TARGET_PORT}."
sudo kill ${TARGET_PID}
fi
nohup java -jar -Dserver.port=${TARGET_PORT} /home/ec2-user/airbnb-deploy/build/libs/* > /home/ec2-user/nohup.out 2>&1 &
echo "> Now new WAS runs at ${TARGET_PORT}."
exit 0
2-2) 동적으로 환경변수 파일을 선택하는 방법
직전의 방식은 메인이 되는 application.yml 파일 안에서 정적으로 active 할 파일을 지정해주고 있다.
이번에는 딱 application-local.yml, application-test.yml 만 만든 후에, 실행할 때 다음과 같은 옵션을 주는 방식이다.
-Dspring.profiles.active=local
이렇게 사용하면 실행할때 원하는 설정파일을 선택하여 실행할 수 있다.
'BackEnd > Spring' 카테고리의 다른 글
[Spring] 예제 만들기 (0) | 2022.08.03 |
---|---|
[Spring] 스프링의 3대 요소 (IoC/DI, PSA, AOP) (8) | 2022.07.22 |
[Spring] @RequestBody에 기본생성자만 필요하고 Setter는 필요없는 이유 - 2 (10) | 2022.06.12 |
[Spring] @RequestBody에 기본생성자만 필요하고 Setter는 필요없는 이유 - 1 (7) | 2022.06.11 |
[Spring] CORS 문제 해결하기 (0) | 2022.04.26 |
댓글