| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 |
- SpringBoot
- html
- ArrayList
- 단위테스트
- 자바
- 테스트자동화
- Visual Studio Code
- js
- 인텔리제이
- list
- Java
- 정규식
- 자바스크립트
- string
- IntelliJ
- Array
- 스프링부트
- Eclipse
- junit5
- junit
- HashMap
- 자바문법
- math
- 배열
- CSS
- vscode
- input
- 문자열
- java테스트
- javascript
- Today
- Total
어제 오늘 내일
[Spring Boot] "로컬에선 H2, 실무에선 MySQL?" 환경별 설정 관리의 정석 (Profile & YAML) 본문
[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 프로파일로 실행하면,
application.yml(기본)을 먼저 읽습니다.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는 설정값을 가져오는 곳이 정말 많습니다. 헷갈린다면 딱 이것만 기억하세요. "구체적이고 외부에서 온 설정일수록 힘이 쎄다!"
- CLI Arguments (실행 시 명령어 옵션) - 최강자
- Java System Properties (
-D...) - OS 환경 변수
application-prod.yml(프로파일 설정)application.yml(기본 설정) - 가장 약함
따라서 서버 실행 명령어(1번)가 파일 설정(4, 5번)을 무시하고 덮어쓸 수 있는 것입니다.
마치며
오늘 배운 Profile 전략만 잘 활용해도, "어? 로컬에선 되는데 서버에선 안 되는데요?" 같은 배포 사고를 90% 이상 줄일 수 있습니다.
- 설정 파일은 YAML로 작성하자.
application-{profile}.yml로 환경을 분리하자.- 배포할 땐
--spring.profiles.active=prod옵션을 활용하자.
다음 포스팅에서는 시스템 운영의 눈과 귀가 되어주는 로깅(Logging) 설정: System.out.println을 쓰면 안 되는 이유와 Logback 사용법에 대해 알아보겠습니다.
도움이 되셨다면 좋아요 부탁드립니다! 😊
