ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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 설정으로 devprod 두 가지 환경이 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로 변경 하면 된다.  

Designed by Tistory.