BackEnd/Spring

[Spring] Spring 환경변수 설정파일 선택하기

샤아이인 2022. 6. 12.

 

이번 글은 프로젝트를 진행하면서 문제가 됬었던 부분을 정리, 요약 하는 글 입니다. 

(미래의 나를 위해!)

 

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}
  1. password: ${password} 같이 yml 설정파일에 지정후
  2. 리눅스 환경변수 로 해당 값들을 설정해준다.
  3. 스크립트 상에서 실행할때 환경변수의 비밀번호를 찾아와서 커맨드로 추가한다.

 

우선 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. 해결 과정

우선 참고한 글은 다음과 같다.

https://stackoverflow.com/questions/35531661/using-env-variable-in-spring-boots-application-properties

 

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

이렇게 사용하면 실행할때 원하는 설정파일을 선택하여 실행할 수 있다.

댓글