티스토리 뷰

운영 환경의 application.yml 와 테스트 환경의 application.yml 를 분리해야 합니다.

 

왜 그래야할까요?
운영 환경과 테스트 환경의 차이를 생각해봅시다.

 

운영 환경 vs 개발 환경

운영 환경

  • 실제 고객을 대상으로 서비스를 제공한다.
  • 많은 사용자가 사용하므로 데이터의 규모가 크다.
  • 따라서 데이터를 데이터베이스 서버에 저장해야한다.

 

개발 환경

  • 개발 및 테스트를 목적으로 한다.
  • 고객이 존재하지 않으므로 데이터의 규모가 작다.
  • 따라서 데이터베이스 서버에 데이터를 저장해야한다.
  • 인메모리를 활용해도 목적을 이룰 수 있다.

 

이 외에도 여러 차이가 존재할 수 있습니다. 핵심은 두 환경의 요구사항이 다르다는 것입니다. 따라서 각 요구사항을 만족시킬 수 있는 설정 파일이 각각 필요합니다. 이 글에서는 운영 ↔︎ 개발 환경의 가장 큰 차이점을 데이터베이스라는 가정하에 application.yml 를 분리하는 방법을 소개해보겠습니다.

 

 

목차

  1. 설정 파일 분리
  2. 운영 설정 파일 작성
  3. 실행 환경(운영/개발)에 맞게 애플리케이션 실행

 

1. 설정 파일 분리

application.yml 파일을 application-dev.yml, application-prd.yml 으로 분리합니다.

개발 환경은 application-dev.yml, 운영환경은 application-prd.yml 을 사용하여 애플리케이션을 실행시킬 계획입니다.

 

그림1. application.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. 간편하게 암호화를 도와주는 사이트

 

그림4. application-prd.yml

 

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을 꼭 붙이시길 바랍니다.

 

그림6. 암호화된 설정 파일을 그대로 읽어 jdbc Driver 초기화에 실패

 

3. 실행 환경(운영/개발)에 맞게 애플리케이션 실행

일반적으로 많이 쓰는 실행 방법 두 가지를 소개하고 글을 마치겠습니다.

 

[Intellij 에서 실행]

 

1. Run > Edit Configuration > Spring Boot

  • Active profiles
    • 활성화시키고 싶은 파일을 명시합니다.
    • application-???.yml 을 설정파일로 지정하고 싶다면, "???" 을 입력하시면 됩니다.
  • Environment variables
    • 환경변수를 정의합니다.
    • Jasypt Online Encryption 사이트에서 사용했던 시크릿키를 환경변수 "JASYPT_PASSWORD"로 정의하였습니다.
그림7. Run/Debug Configration : profile 및 환경변수 설정

 

2. 오른쪽 상단 Run Configuration 에서 실행환경 선택

그림8. 실행 환경 선택

3. 실행


[커맨드라인에서 실행]

 

터미널에서 jar 파일을 실행시킬 때, -Dsping.profiles.active 옵션을 지정해야 합니다. 옵션 매개변수로 실행시키고 싶은 설정파일의 프로필을 입력합니다.

java -jar app.jar -Dspring.profiles.active=prd

 

이상으로 <운영 환경과 개발 환경의 application.yml 을 분리하자 (feat. Jasypt)> 을 마치겠습니다.

긴 글 읽어주셔서 감사합니다.

 

참고

댓글