yml 파일 분리의 필요성
팀 프로젝트를 진행하면서 yml(YAML) 파일의 길이가 꾸준히 늘어나고 있다.
yml 파일를 수정해야 했던 이유를 정리해보면 아래와 같았다.
- 의존성 추가(Sprind Data Redis, Oauth2 Client 등)
- DB 설정 분리(로컬은 H2, 배포에선 MySQL)
- 기능 추가 시 Secret과 같은 환경 변수 설정
- 쿠키, 스웨거 등의 도메인 설정(로컬에선 localhost, 배포에선 배포 도메인 주소)
배포하고 도메인까지 연결해보니 로컬에서 테스트할 때와 배포 환경에서 다르게 해줘야할 설정이 점점 많아졌다.
그래서 매번 빌드할때와 테스트할 때 yml 파일을 여러 군데 수정해야하는 불편함까지 생기기 시작했다.
로컬에서 테스트 할때와 빌드를 할때 수정할 부분을 최소화 하기 위해 yml 분리 방법을 간단하게 공부하고 정리해보려 한다.
개발 환경은 본인이 스프링을 사용하므로 스프링 기준이다.
yml 파일들을 분리하기 위한 규칙
1. 파일 이름 규칙
yml 파일 이름은 나름의 규칙을 지켜야한다.
application-{profile이름}.yml 의 규칙으로 짓는다.
스프링에서는 {profile이름}으로 yml 파일을 구분하고 활용할 수 있다.
2. application.yml 위치
이건 따로 변경할 수 있다곤 하지만 아래처럼 resources 경로에 둔다.
3. 다른 프로필의 yml 파일 위치
아래처럼 depth를 나눠서 사용할 수도 있지만 본인은 application.yml 과 같은 depth로 사용하려 한다.
project
├── src
│ ├── main
│ ├── java
│ ├── resources
│ │ ├── static
│ │ ├── templates
│ │ ├── yaml
│ │ │ ├── logging
│ │ │ │ └─ application-log.yml
│ │ │ ├── application-dev.yml
│ │ │ └─ application-local.yml
│ │ └─ application.yml
yml 파일 분리 해보기
application.yml
분리하는 기준은 정하기 나름이겠지만 본인은 application.yml 파일에 공통 설정을 담았다.
server:
port: 8080
spring:
profiles:
group: # yml 파일 여러개를 그룹화 하고싶을 때 사용
test: local, log # 이렇게 local, log를 그룹화하고 사용할 때는 active: test
active: local # 로컬에서 테스트할 때는 local, 빌드 시엔 prod 로 이 부분만 변경
data:
redis:
host: localhost
port: 6379
repositories:
enabled: false
main:
allow-bean-definition-overriding: true
pawland:
front-test-url: "http://localhost:3000" # 해당 라인과 아래 라인도 local, prod 로 나누면 하나로 관리할 수 있었을듯
front-deploy-url: "https://www.pawland.store"
jwt-key: # JWT 키
gmail:
host: smtp.gmail.com
port: 587
username: hyukkind@gmail.com
password: # 구글 앱 비밀번호
smtpProperties:
auth: true
starttls-enable: true
starttls-required: true
connection-timeout: 5000
timeout: 5000
writeTimeout: 5000
aws:
access-key: # AWS 액세스 키
secret-key: # AWS 시크릿 키
s3-image-prefix: # S3 이미지 프리픽스
s3-access-point: # S3 액세스 포인트
application-local.yml
로컬에서 사용하는 yml 설정이다.
로컬에서는 인메모리에서 테스트하고, ddl-auto 기능도 마음대로 사용할 수 있다.
spring:
config:
active:
on-profile: local # 프로필 이름 설정
datasource:
url: jdbc:h2:mem:testdb;MODE=MySQL
hikari.maximum-pool-size: 20
h2:
console:
enabled: true
path: /h2-console
jpa:
open-in-view: false
hibernate:
ddl-auto: create # 로컬에선 ddl-auto create로 해도 됨
show-sql: true
properties:
hibernate:
format_sql: true
show_sql: true
dialect: org.hibernate.dialect.H2Dialect
pawland:
back-domain: "localhost"
back-url: "http://localhost:8080"
application-prod.yml
배포할 때 사용할 yml 설정이다.
배포 환경에서는 ddl-auto 때문에 낭패를 볼 수 있으므로 none으로 설정하고
DB도 새로운 버전으로 배포해도 데이터가 유지되도록 H2 인메모리 DB에서 MySQL로 바꿔준다.
spring:
config:
active:
on-profile: prod
datasource:
url: jdbc:mysql:// # RDS or EC2로 띄운 MySQL 주소
username: # 사용자
password: # 비밀번호
hikari.maximum-pool-size: 20
jpa:
open-in-view: false
hibernate:
ddl-auto: none # ddl-auto 는 prod 에선 none
properties:
hibernate:
format_sql: true # 이 부분도 false 해도 될듯
show_sql: true # 이 부분도 false 해도 될듯
dialect: org.hibernate.dialect.MySQLDialect
pawland:
back-domain: "midcon.store"
back-url: "https://www.midcon.store"
참고자료
[Spring] 하나의 YAML을 여러 개로 나누어 환경 분리하기
스프링에서는 다양한 환경 변수 및 정보들을 활용하기 위해 yaml 및 properties를 지원한다. 하나의 yaml 파일들을 여러 개의 yaml로 나누는 방법을 익혀보자.
velog.io
'백엔드 > Spring' 카테고리의 다른 글
@ConfigurationProperties로 환경 변수 관리 (0) | 2023.10.08 |
---|---|
ArgumentResolver (0) | 2023.09.29 |
Interceptor 써보기 (0) | 2023.09.29 |
Filter (0) | 2023.09.29 |
Interceptor (0) | 2023.09.29 |