관리 메뉴

nalaolla

SpringBoot2로 Rest api 만들기(11) – profile을 이용한 환경별 설정 분리 본문

SPRING/SpringBoot Restfull api

SpringBoot2로 Rest api 만들기(11) – profile을 이용한 환경별 설정 분리

날아올라↗↗ 2020. 2. 14. 15:35
728x90

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

환경별 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을 허용하지 않도록 설정하여, 임의로 테이블이 생성되거나 변경되지 않도록 합니다.

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로 프로젝트 구성은 다음을 참고해주세요.
https://daddyprogrammer.org/post/1215/intellij-github-spring-gradle-project-import

 

 

 

[출처] https://daddyprogrammer.org/post/2421/springboot2-seperate-environment-by-profile/

 

 

728x90