Just Do It

[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 설정 파일에 대해 알아봤다. 어려워 보일 수는 있지만, 프로젝트를 하다보면 익숙해 질 것이라고 생각한다. 항상 생각하지만 설정파일의 경우에는 프로젝트에 따라 달라지기 때문에 정답이 있지 않기 때문에 프로젝트의 주체들이 이야기하면서 결정하면 된다고 생각한다.

반응형

블로그의 정보

AquaMan

핫도구

활동하기