[SpringBoot] application.properties, application.yml
by 핫도구오늘은 애플리케이션의 모든 설정을 관리하는 application.properties, application.yml에 대해 알아 볼 예정이다.
이 둘(application.properties, application.yml)은 같은 역할을 하고 있는데 SpringBoot 애플리케이션의 설정을 관리하며 서버 포트, 데이터베이스 연결 정보, 로깅 레벨 등 애플리케이션 실행에 필요한 모든 설정을 담고 있다.
application.properties vs application.yml
application.properties, application.yml이 필요한 이유는 알겠는데 왜 두개가 존재하는지 의문일 수 있다. 이 둘은 크게 형식이 차이가 있다. application.properties는 단순하고 직관적인 반면 중복이 많기 때문에 계층 파악이 어렵다. application.yml은 계층구조가 명확하고 중복이 없는 반면에 들여쓰기를 꼭 해야 하며 문법 오류 가능성이 존재한다. 사실 이렇게 말로하기 보다 아래의 코드를 직접 보는것이 훨씬 좋다. 아래는 application.properties와 application.yml이 각각 나타난다.
# 서버 설정
server.port=8080
server.servlet.context-path=/api
# 데이터베이스 설정
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=1234
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# JPA 설정
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
# 서버 설정
server:
port: 8080
servlet:
context-path: /api
# 데이터베이스 설정
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: 1234
driver-class-name: com.mysql.cj.jdbc.Driver
# JPA 설정
jpa:
hibernate:
ddl-auto: update
show-sql: true
properties:
hibernate:
format_sql: true
이 둘이 같은 내용이지만 다르게 표현되는 것을 한 눈에 볼 수 있다. 이를 간단하게 표로 비교해 보면 아래와 같다.
| 구분 | application.properties | application.yml |
| 장점 | - 단순하고 직관적 - 오류 가능성 낮음 - 레거시 효환성 |
- 계층 구조 명확 - 중복 제거 - 가독성 우수 |
| 단점 | - 중복이 많음 - 계층 구조 파악이 어려움 |
- 문법 오류 가능성 |
필수 설정 항목
여기에서는 기본적으로 application.yml을 기반으로 설명 할 예정이다. 필수적으로 설정할 항목들은 서버, 데이터베이스, JPA 설정, 로깅 설정 등이 존재한다. 이제 차례대로 각각의 설정코드와 그 설명에 대한 설명은 아래와 같다.
server:
port: 8080 // 서버 포트 (기본: 8080)
servlet:
context-path: /api // 애플리케이션 컨텍스트 경로
encoding:
charset: UTF-8 // 응답 인코딩
enabled: true
force: true
error:
include-message: always // 에러 응답에 메시지 포함
include-stacktrace: never // 운영환경에서는 never
compression:
enabled: true // 응답 압축 활성화
mime-types: text/html,text/css,application/json
min-response-size: 1024 // 최소 압축 크기
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=Asia/Seoul
username: root
password: ${DB_PASSWORD} // 환경변수 사용
driver-class-name: com.mysql.cj.jdbc.Driver
// HikariCP 설정 (Connection Pool)
hikari:
maximum-pool-size: 10 // 최대 커넥션 수
minimum-idle: 5 // 최소 유휴 커넥션
idle-timeout: 300000 // 유휴 타임아웃 (5분)
connection-timeout: 30000 // 연결 타임아웃 (30초)
max-lifetime: 1800000 // 최대 수명 (30분)
spring:
jpa:
hibernate:
ddl-auto: validate // DDL 처리 방식 (아래 상세 설명)
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
show-sql: true // SQL 로그 출력
properties:
hibernate:
format_sql: true // SQL 정렬해서 출력
highlight_sql: true // SQL 하이라이팅
use_sql_comments: true // 주석 표시
dialect: org.hibernate.dialect.MySQL8Dialect
default_batch_fetch_size: 100 // 배치 페치 사이즈
open-in-view: false // OSIV 비활성화 (성능)
logging:
level:
root: INFO // 전체 로그 레벨
com.example: DEBUG // 특정 패키지 로그 레벨
org.springframework.web: DEBUG // Spring Web 로그
org.hibernate.SQL: DEBUG // SQL 로그
org.hibernate.type: TRACE // 파라미터 로그
file:
name: logs/application.log // 로그 파일 경로
max-size: 10MB // 파일 최대 크기
max-history: 30 // 보관 기간 (일)
pattern:
console: "%d{yyyy-MM-dd HH:mm:ss} - %msg%n" // 콘솔 출력 형식
file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"
charset:
console: UTF-8
file: UTF-8
여기까지 서버, 데이터베이스, JPA, 로깅 설정에 대한 예이다.
자주 사용하는 추가 설정
일반적인 웹 애플리케이션에서 자주 사용하는 파일 업로드, Jackson, 캐시, Redis, 보안에 대한 설정은 아래와 같다. 여기서 뿐만 아니라 환경변수 기본 사용은 맨 아래에 코드와 함께 있다.
spring:
servlet:
multipart:
enabled: true // 멀티파트 업로드 활성화
max-file-size: 10MB // 파일당 최대 크기
max-request-size: 50MB // 요청당 최대 크기
file-size-threshold: 1MB // 임시 파일 임계값
spring:
jackson:
property-naming-strategy: SNAKE_CASE // JSON 네이밍 전략
serialization:
write-dates-as-timestamps: false // ISO-8601 날짜 형식
fail-on-empty-beans: false
deserialization:
fail-on-unknown-properties: false // 알 수 없는 필드 무시
time-zone: Asia/Seoul // 타임존 설정
date-format: yyyy-MM-dd HH:mm:ss // 날짜 포맷
spring:
cache:
type: caffeine // 캐시 구현체
cache-names:
- users
- products
caffeine:
spec: maximumSize=1000,expireAfterWrite=600s
spring:
redis:
host: localhost
port: 6379
password: ${REDIS_PASSWORD}
timeout: 2000ms
lettuce: // 커넥션 풀 설정
pool:
max-active: 8
max-idle: 8
min-idle: 0
spring:
security:
user:
name: admin // 기본 사용자명
password: ${ADMIN_PASSWORD}
roles: ADMIN
// JWT 설정 (커스텀)
jwt:
secret: ${JWT_SECRET}
expiration: 86400000 // 24시간 (밀리초)
refresh-expiration: 604800000 // 7일
// 환경 변수 사용
database:
password: ${DB_PASSWORD}
// 기본값 설정
server:
port: ${SERVER_PORT:8080} // 환경변수 없으면 8080
// 다른 프로퍼티 참조
app:
name: MyApp
description: ${app.name} Application
여기까지 Spring Boot 설정 파일에 대해 알아봤다. 어려워 보일 수는 있지만, 프로젝트를 하다보면 익숙해 질 것이라고 생각한다. 항상 생각하지만 설정파일의 경우에는 프로젝트에 따라 달라지기 때문에 정답이 있지 않기 때문에 프로젝트의 주체들이 이야기하면서 결정하면 된다고 생각한다.
'JAVA > SPRING&SPRINGBOOT' 카테고리의 다른 글
| [SpringBoot] Spring MVC의 핵심, Controller와 요청 처리 (0) | 2025.11.03 |
|---|---|
| [SpringBoot] 애노테이션(Annotation) (0) | 2025.10.30 |
| [SpringBoot] 프로젝트 구조 알아보기 (0) | 2025.10.23 |
| [SpringBoot] gradle 설정 (0) | 2025.10.16 |
| [SpringBoot] maven VS gradle (0) | 2025.10.10 |
블로그의 정보
AquaMan
핫도구