Backend/Spring Framework

[Spring Boot] 개발 환경 분리하기

mopil 2023. 2. 23. 01:06
반응형

로컬과 EC2 환경을 분리하는 작업을 정리한다.

AWS CloudWatch 로깅을 해놨는데, 개발환경에서 부팅할 때도 모두 로그가 남아져서 이를 분리하고자 했다.

 

resource 폴더 자체를 나눌 수도 있지만, 여기서는 application.yml 파일을 나누는 것을 다룬다.

 

(firebase 디렉토리와 apple_sign_key는 무시하자. 여기서 필요 없다.) 이런 식으로

하나의 resources 폴더 안에 yml파일 이름으로 분리할 것이다.

 

# application.yml

spring:
  profiles:
    default: secret-local

  jpa:
    properties:
      hibernate:
        dialect: org.hibernate.dialect.PostgreSQLDialect

먼저 기본 설정파일을 만들어준다.

profiles.default=secret-local로 하면 application-secret-local.yml 파일이 디폴트로 불러와진다.

 

# application-secret-local.yml

spring:
  config:
    activate:
      on-profile: secret-local
  jpa:
    hibernate:
      ddl-auto: create
    properties:
      hibernate:
        show_sql: true

config.activate.on-profile=secret-local 이 핵심이다.

스프링 부트 실행 시 전달되는 옵션을 통해 개발환경을 나누는 원리이다. 로컬환경에서는 해당 파일을 불러올 수 있도록 설정한다.

 

# application-secret-prod.yml

spring:
  config:
    activate:
      on-profile: secret-prod
  jpa:
    hibernate:
      ddl-auto: update

EC2 환경 (프로덕션 환경)에서는 해당 설정 파일을 불러오도록 한다.

 

 

# IntelliJ IDEA 설정

인텔리제이로 secret-local을 불러오려면 다음과 같이 설정을 해준다.

1번 2번 중 둘 중 하나만 설정해 줘도 된다.

로컬에서 EC2 환경으로 부팅하고 싶으면 secret-prod 옵션을 주면 된다.

 

# EC2 스프링 부트 실행 옵션 설정

필자는 Docker와 Github Actions로 CI/CD를 구성해서 해당 방법으로 설정하는 방법을 공유하고자 한다.

 

먼저 Dockerfile 에 실행 옵션을 추가한다.

FROM openjdk:17-jdk
ENV APP_HOME=/home/app/
WORKDIR $APP_HOME
COPY build/libs/*.jar plub-server.jar
EXPOSE 8080
ENTRYPOINT ["java", "-Dspring.profiles.active=secret-prod", "-jar", "plub-server.jar"]

-Dspring.profiles.active=secret-prod의 옵션을 주게 되면, secret-prod로 설정 파일을 불러온다.

 

Github Actions 스크립트도 application.secret-prod.yml을 복사하도록 지정하고, secret에 해당 파일을 업데이트하면 된다.

 

# logback-spring.xml

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
    <conversionRule conversionWord="wex"
                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
    <conversionRule conversionWord="wEx"
                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
    <property name="LOG_PATTERN"
              value="${LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss}}){blue} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>

    <springProperty name="AWS_ACCESS_KEY" source="cloud.aws.credentials.access-key"/>
    <springProperty name="AWS_SECRET_KEY" source="cloud.aws.credentials.secret-key"/>

    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>${LOG_PATTERN}</Pattern>
        </layout>
    </appender>

    <appender name="aws_cloud_watch_log" class="ca.pjer.logback.AwsLogsAppender">
        <layout>
            <pattern>[%thread] [%date] [%level] [%file:%line] - %msg%n</pattern>
        </layout>
        <logGroupName>plub-log</logGroupName>
        <logStreamUuidPrefix>plub-log-</logStreamUuidPrefix>
        <logRegion>ap-northeast-2</logRegion>
        <maxBatchLogEvents>50</maxBatchLogEvents>
        <maxFlushTimeMillis>30000</maxFlushTimeMillis>
        <maxBlockTimeMillis>5000</maxBlockTimeMillis>
        <retentionTimeDays>0</retentionTimeDays>
        <accessKeyId>${AWS_ACCESS_KEY}</accessKeyId>
        <secretAccessKey>${AWS_SECRET_KEY}</secretAccessKey>
    </appender>
    <springProfile name="secret-local">
        <root level="INFO">
            <appender-ref ref="CONSOLE"/>
        </root>
    </springProfile>

    <springProfile name="secret-prod">
        <root level="INFO">
            <appender-ref ref="CONSOLE"/>
            <appender-ref ref="aws_cloud_watch_log"/>
        </root>
    </springProfile>
</configuration>

로깅 설정은 springProfile 태그를 사용해서 환경을 분리하면 된다.

반응형