본문으로 건너뛰기

2.6 실전 고수 팁 — 환경별 프로필(Profile) 전략과 민감 정보 관리

1. 환경별 프로필(Profile) 분리 아키텍처​

로컬 개발 환경, 테스트(QA) 환경, 실제 운영(Production) 환경에서는 각각 다른 데이터베이스와 설정값을 사용해야 합니다. 스프링 부트는 파일 분리를 통해 이를 아주 깔끔하게 지원합니다.

가장 대중적인 실무 파일 구조는 다음과 같습니다:

src/main/resources/
├── application.yml (공용 기본 설정 및 활성 프로필 선언)
├── application-local.yml (로컬 H2/디버그 로깅 설정)
├── application-dev.yml (개발계 DB, 통합 테스트 환경)
└── application-prod.yml (운영계 DB, 에러 로깅, 높은 커넥션 풀 설정)

application.yml에서 실행 프로필을 지정합니다:

spring:
profiles:
active: local

2. 배포 시 프로필 덮어쓰기​

보통 소스 코드(application.yml)의 active 값을 매번 바꾸지 않고, 애플리케이션을 구동하는 시점에 환경 변수(Environment Variable) 나 커맨드 라인 인수로 주입합니다. 우선순위상 이 값들이 yml 파일보다 높기 때문에 덮어씌워집니다.

컨테이너/서버 시작 스크립트 예제:

# 옵션 1: JVM 아규먼트
java -jar -Dspring.profiles.active=prod myapp.jar

# 옵션 2: 환경 변수 (Docker, OS 등에서 가장 널리 쓰임)
export SPRING_PROFILES_ACTIVE=prod
java -jar myapp.jar

3. Jasypt를 이용한 민감 정보(비밀번호, 키) 암호화​

DB 비밀번호, AWS Secret Key 등을 평문으로 GitHub에 올리면 치명적인 보안 사고가 유발됩니다. 실무 팀에서는 흔히 Jasypt(Java Simplified Encryption) 라이브러리를 통해 application.yml의 값을 암호화하여 저장합니다.

spring:
datasource:
# Jasypt로 암호화 된 패스워드 (ENC() 포맷)
password: ENC(Zf9P4n+lR42m...)

이 암호문을 복호화할 때 쓰이는 "Master Password(혹은 Jasypt Encryptor Password)"는 소스코드 내부가 아닌, 운영 서버의 실제 환경 변수에만 존재하도록 관리해야 안전한 보안 설계가 완성됩니다.