
이메일 인증 기능을 구현하기 위해 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)에만 집중하다 보면, 실제로 그것을 사용하는 객체가 없어서 생기는 문제를 놓칠 수 있다.