https://bergerac.tistory.com/115
여기에서 설명했던 WebFlux를 바탕으로 실제 구현 중 오류가 발생하였다.
📌 기술 스택: Spring Boot 3.4.5, Java 17, WebFlux, Gmail SMTP, JavaMailSender
1. 상황개요
Spring Boot 기반 프로젝트에서 회원가입 이메일 인증 기능을 구현 중이었다.
JavaMailSender를 통해 인증 메일을 Gmail SMTP 서버를 통해 발송하려고 했는데, 애플리케이션 실행 도중 아래와 같은 오류가 발생했다.
Error creating bean with name 'mailServiceImpl':
Unsatisfied dependency expressed through constructor parameter 0:
No qualifying bean of type 'org.springframework.mail.javamail.JavaMailSenderImpl' available
해당 오류는 MailServiceImpl Class에서 JavaMailSenderImpl 의존성을 주입하려 했으나, Spring 이 해당 빈을 찾지 못하였다는 뜻이다.
2. 1차 문제 조치
// Before
private final JavaMailSenderImpl javaMailSender;
// After
private final JavaMailSender javaMailSender; // ✅ 인터페이스로 교체
JavaMailSender로 타입을 변경하자 스프링 부트의 spring.mail.* 설정이 정상적으로 반영되었다.
3. 2차 문제 발생
AUTH LOGIN failed
이메일 전송 실패: Authentication failed
원인 분석:
- Gmail은 일반 비밀번호 방식 로그인은 보안상 허용하지 않음
- 앱 비밀번호(App Password) 를 사용해야만 외부 SMTP 요청을 허용함
4. 2차 문제 조치
@Bean
public JavaMailSender javaMailSender() {
// JavaMailSender의 기본 구현체 생성
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
mailSender.setHost(host);
mailSender.setPort(port);
mailSender.setUsername(username);
mailSender.setPassword(password);
//password 부분 확인
}
여기서 mailSender.setPassword(password) 부분에 password 대신 google 에서 인증받은 앱 비밀번호를 직접 넣어서 구현했더니 동작이 되었다. 그래서 password 관련하여 설정이 잘못되어 있다는 사실을 알게 되었다. (단 이런 방식은 권장되지 않으며 DEBUG 시에 일회성으로 구현하기를 권장함!!)
이후 위의 코드 중 오타가 있음을 발견하게 되었다.
@Value("${spring.mail.host}")
private String host; // 이메일 서버의 호스트 주소
@Value("${spring.mail.port}")
private int port; // 이메일 서버가 사용하는 포트 번호 (587)
// 인증 정보
@Value("${spring.mail.username}")
private String username;
@Value("${spring.mail.password}")
private String password;
위의 인증정보 코드에서 @Value("${spring.mail.password}") 부분에 password 에 오타가 있어서 제대로 해당 값을 받아올 수 없었던 것이다.
해당 부분을 해결하고 나니 postman 에서 google로 다음과 같이 인증메일이 왔다.


결국 인증하는데 성공했다.
오타...가 사실 프로그래밍하는데 제일 치명적인것 같다. 그래도 변수 하나하나를 검증해보면서 Error 을 해결하려다 보면 또 발견할 수 있는 것 같다.
'웹개발 > SpringBoot' 카테고리의 다른 글
| SpringBoot 검색기능+Enum활용 (0) | 2025.05.31 |
|---|---|
| Spring Boot + MySQL로 구현한 Student CRUD (1) | 2025.05.30 |
| Spring WebFlux의 개념과 구조적 특징 (1) | 2025.05.29 |
| JWT(JSON Web Token) (0) | 2025.05.28 |
| Security (0) | 2025.05.27 |