-
spring boot 프로젝트에서 profile 분리하기 (local, prod, common 환경을 분리해서 구성하기)Project 2023. 4. 8. 20:41
문제상황:
application.yml을 prod, dev(local) 환경으로 아래와 같이 구성하려고 했으나 계속 datasource url을 찾지 못하는 에러가 발생했다.
- 로컬 환경 실행시 뜨는 에러는 아래와 같았다.
Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured
datasource에 있는 url은 정상적인 경로로 작성되어 있었기 때문에 active profile을 찾지 못하는 상황으로 생각했다
내가 작성했던 내용:
의도한 application.yml 구성은 다음과 같이 application.yml 2개를 생성하고 로컬환경 실행 시 dev 파일만 읽길 원했다.
resource
ㄴ application-dev.yml
ㄴ application-prod.yml따라서 application-dev.yml을 아래와 같이 작성하였다.
spring: profiles: active: dev # 현재 활성화된 프로파일을 dev로 설정 --- # 하이픈 3개로 파일을 분리 spring: config: activate: on-profile: dev # dev 프로파일 설정정보 jpa: database: mysql hibernate: dialect: org.hibernate.dialect.MySQL8Dialect ddl-auto: update properties: hibernate: format_sql: true show-sql: true datasource: hikari.maximum-pool-size: 4 # 로컬 환경의 database 접속 주소이다 url: jdbc:mysql://localhost:3306/sns_contents?rewriteBatchedStatements=true&characterEncoding=UTF-8&serverTimezone=Asia/Seoul username: root password: mysql123 driver-class-name: com.mysql.cj.jdbc.Driver
spring.profiles.active와 spring.profiles.default는 스프링 부트에서 프로파일을 지정할 때 사용되는 두 가지 속성이다.
spring.profiles.active는 현재 활성화된 프로파일을 설정하는 속성으로, 애플리케이션을 실행할 때 명시적으로 지정되거나 spring.config.activate.on-profile 속성을 사용하여 프로파일을 활성화할 수 있다.
이 속성은 기본적으로 default 값으로 설정되어 있기 때문에 활성화된 프로파일이 없으면 default 프로파일이 사용된다.
spring.profiles.default는 활성화되지 않은 경우 사용할 기본 프로파일을 설정하는 속성이다.
이 속성은 생략 가능하며, 활성화된 프로파일이 없을 때 사용된다.
만약 spring.profiles.active와 spring.profiles.default 모두 지정되어 있다면, spring.profiles.active가 우선시 된다.
즉, spring.profiles.active는 현재 활성화된 프로파일을 설정하고, spring.profiles.default는 활성화된 프로파일이 없을 때 사용할 기본 프로파일을 설정하는 것이다.
spring.profiles.active을 dev로 설정해줬지만 url을 찾지 못한다는 에러가 계속해서 발생했다.
해결한 방법:
application.yml 파일 한개로 common, dev, prod 환경을 구분하여 작성하였고
spring.profiles.group 설정으로 dev와 prod 두 가지 환경이 common 프로파일을 사용하도록 변경하였다.
applicaion.yml
spring: profiles: active: dev # default profile group: dev: - common prod: - common --- # prod와 dev에 중복으로 작성했던 설정을 common 부분으로 작성하였다. spring: config: activate: on-profile: common jwt: secret-key: token.expired-time-ms: 2592000000 spring.mvc: pathmatch: matching-strategy: ant_path_matcher springdoc: version: '@project.version@' api-docs: path: /api-docs default-consumes-media-type: application/json default-produces-media-type: application/json swagger-ui: operations-sorter: alpha tags-sorter: alpha path: /swagger-ui.html disable-swagger-default-url: true display-query-params-without-oauth2: true doc-expansion: none paths-to-match: - /api/** --- spring: config: activate: on-profile: dev jpa: database: mysql hibernate: dialect: org.hibernate.dialect.MySQL8Dialect ddl-auto: update properties: hibernate: format_sql: true show-sql: true # 로컬 database 주소 datasource: hikari.maximum-pool-size: 4 url: jdbc:mysql://localhost:3306/sns_contents?rewriteBatchedStatements=true&characterEncoding=UTF-8&serverTimezone=Asia/Seoul username: root password: mysql123 driver-class-name: com.mysql.cj.jdbc.Driver --- spring: config: activate: on-profile: prod jpa: database: MYSQL show-sql: true database-platform: org.hibernate.dialect.MySQL8Dialect hibernate: ddl-auto: update # 운영 database 주소 (환경변수 값을 설정해줬다) datasource: url: jdbc:mysql://${rds.hostname}:${rds.db.port}/${rds.db.name} username: ${rds.username} password: ${rds.password} server: port: 5000
다음과 같이 해결하니 datasource의 url을 찾지 못하는 에러는 발생하지 않았고 로컬 환경 실행 시 dev 환경의 database로 데이터가 적재됨을 확인할 수 있었다.
이렇게 로컬 환경에서 테스트를 진행하다 배포 전에 profile.active 설정을 prod로 변경 하면 된다.
'Project' 카테고리의 다른 글
[배포자동화구축] 2-1. AWS EC2에 jenkins 설치하여 배포서버 구축하기 (0) 2023.10.14 [배포자동화구축] 1. Github Actions로 CI 구축하기 (2) 2023.10.13 [배포자동화구축] 0. 배포전략 세우기 (0) 2023.10.13 Spring REST API에 Swagger 3.0 적용하기 (0) 2023.07.02 Entity에 JPA Auditing 적용해서 중복코드 줄이기 (0) 2023.06.27