본문 바로가기
스프링 (Spring)

[Spring boot] 설정 정보 외부에서 관리하기 1 - 개요

by codeyaki 2023. 3. 20.
반응형

Spring boot 설정 정보 관리하기


서버를 github를 사용해서 형상관리를 할 생각인데 레파지토리를 public으로 열어두려고 한다...

공개하게 되면 spring boot의 application.yml파일에는 아래와 같이 DB 접속 정보, API 키와 같은 공개되면 안 되는 민감정보가 포함되어 있어 위험할 수 있다고 생각이 들었다. 이것을 그대로 public 레파지토리 올리면 무수한 해킹 요청이 있을 것만 같았다.

server:
  port: 9999

spring:
  datasource:
    url: jdbc:mysql://localhost/mydb
    username: root
    password: secret

그래서 설정 정보를 갖고있는 파일을 레파지토리에 포함하지 않고 따로 관리하기 위해서는 어떤 방법이 있는지 알아보는 시간을 가져보았다.

직접 관리 해보기?

가장 먼저 떠오른 방법은 .gitignore 파일에 설정파일을 등록하고 따로 파일을 공유하며 application.yml파일을 따로 관리하는 방법이었다. 하지만 역시 가장 간단한 방법인 만큼 단점이 컸다

  • 직접 관리하는 만큼 모든 인원이 설정파일의 내용이 다를 수 있음 (동기화 X)
  • 수동으로 하나하나 관리해야 하기에 관리가 매우 불편하다. (github 레파지토리 올려서 해결 가능)

그래서 이러한 방법을 해결하기 위해서 찾아본 결과 세 가지 방법이 있음을 알 수 있었다.

  1. git의 submodule을 사용하여 설정파일을 하나의 저장소로 따로 두어 관리하는 방법
  2. github의 secrets 기능을 사용하는 방법
  3. spring cloud config 서버를 구성하여 따로 관리하는 방법

 

1. SubModule

먼저 1. git의 submodule을 사용하여 설정파일을 하나의 저장소로 따로 두어 관리하는 방법에 대해서 알아보았다

https://git-scm.com/book/ko/v2/Git-%EB%8F%84%EA%B5%AC-%EC%84%9C%EB%B8%8C%EB%AA%A8%EB%93%88

 

Git - 서브모듈

gitmodules 파일에 있는 URL은 조건에 맞는 사람이면 누구든지 Clone 하고 Fetch 할 수 있도록 접근할 수 있어야 한다. 예를 들어 다른 사람이 Pull을 하는 URL과 라이브러리의 작업을 Push 하는 URL이 서로

git-scm.com

https://www.youtube.com/watch?v=TAe4uZqYt6c 

이 방법은 간단하게 설명하자면 application.yml파일을 private 레파지토리로 따로 생성하고 프로젝트에 submodule을 통해서 resources디렉터리에 추가하는 방법이다. 직접 관리하는 방법과 마찬가지로 .ignore파일에 등록해주어야 한다. spring boot 레파지토리와 독립적으로 버전관리가 가능하고 수정 시 업데이트를 통해서 모든 개발자들이 업데이트된 설정파일을 적용시킬 수 있는 개념이다.

단점으로 생각되는 건 완전히 자동적으로 동기화가 되지 않고 적용시키는 개발자가 fetch를 통해서 업데이트를 해주어야 하는 것으로 보인다. 이는 반대로 생각해 보면 원하는 설정파일의 버전을 골라서 적용시킬 수 있으므로 어찌 보면 장점이 될 수 있다고 생각한다...

 

자세한 방법은 아래 게시글을 통해서 정리해두었다!

https://teching.tistory.com/144

 

spring boot 설정 정보 외부에서 관리하기 2 - submodule

https://teching.tistory.com/143 [spring boot 설정 정보 외부에서 관리하기 Spring boot 설정 정보 관리하기 서버를 github를 사용해서 형상관리를 할 생각인데 레파지토리를 public으로 열어두려고 한다... 공개

teching.tistory.com


2. Github Secrets 기능 사용하기

https://docs.github.com/ko/actions/security-guides/encrypted-secrets

 

암호화된 비밀 - GitHub Docs

암호화된 비밀 정보 비밀은 조직, 리포지토리 또는 리포지토리 환경에서 만드는 암호화된 변수입니다. 만든 비밀은 GitHub Actions 워크플로에서 사용할 수 있습니다. GitHub는 libsodium 봉인 상자를 사

docs.github.com

이 방법은 Github에서 제공하는 기능 중 하나인 Secrets 기능을 사용해서 설정정보를 관리하는 방법이다.

사용하기 위해서는 먼저 github 레파지토리의 setting에 들어가서 Secrests에 application.yml에 들어갈 내용을 작성해 주면 됩니다.

그 후 github action을 사용해서 application.yml을 만들어 줄 것이기 때문에 workflow를 추가한다.

여기서 핵심은 블록처리된 세줄이다. (github action을 통해 배포하기 전 application.yml을 만들어 resources 폴더에 생성하고 secrets에 만들어 두었던 application.yml의 내용을 넣어서 배포하기 전에 만들어주는 방법이다.

하지만 이 방법은 github action을 통해서 application.yml을 생성하는 방법이므로 로컬에서 사용하기 위해서는 github action을 로컬에서 테스트할 수 있도록 해주는 방법을 따로 해주어야 할 것 같다.

https://blog.burt.pe.kr/posts/skyfe79-blog.contents-980082002-post-26/

 

Github Actions 로컬 개발 환경 구성하기

Github Actions를 개발하기 위해서 로컬 개발 환경을 구성하는 일은 중요하다. 로컬 개발 환경 구성 없이 개발한다면 Github Actions를 테스트하기 위해서 매번 커밋과 푸시를 반복해야 한다. 이 글에서

blog.burt.pe.kr

https://negabaro.github.io/archive/github-action-act

 

act를 이용해 Github Action의 Workflow를 로컬환경에서 실행해보자

 

negabaro.github.io

이러한 방법과 적절히 사용하면 괜찮은 방법이 될 수 있다고 생각한다.


3. Spring config Server

마지막 세 번째 방법으로는 config 제공을 담당하는 config server를 독자적으로 운영하는 방법이다!

 

 

config server를 구현하는 방법을 적으면 글이 많이 길어질 것 같으므로 해당 방법은 다른 게시글을 통해서 정리할 생각이다.

간단하게 정리해 보자면 설정정보를 관리할 server와 설정정보들을 사용할 원래의 애플리케이션인 (client)로 나누어지게 된다.

  1. (config server) Spring cloud의 기능을 이용해서 github의 저장소에 저장되어 있는 설정정보를 가져오기 ( 이때 spring cloud가 자동으로 api를 통해서 전달할 수 있도록 만들어 준다.)
  2. (config client) application.yml에 config server의 api를 등록한 후 실행할 때 config 서버를 통해서 설정 정보를 가져와서 실행
    따라서 모든 애플리케이션은 config server 정보를 가져오는 application.yml파일만 등록해 주면 된다.

만약 application.yml도 같이 등록하려면 당연히 config server의 인바운드 설정 같은 것을 통해서 화이트리스트를 두고 우리의 애플리케이션 서버만 접근할 수 있도록 만들어 두어야 한다. (아무나 접근할 수 있도록 만들면 설정정보를 api요청해서 훔쳐갈 수 있기 때문이다.)

 

장점으로는 한번 구현해 놓으면 github의 config file만 수정하면 되므로 편하다, 모든 애플리케이션 (혹은 개발자)들이 같은 버전의 설정 정보를 사용할 수 있다는 것이다.

하지만 가장 이상적인 방법이지만 가장 치명적인 단점이 있다. 바로 리소스 비용이 생긴다는 것이다.

config server를 운영하기 위해서는 추가적인 리소스가 필요하다. 때문에 MSA로 개발해야 하는 큰 규모의 서비스이거나 자금이 넉넉한 상황이 아니면 해당방법은 어려울 수 있다고 생각한다...

반응형