application.yml에 대하여..

Yong·2025년 9월 5일

Spring

목록 보기
3/3

1. 백앤드 application 설정파일이 뭘까?

일반적으로 application.yml 혹은 application.properties 는 백엔드 application을 만들 때 필요한 설정파일이다.

설정 파일의 필요성

백엔드 application을 만들 때는 수많은 설정이 필요하다 :

  • 데이터베이스 연결 정보 (어떤 DB? 주소는? 계정은?)
  • 서버 포트 번호 (8080? 3000?)
  • 로그 레벨 (에러만? 모든 정보?)
  • 보안 설정
  • 외부 API 키

이런 설정들을 코드에 하드코딩하면 안 되는 이유:

// ❌ 나쁜 예: 코드에 직접 작성
String dbUrl = "jdbc:mysql://localhost:3306/mydb";
String username = "admin";
String password = "password123";

문제점들:

  • 개발/테스트/운영 환경마다 다른 설정 필요
  • 비밀번호 같은 민감정보가 코드에 노출
  • 설정 변경 시마다 코드 수정 후 재컴파일 필요

백앤드 application 설정파일의 역할

application.ymlapplication.properties 는 이런 설정들을 코드 밖으로 분리한 설정 파일이다.

2. YAML vs Properties

Spring Boot에서는 application.propetiesapplication.yml 이 두 가지 형식을 지원한다.

application.properties

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

application.yml

server:
  port: 8080

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: admin
    password: password
  jpa:
    hibernate:
      ddl-auto: update

YAML의 장점:

  • 계층 구조가 명확해서 읽기 쉬움
  • 중복 제거 (spring을 매번 안 써도 됨)
  • 들여쓰기로 구조를 표현

3. Spring Boot가 application.yml을 읽는 과정

1단계: 애플리케이션 시작

@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args); // 여기서 시작!
    }
}

2단계: 설정 파일 탐색

Spring Boot는 다음 순서로 설정 파일을 찾는다 :

  1. src/main/resources/application.yml
  2. src/main/resources/application.properties
  3. 기타 외부 경로들...

3단계: 설정 값 적용

# application.yml
server:
  port: 9000

spring:
  datasource:
    url: jdbc:h2:mem:testdb

Spring Boot가 이 설정을 읽고:

  • 서버를 9000 포트로 실행
  • H2 메모리 데이터베이스에 연결

4. 실제 동작 과정 - 단계별 예시

예시 1: 데이터베이스 연결

# application.yml
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/myapplication
    username: user
    password: password
    driver-class-name: com.mysql.cj.jdbc.Driver

Spring Boot가 하는 일:

  1. MySQL 드라이버를 찾아서 로드
  2. jdbc:mysql://localhost:3306/myshop에 연결 시도
  3. user/password로 로그인
  4. 연결 성공하면 커넥션 풀 생성
  5. JPA/Hibernate가 이 연결을 사용

예시 2: 서버 포트 설정

server:
  port: 8090

결과:

  • 기본값 8080 대신 8090 포트로 서버 실행
  • http://localhost:8090으로 접속 가능

5. 프로필(Profile) - 환경별 설정 관리

문제 상황

  • 개발할 때: 로컬 MySQL 사용
  • 테스트할 때: 메모리 H2 사용
  • 운영할 때: 실제 서버의 MySQL 사용

모든 환경에서 같은 설정 파일을 쓸 수는 없다.

해결책: 프로필 사용

방법 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

6. 자주 사용하는 설정들과 의미

서버 설정

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 드라이버

JPA/Hibernate 설정

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: 모든 정보

7. 실무에서의 활용 패턴

개발 초기 (로컬 개발)

# 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

8. 주의사항과 베스트 프랙티스

🚨 주의사항

  1. YAML 문법 엄격함

    # ❌ 잘못된 예
    spring:
    datasource:              # 들여쓰기 틀림
        url: jdbc:mysql://localhost
    
    # ✅ 올바른 예
    spring:
      datasource:            # 2칸 들여쓰기
        url: jdbc:mysql://localhost
    
  2. 민감정보 관리

    # ❌ 절대 하지 말 것
    spring:
      datasource:
        password: mySecretPassword123  # Git에 올라감!
    
    # ✅ 환경변수 사용
    spring:
      datasource:
        password: ${DB_PASSWORD}       # 환경변수에서 읽음
    

💡 베스트 프랙티스

  1. 환경별 설정 분리
  2. 민감정보는 환경변수나 외부 설정 사용
  3. 개발 환경에서는 디버깅 정보 활성화
  4. 운영 환경에서는 성능 최적화 설정
  5. 주석으로 설정 의미 설명
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 애플리케이션의 설정 핵심이다:

  1. 코드와 설정 분리 - 환경별 다른 설정 가능
  2. 자동 설정 - Spring Boot가 설정을 읽어 자동으로 빈 구성
  3. 프로필 지원 - 개발/테스트/운영 환경 구분
  4. 외부화 지원 - 환경변수, 커맨드라인 인자 등으로 오버라이드 가능
profile
dev

0개의 댓글