Dangil project(9)

Junyoung·2024년 5월 23일

Dangil Project

목록 보기
9/20

git 을 통해서 올리는 환경은 local 개발 환경이므로 앞서 네트워크에서 학습한대로 http://locahost 가 아닌 http://[컨테이너이름] 이 되야한다.

따라서 yml 파일을 Dev 환경과 prod 환경으로 분리해서 실행되는 환경에 맞는 파일을 마운트하는 방식으로 설정하려고 한다.

Spring Boot resources 에 해당 파일들을 분리해서 설정해보겠다.

다음과 같이 구성한다

application.yml

spring:
  profiles:
    default: dev

  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/today?serverTimezone=Asia/Seoul&characterEncoding=UTF-8
    username: ${MYSQL_USER_DEV_ID}
    password: ${MYSQL_USER_DEV_PASSWORD}

  jpa:
    properties:
      hibernate:
        dialect: org.hibernate.dialect.MySQL8Dialect
        format_sql: true
        default_batch_fetch_size: 1000
#        show_sql: true

  batch:
    jdbc:
      initialize-schema: always

  security:
    oauth2:
      client:
        registration:
          naver:
            client-id: ${NAVER_CLIENT_ID}
            client-secret: ${NAVER_CLIENT_SECRET}
            client-authentication-method: client_secret_post
            authorization-grant-type: authorization_code
            redirect-uri: "{baseUrl}/{action}/oauth2/code/{registrationId}"
            scope:
              - email
            client-name: Naver

          kakao:
            client-id: ${KAKAO_CLIENT_ID}
            client-secret: ${KAKAO_CLIENT_SECRET}
            client-authentication-method: client_secret_post
            authorization-grant-type: authorization_code
            scope: # https://developers.kakao.com/docs/latest/ko/kakaologin/common#user-info
              - account_email
              - profile_nickname
            redirect-uri: "{baseUrl}/{action}/oauth2/code/{registrationId}"
            client-name: Kakao

        provider:
          naver:
            authorization-uri: https://nid.naver.com/oauth2.0/authorize
            token-uri: https://nid.naver.com/oauth2.0/token
            user-info-uri: https://openapi.naver.com/v1/nid/me
            user-info-authentication-method: header
            user-name-attribute: response # Naver 응답 값 resultCode, message, response 중 response 지정

          kakao:
            authorization-uri: https://kauth.kakao.com/oauth/authorize
            token-uri: https://kauth.kakao.com/oauth/token
            user-info-uri: https://kapi.kakao.com/v2/user/me
            user-info-authentication-method: header
            user-name-attribute: id # Kakao 응답 값 id, connected_at, properties, kakao_account 중 id 지정

jwt:
  secret: ${SERVICE_JWT_SECRET_KEY}

kafka:
  server: ${KAFKA_DEV_SERVER_ADDRESS}
  group: ${KAFKA_SPRING_GROUP}

server:
  servlet:
    context-path: '/api'
  port: 8080

logging:
  level:
    org.hibernate.SQL: debug
    org.hibernate.type: trace # log 단계에서 쿼리문 show

application-create.yml

spring:
  config:
    activate:
      on-profile: create
  
  datasource:
    url: jdbc:mysql://mysql:3306/today?serverTimezone=Asia/Seoul&characterEncoding=UTF-8
    username: ${MYSQL_USER_PROD_ID}
    password: ${MYSQL_USER_PROD_PASSWORD}

  jpa:
    hibernate:
      ddl-auto: create

kafka:
  server: ${KAFKA_PROD_SERVER_ADDRESS}

application-dev.yml

spring:
  config:
    activate:
      on-profile: dev

  jpa:
    hibernate:
      ddl-auto: update

application-prod.yml

spring:
  config:
    activate:
      on-profile: prod
  datasource:
    url: jdbc:mysql://mysql:3306/today?serverTimezone=Asia/Seoul&characterEncoding=UTF-8
    username: ${MYSQL_USER_PROD_ID}
    password: ${MYSQL_USER_PROD_PASSWORD}
  jpa:
    hibernate:
      ddl-auto: update
  elasticsearch:
    uris: 'http://elasticsearch:9200'

kafka:
  server: ${KAFKA_PROD_SERVER_ADDRESS}

prod 환경에 설정 파일에 mode를 설정하고

FROM openjdk:17-alpine AS builder

WORKDIR /usr/src/app

# 실행 환경을 만들어준다
COPY build.gradle gradlew settings.gradle .

COPY gradle gradle

COPY src src

# 파일을 복사해오면 실행 권한이 없기에 실행 권한을 부여한다 !
RUN chmod +x gradlew

# 빌드를 실행한다 !
RUN ./gradlew clean bootJar

FROM openjdk:17-alpine

WORKDIR /usr/src/app

ARG JAR_FILE=build/libs/*.jar

COPY --from=builder /usr/src/app/${JAR_FILE} app.jar
RUN apk add tzdata && ln -snf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
RUN echo Asia/Seoul > /etc/timezone

ENTRYPOINT ["java","-jar", "-Dspring.profiles.active=prod" ,"app.jar"]

jar 파일 실행시 설정을 통해서 prod 환경 설정으로 실행시킨다.
ENTRYPOINT ["java","-jar", "-Dspring.profiles.active=prod" ,"app.jar"]

  • 고민

이전에 스프링 프로젝트 환경변수 관리는 yml을 통해서 변수를 지정해서 사용했다.
git Ignore 로 git에는 공유하지 않고 개발자들끼리 해당 파일만 마운트했다.
이후 인프라 담당은 젠킨스의 크리덴셜 기능으로 해당 파일을 불러왔다.

이렇게 한다면 모듈화 개발시, 인프라 구성시, 각 담당자에게 받은 파일만 넣고 어떤 환경이던 실행이 가능했다.

하지만 파일의 수가 늘어나는점, 설정 파일을 젠킨스에 의존하는 점, 다른 방법으로 환경변수를 관리 해보자는 방향으로 이번에는 인프라에서 직접 환경변수를 지정해봤다.

기본 yml 파일을 보면
client-id: ${NAVER_CLIENT_ID}
client-secret: ${NAVER_CLIENT_SECRET}
다음과 같이 환경변수로 설정이 되어있다.

services:
  spring:
    container_name: spring
    image: spring:latest
    restart: always
    env_file:
      - /env/spring.env
    expose:
      - 8080
    environment:
      TZ: Asia/Seoul

networks:
  default:
    name: today-net
    external: true

컨테이너 실행시 EC2 내부에 있는 환경변수 파일을 마운트해서 환경변수를 지정해주고 있다.

성공적으로 빌드 환경을 분리, EC2 내부 환경변수 관리로 변경했다.

profile
라곰

0개의 댓글