어제 오늘 내일

[Spring Boot] "로컬에선 H2, 실무에선 MySQL?" 환경별 설정 관리의 정석 (Profile & YAML) 본문

IT/SpringBoot

[Spring Boot] "로컬에선 H2, 실무에선 MySQL?" 환경별 설정 관리의 정석 (Profile & YAML)

hi.anna 2026. 3. 10. 00:38

 

애플리케이션을 개발할 때 가장 골치 아픈 것 중 하나가 바로 환경(Environment) 관리입니다.

  • Local: 내 컴퓨터 (가벼운 H2 DB, 디버그 로그 콸콸)
  • Dev: 개발 서버 (팀원들과 공유하는 DB)
  • Prod: 운영 서버 (실제 서비스 DB, 로그는 에러만)

이때마다 코드를 수정해서 다시 빌드한다면? 상상만 해도 끔찍하죠. 오늘은 Spring Boot가 제공하는 강력한 설정 파일(yml) 관리와 프로파일(Profile) 기능을 완벽하게 정리해 드립니다.

 


 

1. properties vs YAML(.yml): 무엇을 써야 할까?

Spring Boot는 기본적으로 application.properties 파일을 만들어주지만, 실무에서는 90% 이상 YAML(야믈, .yml) 형식을 선호합니다. 이유는 가독성 때문입니다.

① Properties 방식 (불편함)

spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.username=sa
spring.datasource.password=

계층 구조를 점(.)으로 표현해서 중복된 단어가 너무 많습니다.

② YAML 방식 (추천!)

spring:
  datasource:
    url: jdbc:h2:mem:testdb
    username: sa
    password:

들여쓰기(Indent)로 계층을 표현해서 훨씬 깔끔하고 한눈에 들어옵니다. 단, 들여쓰기 칸 수(보통 스페이스 2칸)를 정확히 맞춰야 한다는 점만 주의하세요!

 


 

2. 환경을 나누는 마법: 프로파일(Profile)

Spring Boot는 "현재 어떤 환경(Profile)에서 실행 중인가?"에 따라 서로 다른 설정 파일을 읽어올 수 있습니다.

파일 이름 규칙

파일명 뒤에 -{profile}을 붙이면 됩니다.

  • application.yml: (기본) 모든 환경에서 공통으로 적용되는 설정
  • application-dev.yml: (개발) dev 프로파일일 때만 적용
  • application-prod.yml: (운영) prod 프로파일일 때만 적용

작동 원리 (오버라이딩)

만약 prod 프로파일로 실행하면,

  1. application.yml (기본)을 먼저 읽습니다.
  2. application-prod.yml (운영)을 읽어서 기본 설정을 덮어씁니다(Override).

즉, 공통 설정은 기본 파일에 두고, 환경별로 달라지는 DB 정보나 포트 번호만 각 파일에 따로 적으면 됩니다.

 


 

3. "지금은 dev 환경이야!"라고 알려주는 법

설정 파일을 잘 만들어도, 스프링에게 "지금 무슨 모드로 실행할지" 알려주지 않으면 소용없습니다.

application.yml에서 지정하기 (로컬 개발 시)

spring:
  profiles:
    active: dev  # 기본적으로 dev 설정을 읽어라!

② 실행 시점에 지정하기 (배포 시 ★)

서버에 배포할 때는 코드를 건드리지 않고, 실행 명령어(Jar) 뒤에 옵션을 붙여서 제어합니다.

java -jar my-app.jar --spring.profiles.active=prod

이렇게 하면 똑같은 빌드 파일(.jar)이라도 실행 옵션만 바꾸면 개발 서버용도 되고 운영 서버용도 됩니다. (Build Once, Run Anywhere!)

 


 

4. 설정값 주입받기: @Value vs @ConfigurationProperties

설정 파일에 적은 값을 자바 코드에서 쓰고 싶을 땐 어떻게 할까요?

@Value (간단한 값 하나)

@Value("${server.port}")
private int port;
  • 장점: 간단함.
  • 단점: 오타 나면 실행해봐야 암. 여러 개를 묶어서 관리하기 힘듦.

@ConfigurationProperties (강력 추천!)

설정값을 자바 클래스(Bean)로 맵핑해서 사용합니다.

@Component
@ConfigurationProperties(prefix = "my-app")
public class AppProperties {
    private String name;
    private int timeout;
    // Getter, Setter...
}
  • 장점: 타입 안정성(Type-safe) 보장, IDE 자동 완성 지원, 체계적인 관리 가능.

 


 

5. 우선순위 전쟁 (Priority)

Spring Boot는 설정값을 가져오는 곳이 정말 많습니다. 헷갈린다면 딱 이것만 기억하세요. "구체적이고 외부에서 온 설정일수록 힘이 쎄다!"

  1. CLI Arguments (실행 시 명령어 옵션) - 최강자
  2. Java System Properties (-D...)
  3. OS 환경 변수
  4. application-prod.yml (프로파일 설정)
  5. application.yml (기본 설정) - 가장 약함

따라서 서버 실행 명령어(1번)가 파일 설정(4, 5번)을 무시하고 덮어쓸 수 있는 것입니다.

 


 

마치며

오늘 배운 Profile 전략만 잘 활용해도, "어? 로컬에선 되는데 서버에선 안 되는데요?" 같은 배포 사고를 90% 이상 줄일 수 있습니다.

  1. 설정 파일은 YAML로 작성하자.
  2. application-{profile}.yml로 환경을 분리하자.
  3. 배포할 땐 --spring.profiles.active=prod 옵션을 활용하자.

다음 포스팅에서는 시스템 운영의 눈과 귀가 되어주는 로깅(Logging) 설정: System.out.println을 쓰면 안 되는 이유와 Logback 사용법에 대해 알아보겠습니다.

도움이 되셨다면 좋아요 부탁드립니다! 😊

 

반응형
Comments