[Springboot] 환경 설정 파일(.yml) 분리하기 + JavaMailSender Bean 오류 해결

HeavyJ·2023년 2월 10일
0

자바/스프링부트

목록 보기
2/17

현재 프로젝트에서 데이터베이스를 2가지 사용하고 있습니다.

  • 로컬 DB
  • AWS의 RDS 서버

그래서 기존의 datasource url을 로컬 DB에서 RDS 서버로 바꿔서 데이터베이스 서버에서 잘 작동하는지 테스트 했습니다.

하지만, RDS 서버와 연결했다가 다시 로컬 DB에 연결해서 테스트를 보려니까 url도 계속 수정해야하고 username, password도 수정을 해야하는 불편함이 있었습니다.

그래서 환경 설정 파일을 분리하기로 했습니다.

제 기존 application.yml은 이렇게 작성했습니다.

#DB
spring:
  datasource:
    url: jdbc:mysql://url작성:3306/ConcertCalendar?useUnicode=true&serverTimezone=Asia/Seoul
    username: username작성
    password: password작성
    driver-class-name: com.mysql.cj.jdbc.Driver

  #JPA
  jpa:
    properties:
      hibernate:
        format_sql: true
        # show_sql은 System.out에 로그가 출력되므로 사용을 지양하자
        # show_sql: true
        # jpa에서 어떤 데이터베이스에 맞춰 쿼리를 작성할 지 표시
        dialect: org.hibernate.dialect.MySQL5Dialect
    hibernate:
      ddl-auto: update
      
  # Redis
  redis:
    host: localhost
    port: 6379

  # mail
  mail:
    # Google smtp server 사용
    host: smtp.gmail.com
    port: 587
    username: #앱 비밀번호 발급받은 google 계정
    password: #발급받은 앱 비밀번호
    properties:
      mail:
        smtp:
          starttls:
            enable: true
          auth: true

# sql에 어떤 값이 바인딩 되는지 표시해주는 설정 코드
logging:
  level:
    org:
      hibernate:
        SQL: debug
        type:
          descriptor:
            sql: trace

application.ymlapplication-local.yml(local DB 사용 용도), application-dev.yml(RDS DB 사용 용도)로 나눴습니다.

기존의 application.yml의 내용을 DB파트를 제외하고 복사해서 application-local.yml, application-dev.yml에 붙여놓고
application.yml은 아래와 같이 수정했습니다.

spring:
  profiles:
  	# application-local.yml을 사용하겠다
    active: local

이렇게 수정해서 어플리케이션을 실행하니까

Consider defining a bean of type 'org.springframework.mail.javamail.JavaMailSender' in your configuration.

이렇게 JavaMailSender Configuration을 찾지 못하는 에러가 발생했습니다.

JavaMailSender에서 필요한 정보를 yml 파일에 저장해놓은 상태였기 때문에 수동적으로 Configuration 파일을 생성하지 않아도 되는 상황인데 환경설정 파일을 분리하니까 저 오류가 발생했습니다.

구글링을 통해서 Configuration 파일을 생성하지 않고 해결할 수 있는 방법을 찾아보다가 환경 설정 파일을 분리할 때 loca.ymldev.yml에 mail에 대한 코드가 중복으로 작성이 되어있어서 오류가 발생하는 게 아닐까 하는 의구심이 들었습니다.

그래서 application.yml 파일에 loca.ymldev.yml에 공통적으로 들어있는 코드들을 작성을 하는 걸로 바꾸고 분리 파일에는 데이터에 관한 내용만 작성을 하는 식으로 코드를 변경했습니다.

#DB
spring:
  profiles:
  # application-local.yml을 사용하겠다
  active: local
  # jwt.yml 파일 포함
  include: jwt

  #JPA
  jpa:
    properties:
      hibernate:
        format_sql: true
        # show_sql은 System.out에 로그가 출력되므로 사용을 지양하자
        # show_sql: true
        # jpa에서 어떤 데이터베이스에 맞춰 쿼리를 작성할 지 표시
        dialect: org.hibernate.dialect.MySQL5Dialect
    hibernate:
      ddl-auto: update
      
  # Redis
  redis:
    host: localhost
    port: 6379

  # mail
  mail:
    # Google smtp server 사용
    host: smtp.gmail.com
    port: 587
    username: #앱 비밀번호 발급받은 google 계정
    password:  #발급받은 앱 비밀번호
    properties:
      mail:
        smtp:
          starttls:
            enable: true
          auth: true

# sql에 어떤 값이 바인딩 되는지 표시해주는 설정 코드
logging:
  level:
    org:
      hibernate:
        SQL: debug
        type:
          descriptor:
            sql: trace

수정하고 나니까 JavaMailSender Configuration을 못 찾는 문제를 해결할 수 있었습니다.

혹시 환경 설정 파일을 변경하고 나서 JavaMailSender 관련된 문제가 발생하시는 분들은 환경설정 파일을 다시 한 번 체크해보는 게 좋을 것 같습니다!

profile
There are no two words in the English language more harmful than “good job”.

2개의 댓글

comment-user-thumbnail
2023년 2월 13일

잘보았습니다.
설정파일 분리를 통해 추상화 하시려는 노력이 좋은 것 같습니다.
다만, spring.profiles.include=a,b,c,d,e,f,g
와 같은 옵션 방법도 있기에 한번 고려 해보시는 것도 좋을 것 같습니다!

1개의 답글