실전 고수 팁 — 환경별 프로필(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)"는 소스코드 내부가 아닌, 운영 서버의 실제 환경 변수에만 존재하도록 관리해야 안전한 보안 설계가 완성됩니다.