개요
개발하면서 profile을 통해 로컬과 배포 환경에서의 설정을 분리했지만 빌드를 할때마다 프로파일을 변경해줘야하는 것이 불편해서 찾아보게 되었습니다.
찾다보니 .jar를 실행할 때 환경변수로 사용할 프로파일을 결정할 수 있었고 docker를 사용하여 배포를 하고 있었기 때문에 docker의 환경변수로도 사용할 수 있는지 찾아보았고 방법을 정리했습니다.
application.yml 설정
# default
spring:
profiles:
active: prod
group:
"prod" : "prod"
"dev" : "dev"
jpa:
hibernate:
ddl-auto: update
show-sql: true
springboot:
jwt:
secret: asdlkqwjie120938
server:
ssl:
key-store: "classpath:keystore.p12"
key-store-type: PKCS12
key-store-password: 4290582309459
port: 8443
# Mock Mvc test response 한글 깨짐
servlet:
encoding:
charset: UTF-8
force: true
---
spring:
config:
activate:
on-profile: prod
datasource:
url: jdbc:mariadb://mariadb/likelionblog?createDatabaseIfNotExist=true
username: root
password: 235848371057
driver-class-name: org.mariadb.jdbc.Driver
---
spring:
config:
activate:
on-profile: dev
datasource:
url: jdbc:mariadb://localhost:3306/likelionblog?createDatabaseIfNotExist=true
username: root
password: 345984309580
driver-class-name: org.mariadb.jdbc.Driver
application.yml을 보이는 바와 같이 운영 환경의 데이터베이스와 개발 환경의 데이터베이스를 구분해주기 위해서 프로파일로 나누어 설정해두었습니다.
.jar 환경변수로 프로파일 결정
.jar 파일을 실행할 때 프로파일을 결정할 수 있는 환경변수가 있었습니다.
--spring.profiles.active={profileName}
추측하면 application 설정에 들어가는 값을 하이픈 두개로 설정할 수 있는 것 같습니다.
따라서 아래와 같이 실행해주면 프로파일을 결정할 수 있습니다.
java -jar springboot-application.jar --spring.profiles.active={profileName}
적용
다음과 같이 잘 적용되는 것을 볼 수 있습니다.
docker 환경변수로 프로파일 결정
위와 같이 .jar를 실행할 때 설정할 수 있듯이 더 나아가서 도커 이미지를 컨테이너로 실행할 때 결정하는 방법을 찾아보았습니다.
Dockerfile
FROM openjdk:11-jre
ENV SPRING_PROFILES_ACTIVE=prod
COPY {your_application}.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
가장 기본적인 dockerfile입니다.
ENV
: ENV를 통해서 .jar를 실행할 때 환경변수를 설정해줄 수 있습니다.
- 이 설정을 통해서 프로파일뿐만 아니라 application.yml에서 설정할 수 있는 데이터베이스 주소와 같은 부분을 설정해줄 수 있습니다.
- 여기서 설정한 prod는 기본값을 의미합니다.
빌드
다른 도커와 동일하게 위의 Dockerfile로 빌드해주시면됩니다.
docker build -t {태그명} {dockerfile 위치(현재 디렉토리라면 .)}
실행
위의 도커파일로 빌드했기 때문에 해당 이미지를 컨테이너로 실행할 때 환경변수를 설정할 수 있습니다.
docker run -d -p 80:80 -e SPRING_PROFILES_ACTIVE={프로파일명} {이미지명}
적용
prod 적용
dev 적용
잘 적용된 것을 볼 수 있습니다. (dev 프로파일에 그룹을 지어놔서 두개가 액티브되었습니다.)
결론
application.yml의 설정을 변경 없이 실행시에 설정을 바꿔줄 수 있다는 것을 알게되었고 편하게 배포를 할 수 있게된 것 같습니다.
스프링 부트에 대해서 자세히 공부하면 할수록 개발자가 오로지 비즈니스 로직을 개발하는것에만 집중할 수 있도록 해주는 것 같습니다.
'Spring' 카테고리의 다른 글
[JPA] 영속성 컨텍스트 (0) | 2024.03.04 |
---|---|
[Spring Test] MockMvc Response로 검증하기 (0) | 2024.02.05 |
[Spring JPA] 일대다 연관관계 매핑 (0) | 2024.02.04 |
[Spring] ControllerAdvice, RestControllerAdvice를 통한 예외 처리 (0) | 2024.02.02 |
[Spring Test] Spring Boot Controller 단위 테스트 (1) | 2024.01.31 |