일반적으로 application.yml 혹은 application.properties 는 백엔드 application을 만들 때 필요한 설정파일이다.
백엔드 application을 만들 때는 수많은 설정이 필요하다 :
이런 설정들을 코드에 하드코딩하면 안 되는 이유:
// ❌ 나쁜 예: 코드에 직접 작성
String dbUrl = "jdbc:mysql://localhost:3306/mydb";
String username = "admin";
String password = "password123";
문제점들:
application.yml 과 application.properties 는 이런 설정들을 코드 밖으로 분리한 설정 파일이다.
Spring Boot에서는 application.propeties와 application.yml 이 두 가지 형식을 지원한다.
server.port=8080
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=admin
spring.datasource.password=password
spring.jpa.hibernate.ddl-auto=update
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: admin
password: password
jpa:
hibernate:
ddl-auto: update
YAML의 장점:
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args); // 여기서 시작!
}
}
Spring Boot는 다음 순서로 설정 파일을 찾는다 :
# application.yml
server:
port: 9000
spring:
datasource:
url: jdbc:h2:mem:testdb
Spring Boot가 이 설정을 읽고:
# application.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/myapplication
username: user
password: password
driver-class-name: com.mysql.cj.jdbc.Driver
Spring Boot가 하는 일:
jdbc:mysql://localhost:3306/myshop에 연결 시도user/password로 로그인server:
port: 8090
결과:
http://localhost:8090으로 접속 가능모든 환경에서 같은 설정 파일을 쓸 수는 없다.
방법 1: 하나의 파일에서 구분
# 기본 설정
spring:
application:
name: myapplication
---
# 개발 환경
spring:
config:
activate:
on-profile: dev
datasource:
url: jdbc:mysql://localhost:3306/myapplication_dev
---
# 테스트 환경
spring:
config:
activate:
on-profile: test
datasource:
url: jdbc:h2:mem:testdb
---
# 운영 환경
spring:
config:
activate:
on-profile: prod
datasource:
url: jdbc:mysql://prod-server:3306/myapplication_prod
방법 2: 파일 분리
src/main/resources/
├── application.yml # 공통 설정
├── application-dev.yml # 개발 환경
├── application-test.yml # 테스트 환경
└── application-prod.yml # 운영 환경
1. IDE에서 실행 시:
Program arguments: --spring.profiles.active=dev
2. JAR 실행 시:
java -jar myapp.jar --spring.profiles.active=prod
3. 환경변수로:
export SPRING_PROFILES_ACTIVE=test
server:
port: 8080 # 서버 포트
servlet:
context-path: /api # 기본 경로 (모든 URL 앞에 /api 붙음)
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb # DB 연결 주소
username: user # DB 사용자명
password: pass # DB 비밀번호
driver-class-name: com.mysql.cj.jdbc.Driver # JDBC 드라이버
spring:
jpa:
hibernate:
ddl-auto: update # 테이블 자동 생성/수정 방식
show-sql: true # SQL 쿼리 콘솔 출력
properties:
hibernate:
format_sql: true # SQL 포맷팅
ddl-auto 옵션들:
create: 시작할 때마다 테이블 새로 생성 (기존 데이터 삭제)create-drop: 시작 시 생성, 종료 시 삭제update: 테이블 구조만 업데이트 (데이터 유지)validate: 엔티티와 테이블 구조 일치 확인만none: 아무것도 하지 않음logging:
level:
com.mycompany.myapp: DEBUG # 우리 패키지는 상세히
org.springframework: INFO # Spring은 기본 정보만
org.hibernate.SQL: DEBUG # SQL 쿼리 보기
로그 레벨들:
ERROR: 에러만WARN: 경고 이상INFO: 정보 이상 (기본값)DEBUG: 디버그 정보까지TRACE: 모든 정보# application-dev.yml
spring:
datasource:
url: jdbc:h2:mem:devdb
jpa:
hibernate:
ddl-auto: create-drop # 매번 새로 생성
show-sql: true # SQL 보기
h2:
console:
enabled: true # H2 콘솔 사용
logging:
level:
com.mycompany: DEBUG # 상세한 로그
# application-test.yml
spring:
datasource:
url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1
jpa:
hibernate:
ddl-auto: create-drop
test:
database:
replace: none
logging:
level:
org.springframework.test: DEBUG
# application-prod.yml
spring:
datasource:
url: jdbc:mysql://db-server:3306/production
hikari: # 커넥션 풀 설정
maximum-pool-size: 20
jpa:
hibernate:
ddl-auto: validate # 검증만! 운영에서는 위험
show-sql: false # 성능을 위해 SQL 출력 끔
logging:
level:
root: WARN # 운영에서는 경고 이상만
com.mycompany: INFO
YAML 문법 엄격함
# ❌ 잘못된 예
spring:
datasource: # 들여쓰기 틀림
url: jdbc:mysql://localhost
# ✅ 올바른 예
spring:
datasource: # 2칸 들여쓰기
url: jdbc:mysql://localhost
민감정보 관리
# ❌ 절대 하지 말 것
spring:
datasource:
password: mySecretPassword123 # Git에 올라감!
# ✅ 환경변수 사용
spring:
datasource:
password: ${DB_PASSWORD} # 환경변수에서 읽음
spring:
datasource:
# 로컬 개발용 H2 데이터베이스 - 재시작해도 데이터 유지
url: jdbc:h2:file:./data/devdb;DB_CLOSE_DELAY=-1
username: sa
password:
jpa:
hibernate:
# 개발 중에는 테이블 자동 업데이트
ddl-auto: update
# 개발자가 SQL 확인할 수 있도록 출력
show-sql: true
application.yml은 Spring Boot 애플리케이션의 설정 핵심이다: