이메일 인증 기능을 구현하기 위해 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
이 제대로 로딩되지 않는다고 판단하고 프로파일 설정을 수차례 확인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)에만 집중하다 보면, 실제로 그것을 사용하는 객체가 없어서 생기는 문제를 놓칠 수 있다.