팀 프로젝트를 진행하다 보니 설정 파일에 AWS 비밀번호, JWT secret key와 같이 중요한 정보들이 들어가게 됐다. 우리 팀은 GitHub을 이용해 소스 코드를 관리하고 있었다. 이런 중요한 정보를 GitHub에 올리면 문제가 발생할 것 같았다. 문제를 해결하기 위해 프로젝트에서 중요한 정보를 관리하는 다양한 방법에 대해 알아봤다. 그 결과 Git Submodule을 이용해 중요 정보를 관리하게 됐다. 이 과정에서 한 고민과 Git Submodule 사용 꿀팁과 주의할 점을 공유하겠다.
중요 정보 관리하는 다양한 방법
중요 정보 관리하는 방법은 크게 4가지 존재한다.
첫 번째는 Jasypt(Java Simplified Encryption)를 이용해 중요 정보를 암호화할 수 있다. 중요한 정보를 Jasypt를 이용해 암호화한 후 설정 파일에 암호화된 정보를 명시한다. 그리고 Jasypt 관련 빈을 등록해두면 애플리케이션 실행 시 입력으로 받은 비밀번호를 이용해 암호화된 정보를 복호화해 사용한다.
Jaspyt을 사용하면 편리하게 중요 정보를 암호화해 관리할 수 있다. 하지만 프로덕션 코드에 암호화 관련 설정 코드가 들어간다. 필자는 프로덕션 코드에 암호화 관련 코드를 넣고 싶지 않아 사용하지 않았다.
두 번째는 중요 정보가 있는 설정 파일을 Git으로 관리하지 않거나, 환경 변수를 이용하는 방법이 있다. 개인 프로젝트에서는 좋은 방법이지만 팀 프로젝트에서는 공유하기 번거로워 사용하지 않았다.
세 번째는 Spring Cloud Config를 이용해 중요 정보를 관리할 수 있다. 하지만 Spring Cloud Config는 MSA 프로젝트에서 사용하기 적합한 기술이다. 필자의 프로젝트는 모노리틱 프로젝트였기 때문에 사용하지 않았다.
네 번째는 Git Submodule을 이용해 중요 정보를 관리할 수 있다. Git Submodule을 사용하면 추가적인 코드 없이 팀원들과 중요 정보를 편리하게 공유할 수 있어 Git Submodule을 사용하기로 했다.
Git Submodule ?
Git Submodule은 Git 저장소 안에 다른 Git 저장소를 디렉터리로 분리해 넣을 수 있게 해준다. 덕분에 다른 독립된 Git 저장소를 Clone 해서 내 Git 저장소 안에 포함할 수 있으며 각 저장소의 커밋은 독립적으로 관리할 수 있다.
이런 원리를 이용해 중요 정보를 관리하는 Git 저장소를 만들고 팀 프로젝트에서 중요 정보를 관리하는 Git 저장소를 디렉터리로 분리해 넣을 수 있다. 이때 중요 정보를 관리하는 Git 저장소의 접근 권한을 팀원에게만 부여하면 중요 정보를 안전하게 관리할 수 있다.
Git Submodule 꿀팁
필자가 Git Submodule을 이용하면서 알게 된 꿀팁에 대해 이야기하겠다.
Git Submodule을 프로젝트에 적용하는 방법은 좋은 글들이 많아 자세히 다루지는 않겠다. (참조)
필자는 중요 정보를 관리하는 Git 저장소를 만들고, 그곳에서 모든 설정 파일을 관리했다.
secrets (저장소 이름)
application-aws.yml
application-jwt.yml
...
Git Submodule을 적용할 때 프로젝트 어느 곳에 위치해야 Spring Boot를 실행할 때 추가 설정 없이 사용할 수 있는지 찾아봤다.
스프링 공식 문서를 확인해 보면 classpath root의 config 이름으로 Git Submodule을 설정하면 Spring Boot가 외부 설정 파일을 자동으로 읽음을 알 수 있다. 따라서 필자는 classpath root에 config 이름으로 Git Submodule을 설정했다.
git submodule add {git submodule uri} config
위와 같이 Git Submodule을 설정하면 프로젝트 실행 시 특별한 설정을 하지 않아도 Spring Boot가 설정 파일을 읽어준다.
Git Submodule 주의점!!
Git Submodule을 사용하면서 CI - CD 구축 과정에서 이슈가 있었다.
Jar을 만들 때 Git Submodule 설정 파일들이 포함되지 않았다. 따라서 필자와 같은 위치에 Git Submodule을 사용한다면 설정 파일을 Jar에 추가하기 위해 Build Script를 추가로 작성해 줘야 한다.
task copyProperty(type: Copy) {
from file('./config')
into file('./src/main/resources')
}
processResources {
dependsOn copyProperty
}
간략하게 설명하자면 Jar 만들기 전에 Git Submodule에 있는 설정 파일들을 ./src/main/resources로 복사해 줬다.
마무리
중요 정보를 관리하는 방법에 대해 찾아보고 그 중 Git Submodule을 이용해 중요 정보를 관리했다. 중요 정보 관리 기법은 상황에 맞는 적절한 기술을 사용하면 될 것 같다. 만약 Git Submodule을 사용하게 된다면 꿀팁과 주의사항을 참고해 필자가 겪은 시행착오 없이 Git Submodule을 도입할 수 있길 바란다.