SOFTMOA TECHNOLOGY

Spring Profile로 환경별 설정 관리

소프트모아가 정리한 기술 기록입니다.

Contents
작성일 2025. 11. 30.

Spring 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
Share this

Spring

Have a questions?

견적 및 기술문의

mobile : 010-7931-4813

Contact Form