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 내부 환경변수 관리로 변경했다.