이 연재글은 SpringBoot2로 Rest api 만들기의 11번째 글입니다.

이번장에서는 기존에 단일 파일로 관리되던 스프링 설정을 서버 환경에 따라 다르게 적용되도록 개선해보겠습니다.

환경별 application.yml의 분리

/resources 아래에 application.yml을 복사하여 application-alpha.yml, application-local.yml 두개를 더 만듭니다. 개발 환경에 따라 beta, service등이 더 있을수 있지만, 실습에서는 2개의 환경만 만들도록 하겠습니다.

스프링에서는 이렇게 파일을 분리하고 서버 실행 옵션에 profile을 설정하면 지정된 환경으로 서버를 시작할 수 있습니다.

기존의 application.yml에는 모든 환경에 공통으로 들어가는 설정을 넣습니다. 유심히 볼점은 spring.profiles.active: local 인데 스프링 서버 실행시 profile을 지정하지 않으면 application-local.yml을 기본 설정으로 서버가 실행됩니다.

# application.yml
spring:
  profiles:
    active: local # 디폴트 환경
  messages:
    basename: i18n/exception
    encoding: UTF-8
  social:
    kakao:
      client_id: XXXXXXXXXXXXXXXXXXXXXXXXXX # 앱생성시 받은 REST API 키
      redirect: /social/login/kakao
      url:
        login: https://kauth.kakao.com/oauth/authorize
        token: https://kauth.kakao.com/oauth/token
        profile: https://kapi.kakao.com/v2/user/me
  jwt:
    secret: govlepel@$&

아래는 로컬 환경의 설정 파일입니다.
logging을 추가하여 com.rest.api package 하위의 로그는 debug level 이상일때 출력되도록 합니다. 나머지에 위치한 로그들은 warn level 이상이어야 출력됩니다. spring.profiles:local은 해당 yml이 local 환경임을 표시합니다. 다른 설정은 기존과 동일합니다.

# application-local.yml
logging:
  level:
    root: warn
    com.rest.api: debug

spring:
  profiles: local
  datasource:
    url: jdbc:h2:tcp://localhost/~/test
    driver-class-name: org.h2.Driver
    username: sa
  jpa:
    database-platform: org.hibernate.dialect.H2Dialect
    properties.hibernate:
      hbm2ddl.auto: update
      format_sql: true
    showSql: true
    generate-ddl: true
  url:
    base: http://localhost:8080

아래는 알파 환경의 설정 파일입니다.
logging을 추가하여 com.rest.api package 하위의 로그는 info level 이상일때 출력되도록 합니다. 나머지 로그들은 warn level 이상이어야 출력됩니다.

또한 path를 지정하여 로그 파일(spring.log)이 /home/ec2-user/api/log 아래에 생성되도록 합니다. max-history를 지정하면 최근 로그 파일만 남고 과거 로그는 자동으로 지워집니다.

spring.profiles:alpha는 해당 yml이 alpha 환경임을 표시합니다. local 환경과는 달리 alpha에서는 mysql db를 사용하도록 세팅 한 것을 볼 수 있습니다. 또한 DDL을 허용하지 않도록 설정하여, 임의로 테이블이 생성되거나 변경되지 않도록 합니다.

# application-alpha.yml
logging:
  level:
    root: warn
    com.rest.api: info
  path: /home/ec2-user/api/log
  file:
    max-history: 7

spring:
  profiles: alpha
  datasource:
    url: jdbc:mysql://127.0.0.1:33060/daddyprogrammer?useUnicode=true&autoReconnect=true&characterEncoding=utf8&allowMultiQueries=true&useSSL=false
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: happydaddy
    password: daddy!@#1004
  jpa:
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    properties.hibernate:
      hbm2ddl.auto: none
      format_sql: true
    showSql: true
    generate-ddl: false
  url:
    base: http://alpha.daddyprogrammer.org

Intellij에서 서버 실행시 환경 적용

다음과 같이 Edit Configuraion을 눌러 서버 설정 화면으로 들어갑니다.

하단의 Active profiles라는 항목에 local이나 alpha를 적고 서버를 실행하면 해당 profile에 해당하는 환경설정 yml이 적용됩니다.

Configurations 화면이 아래와 같을경우엔 VM options 항목에 -Dspring.profiles.active={환경}으로 profile을 지정하면 됩니다.

서버 실행시 환경 적용

실제 서버에서는 tomcat의 JVM 옵션 설정하는 부분이나 executable jar 실행시 옵션에 profile을 설정하면 됩니다. jar로 바로 실행하는 경우는 다음과 같이 -Dspring.profiles.active로 환경을 지정 하면 됩니다.

$ java -jar -Dspring.profiles.active=alpha api-0.0.1-SNAPSHOT.jar

최신 소스는 GitHub 사이트를 참고해 주세요.
https://github.com/codej99/SpringRestApi/tree/feature/seperate-profile

GitHub Repository를 import하여 Intellij 프로젝트를 구성하는 방법은 다음 포스팅을 참고해주세요.

Docker로 개발 환경을 빠르게 구축하는 것도 가능합니다. 다음 블로그 내용을 읽어보세요!

스프링 api 서버를 이용하여 웹사이트를 만들어보고 싶으시면 아래 포스팅을 참고해 주세요.

연재글 이동[이전글] SpringBoot2로 Rest api 만들기(10) – Social Login kakao
[다음글] SpringBoot2로 Rest api 만들기(12) – Deploy & Nginx 연동 & 무중단 배포 하기