Contents
see ListSpring Profile로 환경별 설정 관리
Spring Profile을 사용하면 개발, 테스트, 운영 환경별로 다른 설정을 적용할 수 있습니다.
언제 사용하나요?
- 환경별 데이터베이스 접속 정보 분리
- 개발/운영 환경별 로그 레벨 설정
- 환경별 외부 API 엔드포인트 변경
- 테스트 환경에서 Mock 서비스 사용
프로파일 설정 방법
1. application.yml 분리
# application.yml (공통)
spring:
profiles:
active: local # 기본 프로파일
# application-local.yml (로컬 개발)
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: 1234
logging:
level:
root: DEBUG
# application-dev.yml (개발 서버)
spring:
datasource:
url: jdbc:mysql://dev-db:3306/mydb
username: dev_user
password: dev_pass
# application-prod.yml (운영)
spring:
datasource:
url: jdbc:mysql://prod-db:3306/mydb
username: prod_user
password: ${DB_PASSWORD} # 환경변수2. properties 파일 분리
application.properties
application-local.properties
application-dev.properties
application-prod.properties프로파일 활성화 방법
# 1. application.yml에서 설정
spring:
profiles:
active: local
# 2. JVM 옵션
java -jar app.jar -Dspring.profiles.active=prod
# 3. 환경변수
export SPRING_PROFILES_ACTIVE=prod
# 4. 프로그램 인자
java -jar app.jar --spring.profiles.active=prod
# 5. @ActiveProfiles (테스트)
@SpringBootTest
@ActiveProfiles("test")
class MyTest { }프로파일별 Bean 등록
// 특정 프로파일에서만 빈 생성
@Configuration
@Profile("local")
public class LocalConfig {
@Bean
public DataSource dataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2)
.build();
}
}
@Configuration
@Profile("prod")
public class ProdConfig {
@Bean
public DataSource dataSource() {
HikariDataSource ds = new HikariDataSource();
ds.setJdbcUrl("jdbc:mysql://prod-db:3306/mydb");
return ds;
}
}
// 여러 프로파일 지정
@Profile({"local", "dev"})
// 특정 프로파일이 아닐 때
@Profile("!prod")프로파일 조건부 설정
@Service
public class EmailService {
@Autowired
private EmailSender emailSender;
}
@Component
@Profile("prod")
public class RealEmailSender implements EmailSender {
public void send(String to, String content) {
// 실제 이메일 발송
}
}
@Component
@Profile({"local", "dev"})
public class MockEmailSender implements EmailSender {
public void send(String to, String content) {
log.info("Mock email to: {}", to);
// 로그만 출력
}
}프로파일 그룹 (Spring Boot 2.4+)
# application.yml
spring:
profiles:
group:
production:
- prod
- prod-db
- prod-security
development:
- dev
- dev-db
# 사용
java -jar app.jar --spring.profiles.active=production프로파일별 yml 섹션 (하나의 파일)
# application.yml
spring:
profiles:
active: local
server:
port: 8080
---
spring:
config:
activate:
on-profile: local
datasource:
url: jdbc:h2:mem:testdb
---
spring:
config:
activate:
on-profile: prod
datasource:
url: jdbc:mysql://prod-db:3306/mydb현재 프로파일 확인
@Component
public class ProfileChecker {
@Autowired
private Environment environment;
public void printActiveProfiles() {
String[] profiles = environment.getActiveProfiles();
log.info("Active profiles: {}", Arrays.toString(profiles));
}
}
// 또는
@Value("${spring.profiles.active:default}")
private String activeProfile;프로파일별 로깅 설정
# application-local.yml
logging:
level:
root: DEBUG
com.myapp: TRACE
org.springframework: INFO
org.hibernate.SQL: DEBUG
# application-prod.yml
logging:
level:
root: WARN
com.myapp: INFO
file:
name: /var/log/myapp/app.log주의사항
- 운영 환경 비밀번호는 환경변수나 Vault 사용
- 프로파일 파일은 형상관리에 포함 (단, 운영 비밀정보 제외)
- 로컬 개발 시 ${HOME}/.spring-boot-devtools.properties 활용 가능
- 기본값 설정: ${DB_PASSWORD:default_password}
디버깅 팁
# 어떤 설정이 적용되었는지 확인
java -jar app.jar --debug
# 설정 출력
logging:
level:
org.springframework.boot.context.config: TRACE