본문 바로가기
Framework & Lib & API/스프링

스프링 개발 배포 운영 환경설정 파일 관리(spring.profiles.active)

by 코딩공장공장장 2022. 11. 21.

운영, 개발, 로컬 환경과 같이 운영체제 또는 실행환경에 따라 설정파일 속성이 다르게 적용되어야 하는 경우

 

스프링 부트에서는 spring.profiles.active 속성으로 각기 다르게 적용시킬 수 있습니다.

 

어려운 기능이 아니니 사용법에 위주로 빠르게 설명을 하겠습니다.

 

실행환경은 로컬 (windows), 운영(aws ec2 linux)으로 구분하였으며 

 

환경설정파일은 application.properties 기준으로 진행했습니다.

(*.yml은 yml 문법에 맞게 적용시키면 됩니다.)

 

 

 

스프링 부트는 기본적으로 applicaion.properties에 프로젝트 속성을 설정합니다.

 

로컬, 운영 두가지 서버에서 실행하므로 

 

로컬 환경은 application-local.properties라는 파일을 생성하여 로컬에서 적용될 속성을 입력하고

 

운영환경은 application-prod.properties라는 파일을 생성하여 운영서버에서 적용될 속성을 입력했습니다.

 

또한 두 환경에서 모두 공통적으로 적용될 속성들도 있기 때문에 각각에 모두 입력하기에는 

 

번거롭고 실수할 수도 있기 때문에 default로 모두 적용될 속성을 application.properties파일에 정의 하였습니다.

 

 

이렇게 세가지  properties 파일을 만들었는데

 

application.properties             [어느 환경에서도 공통적으로 적용될 속성 정의]

application-local.properties    [로컬 환경에서만 적용될 속성]

application-prod.properties    [운영 환경에서만 적용될 속성]

 

각 파일의 사용목적은 위와 같습니다.

 

여기서 local이나 prod 같은 명칭은 사용자께서 원하는 이름으로 바꾸셔도 상관없습니다.

 

application-local.properties이나 application-prod.properties와 같이 application-[프로필명].properties로 파일을 작성하면

 

스프링부트에서 알아서 프로필명을 인식합니다.

 

우리는 실행환경에 맞게 local인지 prod인지만 실행단계에서 알려주면 됩니다.

 

 

로컬에서 이클립스를 통한 실행방법

 

아래와 같이 Boot DashBoard에서 실행하는 프로젝트에 마우스 우클릭 후 Open Config를 눌러줍니다.

 

 

 

 

그런 다음 첫화면에 보여지는 탭화면에서  프로필 칸에서 콤보박스를 열어보면 

 

우리가 이전에 application-local.properties와 application-prod.properties 파일을 만들어 놓았기 때문에

 

local과 prod 값이 보일 것입니다. 

 

로컬에서 테스트하는 중이므로 로컬을 선택해주시면 됩니다.

 

 

 

 

그런 다음 apply버튼을 눌러주고 실행하면

 

default로 공통 적용될 파일인 application.properties와 application-local.properties에 적용된 속성 값들이 적용되어

 

프로젝트가 실행 될 것입니다.

 

 

운영(aws ec2 linux)에서 실행방법

 

운영서버에서는 명령어를 통해 프로젝트를 실행하므로 프로젝트 실행 명령어에  옵션을 추가해주면 됩니다.

 

java -jar -Dspring.profiles.active=prod  [jar파일 경로]/[jar파일 이름] &

 

위와 같이 -D 옵션을 통해 -Dspring.profiles.active=prod라고 입력하여 실행하여주면

 

application.properties파일과 application-prod.properties 파일이 적용되어 실행이 됩니다.

 

 

 

*.properties 파일에 적용될 속성값을 옵션으로 넣는법

 

스프링 부트 properties 파일에 db 접속 아이디와 비밀번호, jwt secret key와 같이

 

여러명이 같이 개발을 하더라고 프로젝트 관리자만 알고 있어야 하는 정보를 소스에 집어넣는 것은

 

보안상에 좋은 방법이 아닐 수 있으므로 properties 파일에 적지 않고

 

옵션으로 실행단계에 적용시킬 수 있습니다.

 

세 가지 방법이 있는데

 

spring.datasource.username
spring.datasource.password

mycustom.jwtSecretKey

 

속성을 옵션으로 적용시킨다는 가정하에 위 속성들로 예시를 들겠습니다.

 

1. 속성과 값을 한번에 입력하는 방법

로컬에서 사용방법

 

이전에 사용했던것과 같이 프로젝트 실행 아이콘에서 마우스 우클릭 후 open config 를 클릭한 후

 

Arguments 탭을 클릭하고 vm arguments 탭에 아래와 같이 입력합니다.

 

-D 옵션으로 spring.datasource.username, spring.datasource.password, mycustom.jwtSecretKey 속성의 값을 함께 넣어줍니다.

 

spring.datasource.username, spring.datasource.password 속성은 스프링 부트에서 db에 연결하는 속성인데

 

mycustom.jwtSecretKey 속성은 제가 임의로 만든 속성입니다.

 

프로그래밍 환경에서 해당 속성을 가져와서 사용할 때는

 

빈으로 등록되어있는 클래스의 필드에

@Value("${mycustom.jwtSecretKey}")
private String secretKey;

위와 같이 @Value 어노테이션으로 값을 의존주입하여 사용할 수 있습니다.

 

운영에서 사용방법

java -jar -Dspring.profiles.active=prod \
          -Dspring.datasource.username=root \
          -Dspring.datasource.password=1111\
          -Dmycustom.jwtSecretKey=mySecretKey [jar파일 경로]/[jar파일 이름] &

 

 

이 방식은 속성과 값을 properties파일에 적지 않아 옵션을 숨길 수 있지만 내가 어떤 속성을 입력했는지

 

실행 명령어나 vm argument를 직접 찾아봐야하기 때문에 속성이 한 파일에서 관리되지 않는 단점이 있습니다.

 

 

2. *.properties파일에 속성을 정의하고 값은 실행 단계에서 주입

 

application-local.properties와 application-prod.properties 파일에

 

spring.datasource.username=${db_username}
spring.datasource.password=${db_passwd}
mycustom.jwtSecretKey=${my_secret_key}

 

위와 같이 입력후 실행단게에 변수 값을 입력할 수 있습니다.

 

로컬에서 사용방법

이전에서 설명했던것과 동일하게 vm arguments 탭에

-Ddb_username=root
-Ddb_passwd=1111
-Dmy_secret_key=mysecretkey

라고 입력하고 실행합니다.

 

운영에서 사용방법

java -jar -Dspring.profiles.active=prod \
          -Ddb_username=root \
          -Ddb_passwd=1111\
          -Dmy_secret_key=mysecretkey [jar파일 경로]/[jar파일 이름] &

 

 

위 방법의 장점은 properties 파일에 내가 정의한 속성이 무엇이 있는지 모두 확인 가능하고

 

속성값만 실행단계에서 주입시키므로 속성값을 소스에서 숨길 수 있는 장점이 있습니다.

 

 

 

3. 시스템 환경변수로 주입

 

리눅스에서 환경변수 설정

export secret_key=myseretkey

자바 소스코드에서 접근

String scretKey = System.getProperty("secret_key");

 

시스템 환경변수로 주입하는 방법으로 properties 파일에 접근하는 것은 테스트 해보지 않았습니다.

 

시스템 환경변수로 접근하는 방식은 속성들이 한개의 파일에서 관리되지 않고

 

중구난방으로 자바 소스코드에서 각각 접근할 수 있어 속성관리가 제대로 될거 같지 않아

 

저는 이 방식에 대해서는 깊게 테스트를 안해보았습니다.

 

환경변수 파일을 하나 만들어 접근 할 수도 있지만 결국 로컬, 운영에서 또 파일관리가 따로 이루어져야 할 것 같아

 

시도 하지 않았습니다.

 

필요한 목적에 맞는다면 이 방식으로 테스트 후 고려하는 것도 괜찮을 것 같습니다.

 

 

 

+++++참고+++++

실서버 구현 중 발생 에러

 

contextLoads() FALIED error

 

운영에서 테스트 중 위와 같은 에러로 빌드가 계속 실패하였는데

 

프로젝트명ApplicationTests.java 파일의 @SpringBootTest 어노테이션을 주석처리하거나

 

test 폴더 하위에 *.properties 파일을 두시면 해결 될 것입니다.

반응형