yml 파일 분리의 필요성
팀 프로젝트를 진행하면서 yml(YAML) 파일의 길이가 꾸준히 늘어나고 있다.
배포하고 도메인까지 연결해보니 로컬에서 테스트할 때와 배포 환경에서 다르게 해줘야할 설정이 점점 많아졌다.
그래서 매번 빌드할때와 테스트할 때 yml 파일을 여러 군데 수정해야하는 불편함까지 생기기 시작했다.
yml 파일를 수정해야 하는 이유를 정리해보면 아래와 같았다.
- 의존성 추가(Sprind Data Redis, Oauth2 Client 등)
- DB 설정 분리(로컬은 H2, 배포에선 MySQL)
- 기능 추가 시 Secret과 같은 환경 변수 설정
- 쿠키, 스웨거 등의 도메인 설정(로컬에선 localhost, 배포에선 배포 도메인 주소)
로컬에서 테스트 할때와 빌드를 할때 수정할 부분을 최소화 하기 위해 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도 새로운 버전으로 배포해도 데이터가 유지되게 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"
참고자료
'백엔드 > 연습' 카테고리의 다른 글
스프링 시큐리티와 컨트롤러 테스트 (0) | 2024.04.25 |
---|---|
커스텀 @WithMockUser (0) | 2024.04.24 |
이메일 인증 2: Redis로 인증 메일 관리하기 with SpringBoot (0) | 2024.04.20 |
이메일 인증 1: Gmail을 이용하여 이메일 발송하기 with SpringBoot (0) | 2024.04.19 |
Redis 써보기 (0) | 2024.04.17 |