Dev_Henry

[Spring] yml 설정파일 보안정보 분리하기 + 배포환경과 로컬환경 설정정보 쉽게 바꾸기 본문

Web/Spring

[Spring] yml 설정파일 보안정보 분리하기 + 배포환경과 로컬환경 설정정보 쉽게 바꾸기

데브헨리 2023. 12. 15. 20:47
728x90

스프링 프로젝트를 만들면 application.properties 혹은 yml 파일에 각종 설정 정보를 입력하게 된다.

이 정보에는 api key, db 접속정보 등 보안정보도 포함되기 때문에 그대로 Git과 같은 온라인상에 올려버리면 낭패를 겪게된다. 

이런 문제를 해결하기 위한 방법으로는 암호화 라이브러리를 사용하여 암호화하는 방법과 해당 정보를 다른 파일로 분리하고 gitignore에 추가하는 방법이 있다.

나는 정보를 다른 파일로 분리하는 방법을 사용할 것이고 git에 공개된 설정파일에서도 대략적인 코드 구성을 파악하기 쉽도록 해당 '보안데이터' 만 분리 할 것이다.

 

스프링 프로젝트를 할 때 항상 properties만 사용했는데 이번에는 yml파일을 사용해보고싶어서 처음으로 시도했고 yml에서는 설정파일을 어떻게 분리하는지 yml사용법을 찾아보던중 엄청난? 기능까지 알아버려서 내용을 블로그에 정리하려고 한다.

바로 배포환경에서 필요한 설정정보와 로컬환경에서 필요한 설정정보를 쉽게 바꾸는 방법이다.

(사실 yml으로만 할 수있는 것은 아니라 이걸 왜 이제 알았을까하는 생각이 들지만 아무튼.)

 


먼저 properties 설정파일을 사용한 이전 프로젝트에서 사용한 방법이다.

 

1. 설정파일 분리

 

2.  private 파일에 보안 데이터 입력

3. application파일에 include하고 ${}로 사용

 

위와 같이 하고 application-private파일은 gitignore에 추가하면 간단하게 보안 정보를 분리할 수 있다.

 

하지만 당시 profile기능을 몰라서 로컬환경에서 개발하고 aws에 배포를 할때마다 바뀌어야 하는 데이터들에 주석을 다는 뻘짓을 했었다.

이런 데이터가 몇개나 더있음,,

개발을 하면서 뭔가가 불편하다면 해결할 방법을 찾아보자.. 직접 구현까지 안가더라도 이미 해결법이 구현되어있을 확률이 크다.. 

미련한 과거를 반성하면서 복창합니다.

개발자의 기본소양은 구글링이다!

 

아무튼 이런 뻘짓을 하지 않으려면

환경별로 각각의 프로필을 만들어주고, 실행할때 프로필만 바꿔주면 된다.

 

application-local.properties

application-server.properties

와 같이 각각 환경에 대한 파일을 만들어주고 실행명령어를 이용하거나

application.properties에 spring.profiles.active 값으로 원하는 프로필을 적는 방식 등으로 해결할 수 있다.


다음으로 yml을 사용해보자.

 

properties같은 경우 같은 글자를 중복해서 적는 상황이 자주생기는데, yml은 계층형으로 적기때문에 중복이 줄고 보기가 편해진다.

또 배열처럼 특수한 값도 명확하게 적을 수 있는 장점이 있다.

 

yml에서 보안정보를 분리하는 방법도 위와 비슷하다.

 

1. 파일 분리

application-db.yml 파일 만들기

 

2. application-db.yml에 보안 데이터 입력

mysql:
  url : jdbc:mysql://localhost:3306/test~~
  username : idid
  password : pwpw

 

3. application.yml에 include하고 사용

spring:
  profiles:
    include: db
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: ${mysql.url}
    username: ${mysql.username}
    password: ${mysql.password}

 

이렇게 설정파일 분리는 끝이다.

그럼 이번 프로젝트도 환경 변경을 대비해 프로필을 나눠보자.

 

프로필을 분리할때 각각 다른 파일로 만들 수도 있지만, ' --- ' 를 적어 한 파일 내에서 각각 다른 프로필로 파티션을 나눌 수도 있다.

 

ex)

application-db.yml

# defalt 공통설정

--- # local
spring:
  config:
    activate:
      on-profile: "db-local"
mysql:
  url : jdbc:mysql://localhost:3306/local
  username : idid
  password : pwpw

--- # server

spring:
  config:
    activate:
      on-profile: "db-server"
mysql:
  url : jdbc:mysql://localhost:3306/server
  username : idid
  password : pwpw

 

이렇게 만들어진 프로필들은 application.yml에서 그룹으로 지정하여 사용할 수도 있다.

spring:
  profiles:
    active: # 기본구동
      - local
    group:
      local:
        - db-local
      server:
        - db-server
    include: db

 

spring.profiles.active에 디폴트로 돌릴 프로필을 적어주고 사용하면된다.

다른 프로필(server)을 사용하고 싶을때는 파일내에 active부분만 코드를 바꿔도 되고,

빌드할때는 아래의 명령어로

gradle build -Dspring.profiles.active=server

jar 실행할때는 아래의 명령어를 사용하여 바꿀수있다.

java -jar -Dspring.profiles.active=server [jar_name].jar

인텔리제이와 같은 ide에서 run configure를 통해 바꿀수도 있다.


참고

https://gaemi606.tistory.com/entry/Spring-Boot-profile%EC%84%A4%EC%A0%95

https://zzang9ha.tistory.com/415#%F0%9F%93%9D-application.yml

https://velog.io/@gloom/yml-%EC%A0%84%EB%9E%B5%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B3%A0%EC%B0%B0

 

728x90
반응형