환경별로 Profile 분리하기

박진형·2022년 7월 7일
0

instakyuram

목록 보기
3/5
⚠️ 애플리케이션 실행 환경은 각각 다를 수 있고 특정 환경의 설정은 안전하게 별도로 관리되어야하는 경우가 있습니다.

저희 프로젝트에서는 네 가지 Profile로 나눕니다.

  • real - 실제 배포 환경의 Profile 입니다.
  • dev - 개발 환경의 Profile 입니다.
  • local - 로컬 환경의 Profile 입니다.
  • mem - In-memory 환경의 Profile 입니다.

Profile 설정

아래 코드 블럭으로 기재되어있는 .yml 파일들은 어느정도 축약된 내용들 입니다.

appplication.yml

공통으로 사용할 설정은 application.yml에 작성합니다. 각 환경에 맞는 Profile 설정으로 해당 설정들을 오버라이딩 하거나 추가할 수 있습니다.

  • application.yml
spring:
  application:
    name: instakyuram
  thymeleaf:
    suffix: .html
  jpa:
    hibernate:
      ddl-auto: validate
  flyway:
    enabled: true
    baseline-on-migrate: true
    locations: classpath:db/migration, classpath:db/seed
  servlet:
    multipart:
      maxFileSize: 5MB
      maxRequestSize: 30MB

cors:
  allowed:
    api: /api/**
    method: GET, POST, PATCH, DELETE
security:
  patterns:
    ignoring: ["/css/**", "/js/**", "/webjars/**", "/images/**"]
    permit-all:
      GET : ["/members/signin", "/members/**", "/api/posts/**"]
      POST : ["/api/members/signin", "/api/members/signup"]
      PATCH : []
      PUT : []
      DELETE : []
  jwt:
    issuer: kyuram
    client-secret:
    accessToken:
      header: atoken
      expiry-seconds: 60
    refreshToken:
      header: rtoken
      expiry-seconds: 120

application-real.yml

배포 환경의 profile입니다. Jasypt로 암호화된 설정값들이 있고 환경변수로 암호화 키 값을 받습니다.

이 profile은 git submodule에 의해 관리 됩니다. 메인 모듈(메인 Repository)에 업로드 되어서는 안되므로 .gitignore 설정이 되어있습니다.

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    username: ENC(CulrmCVWVQRxx0aAo+EfkA==)
    password: ENC(Q9n+s8uddrPvDioO8kKH91VYX3PWgy85)
    url: ENC(u622aD2ytMd8mijoejvxI0EgNJvEuAvbPMpQ5mC+Fa9AV9sOnf7n3uLJsRqkgSKL)

cors:
  allowed:
    url: "http://localhost:3000"
secy:
  jwt:
    client-secret: ENC(3e5wRh0E5WQH/EIcYjEKr+Hc8Q9uamJ9)
encryptor:
  key: ${ENCRYPTOR_KEY}

application-dev.yml

개발 환경의 Profile 입니다. Jasypt로 암호화된 설정값들이 있고 prod환경과 다른 dev 환경에 맞는 암호화 키가 존재합니다.(ENCRYPTOR_KEY)

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    username: ENC(AzlDbF5wkOwjc6PApuV6Pg==)
    password: ENC(kcjv5IqrezLATOvvUYWAZVKvqFe1yPTM)
    url: ENC(P3fJYSZqwQ3YjSRY5ewwfDGyWfZ9Cm+OOtLJN3oi02XHKlWvTOf/j6G1+gDXtHhY)

security:
  jwt:
    client-secret: ENC(GwEnP+x6pZNS/q8oxLDhqV1cvzG3lvmH)
encryptor:
  key: ${ENCRYPTOR_KEY}

application-local.yml

로컬 환경의 profile입니다. DB url, username, password, client-secret을 환경변수로 받고, 각각 변수 설정을 하지 않았을 때 기본값으로 kyuram, root, password로 설정 됩니다.

(’:’ 를 사용해 기본값을 설정할 수 있습니다.)

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    username: ${MYSQL_USERNAME:root}
    password: ${MYSQL_PASSWORD:password}
    url: jdbc:mysql://localhost:3306/${MYSQL_SCHEMA:kyuram}
  jpa:
    show-sql: ${SHOW_SQL:false}
    properties:
      hibernate:
        format_sql: ${SHOW_SQL:false}
security:
  jwt:
    client-secret: ${JWT_SECRET:DEFAULT_JWT_SECRET}

application-mem.yml

In-memory DB를 사용하는 로컬 환경의 profile입니다.

flyway를 사용하지 않습니다.

spring:
  datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:mem:testdb
    username: sa
    password:
  jpa:
    hibernate:
     ddl-auto: create-drop
  flyway:
    enabled: false
    baseline-on-migrate: false

security:
  jwt:
    client-secret: INSTAKYURAM

💡Test 모듈에서도 기본적인 공통 설정을 사용하고 싶다면..?

테스트 모듈의 resources 폴더에 application.yml을 설정합니다. 기본적인 설정은 메인 모듈의 application.yml에서 가져오고 test 환경에 맞는 설정을 따로 추가하거나 오버라이딩 하면 됩니다.

  • test/resources/application.yml
spring:
  jpa:
    hibernate:
      ddl-auto: create-drop
  datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:mem:testdb
  flyway:
    enabled:false
baseline-on-migrate:false
cors:
  allowed:
    url: "http://localhost"
security:
  jwt:
    client-secret: TEST_SECRET

환경 변수 파일 설정

  • .env 파일을 프로젝트 루트 경로에 만들어 줍니다.
    • 로그에서 SQL을 보고싶지 않다면 SHOW_SQL을 false로 설정하면 됩니다.
    • profile에서 필요한 환경변수들을 세팅하시면 됩니다.
MYSQL_USERNAME=root
MYSQL_PASSWORD=password
#SHOW_SQL=true
ENCRYPTOR_KEY=DEV_INSTAKYURAM
JWT_SECRET= ...
  • env 설정을위한 플러그인을 설치해줍니다.
    • EnvFile
    • .env files support

  • intellij Edit Configuration
    • Enable EnvFile 체크
      • 버튼 클릭해서 .env파일 추가
        • env 파일이 보이게 해야하므로 cmd + shift + . 을 누루시면 보입니다.

0개의 댓글