JavaMailSender에서 설정값이 null로 인식된 원인과 해결

coldrice99·2025년 4월 13일
0
post-thumbnail

🧩 문제 상황

이메일 인증 기능을 구현하기 위해 Gmail SMTP 설정을 application-secret.yml에 저장했다.

spring:
  mail:
    host: smtp.gmail.com
    port: 587
    username: coldrice99@gmail.com
    password: my-app-password
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true

스프링 프로파일도 정상적으로 지정한 상태였다.

# application.yml
spring:
  profiles:
    active: local
    include: secret

✅ 실행 시 출력도 분명히 두 개의 profile이 활성화된 것으로 확인됨:

The following 2 profiles are active: "secret", "local"

그런데도 메일 발송 기능은 항상 실패하고 콘솔에는 아래와 같은 로그가 출력되었다.

✅ 메일 설정 확인:
➡ Host = null
➡ Port = -1
➡ Username = null

🔍 잘못된 진단

  • 처음에는 application-secret.yml이 제대로 로딩되지 않는다고 판단하고 프로파일 설정을 수차례 확인
  • yml 구조, 들여쓰기, 파일 위치, 프로파일 명칭 등 다양한 부분을 의심하며 불필요한 수정들을 반복함
  • 하지만 설정 로딩 자체는 전혀 문제가 없었음

💡 진짜 원인: JavaMailSender를 직접 Bean 등록하지 않았기 때문

Spring Boot는 JavaMailSender를 자동 구성해주지만, 조건부 자동 설정(@ConditionalOnMissingBean)이기 때문에
명시적인 Bean 등록을 하지 않으면, 해당 설정을 사용하는 시점까지 mail 관련 속성을 로딩하지 않음.

즉, application.yml에 mail 속성이 들어 있어도, 그걸 사용할 JavaMailSender가 없으면 아무 일도 일어나지 않음.


✅ 최종 해결 방법

JavaMailSender를 직접 Bean으로 등록하고, 설정 값을 주입받도록 구성했다.

@Configuration
public class MailConfig {

    @Value("${spring.mail.host}")
    private String host;

    @Value("${spring.mail.port}")
    private int port;

    @Value("${spring.mail.username}")
    private String username;

    @Value("${spring.mail.password}")
    private String password;

    @Bean
    public JavaMailSender javaMailSender() {
        JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
        mailSender.setHost(host);
        mailSender.setPort(port);
        mailSender.setUsername(username);
        mailSender.setPassword(password);

        Properties props = mailSender.getJavaMailProperties();
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true");

        return mailSender;
    }
}

이후 정상적으로 아래와 같은 로그가 출력되었고, 이메일도 성공적으로 발송되었다.

✅ 메일 설정 확인:
➡ Host = smtp.gmail.com
➡ Port = 587
➡ Username = coldrice99@gmail.com

✍️ 마무리

이번 경험을 통해 Spring Boot의 자동 설정은 무조건 되는 것이 아니라 조건부로 작동함을 다시금 깨달았다.
특히 외부 설정값(yml)에만 집중하다 보면, 실제로 그것을 사용하는 객체가 없어서 생기는 문제를 놓칠 수 있다.

profile
서두르지 않으나 쉬지 않고

0개의 댓글