티스토리 뷰
운영 환경의 application.yml 와 테스트 환경의 application.yml 를 분리해야 합니다.
왜 그래야할까요?
운영 환경과 테스트 환경의 차이를 생각해봅시다.
운영 환경 vs 개발 환경
운영 환경
- 실제 고객을 대상으로 서비스를 제공한다.
- 많은 사용자가 사용하므로 데이터의 규모가 크다.
- 따라서 데이터를 데이터베이스 서버에 저장해야한다.
개발 환경
- 개발 및 테스트를 목적으로 한다.
- 고객이 존재하지 않으므로 데이터의 규모가 작다.
- 따라서 데이터베이스 서버에 데이터를 저장해야한다.
- 인메모리를 활용해도 목적을 이룰 수 있다.
이 외에도 여러 차이가 존재할 수 있습니다. 핵심은 두 환경의 요구사항이 다르다는 것입니다. 따라서 각 요구사항을 만족시킬 수 있는 설정 파일이 각각 필요합니다. 이 글에서는 운영 ↔︎ 개발 환경의 가장 큰 차이점을 데이터베이스라는 가정하에 application.yml 를 분리하는 방법을 소개해보겠습니다.
목차
- 설정 파일 분리
- 운영 설정 파일 작성
- 실행 환경(운영/개발)에 맞게 애플리케이션 실행
1. 설정 파일 분리
application.yml 파일을 application-dev.yml, application-prd.yml 으로 분리합니다.
개발 환경은 application-dev.yml, 운영환경은 application-prd.yml 을 사용하여 애플리케이션을 실행시킬 계획입니다.
2. 운영 설정 파일 작성
운영 설정 파일(application-prd.yml)은 암호화가 필요합니다. 반면에 개발 환경의 설정 파일은 암호화할 필요가 없습니다. 두 설정 파일을 분리하는 이유 중 하나입니다.
프로젝트의 코드를 관리하기 위해 Git을 많이 이용하실 겁니다. 운영 설정 파일의 설정 변수들은 외부로 노출되면 안되는 보안상 중요한 정보입니다. 예를 들면 데이터소스의 아이디, 비밀번호 같은 정보가 GitHub에 올라간다면 정말 큰일나겠죠. 그래서 암호화를 해야합니다.
Jasypt(Java Simplified Encryption)
암호화를 도와주는 도구입니다. 공식 홈페이지 http://www.jasypt.org/ 에서 자세한 내용을 확인하실 수 있습니다. Jasypt 라이브러리를 이용하여 application-prd.yml 파일을 암호화하겠습니다.
1. Dependency 추가
Jasypt 라이브러리를 사용하기 위해 의존성을 추가합니다. maven 저장소에서 확인하실 수 있습니다.
https://mvnrepository.com/artifact/com.github.ulisesbocchio/jasypt-spring-boot-starter
//build.gradle
dependencies {
implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.4'
}
2. 운영 설정 파일 - 중요 정보 암호화
설정 파일의 민감한 정보를 Jasypt Online(https://www.devglan.com/online-tools/jasypt-online-encryption-decryption)에서 간편하게 암호화할 수 있습니다. 그림3을 참조해 설정파일의 값들을 암호한 후, 설정파일의 값들을 수정합니다. 단, ENC() 블록으로 감싸서 암호화된 값임을 애플리케이션이 알 수 있도록 해야합니다.
3. 복호화 클래스 작성
애플리케이션이 시작되면서 암호화된 설정 파일(application-prd.yml)의 ENC() 블록으로 감싸있는 값을 복호화합니다. 복호화할 때 필요한 정보는 별도의 클래스에 정의해야 합니다. 먼저 복호화 키를 지정해주어야 합니다. 키를 환경변수 "JASYPT_PASSWORD"로부터 가져올 수 있도록 정의하겠습니다.
@Configuration
@EnableEncryptableProperties
public class JasyptConfiguration {
@Bean("jasyptStringEncryptor")
public StringEncryptor stringEncryptor() {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimplePBEConfig config = new SimplePBEConfig();
config.setPassword(System.getenv("JASYPT_PASSWORD"));
config.setAlgorithm("PBEWithMD5AndDES");
config.setKeyObtentionIterations("1000");
config.setPoolSize("1");
config.setProviderName("SunJCE");
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
config.setIvGeneratorClassName("org.jasypt.iv.NoIvGenerator");
encryptor.setStringOutputType("base64");
encryptor.setConfig(config);
return encryptor;
}
}
@EnableEncryptableProperties 은 Jasypt 라이브러리가 제공하는 애노테이션입니다. 이 애노테이션이 붙은 클래스가 암호화된 proerties 를 복호화하는 클래스임을 정의하는 애노테이션입니다. 만약 이 애노테이션을 붙이지 않는다면, 애플리케이션이 시작할 때 암호화된 preperties를 복화하지 않고 그대로 읽어들이게 됩니다. 저는 이부분을 깜빡 놓쳐서 애플리케이션이 암호화된 jdbcUrl에 접속하려고 시도하는 바람에 RuntimeException이 발생했습니다. 복호화 클래스 앞에@EnableEncryptableProperties을 꼭 붙이시길 바랍니다.
3. 실행 환경(운영/개발)에 맞게 애플리케이션 실행
일반적으로 많이 쓰는 실행 방법 두 가지를 소개하고 글을 마치겠습니다.
[Intellij 에서 실행]
1. Run > Edit Configuration > Spring Boot
- Active profiles
- 활성화시키고 싶은 파일을 명시합니다.
- application-???.yml 을 설정파일로 지정하고 싶다면, "???" 을 입력하시면 됩니다.
- Environment variables
- 환경변수를 정의합니다.
- Jasypt Online Encryption 사이트에서 사용했던 시크릿키를 환경변수 "JASYPT_PASSWORD"로 정의하였습니다.
2. 오른쪽 상단 Run Configuration 에서 실행환경 선택
3. 실행
[커맨드라인에서 실행]
터미널에서 jar 파일을 실행시킬 때, -Dsping.profiles.active
옵션을 지정해야 합니다. 옵션 매개변수로 실행시키고 싶은 설정파일의 프로필을 입력합니다.
java -jar app.jar -Dspring.profiles.active=prd
이상으로 <운영 환경과 개발 환경의 application.yml 을 분리하자 (feat. Jasypt)> 을 마치겠습니다.
긴 글 읽어주셔서 감사합니다.
참고
'좌충우돌 프로젝트 이야기' 카테고리의 다른 글
롤문철 닷컴 구현기 2탄: 로그인 기능 구현 (JWT vs Session) (0) | 2023.07.02 |
---|---|
CI/CD 파이프라인 구축(2) [Spring Boot, Jenkins, Naver Cloud] - 테스트 커버리지를 강제하는 CI 파이프라인 구축 (1) | 2023.06.17 |
CI/CD 파이프라인 구축(1) [Spring Boot, Jenkins, Naver Cloud] - CI/CD의 개념 (0) | 2023.06.17 |
함수형 프로그래밍을 재고 처리 로직에 적용해보기 (0) | 2023.05.02 |
Security Filter 는 @Bean 으로 등록하지 말자 (0) | 2023.04.24 |
- Total
- Today
- Yesterday
- Spring Application 서버 실행
- NHN 면접
- java 로그인
- T 인터뷰
- NHN 엔터프라이즈
- CI/CD
- Jenkins
- 데이터베이스 동시성
- application.properties 분리
- F-LAB
- 회고
- 배열리스트
- HTTP 완벽 가이드
- NHN 엔터프라이즈 면접
- 분산락
- 비관적락
- Docker 자동화 배포
- JWT 토큰
- 디지털 청년 고민 해결단
- 랠릿
- 낙관적락
- CI/CD 파이프라인
- GitHub Webhook
- 디지털 청년 고민 해결단 온라인 멘토링
- application.yml 분리
- C 인터뷰
- 동시성 이슈
- CD 파이프라인 구축
- 개발자 면접
- 더미데이터 생성
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |