[Main-project] 비밀번호 재설정 - 테스트 에러 로그
🧑🏻💻 비밀번호 재설정 테스트 중 발생한 에러 로그
1. Could not autowire. No beans of 'JavaMailSender' type found.
❓ 의존성을 추가하고 yml 작성 후 아래와 같이 필드를 선언하는 데 자꾸 빨간줄이 나타났다.
뭐가 문제인지 찾아보니 대체적으로 yml 설정을 잘못해서 난 에러라고 한다. yml 파일을 몇 번이고 살펴봤지만 딱히 빨갛게 에러도 안 뜨고 gpt에게도 물어봤지만 딱히 좋은 답변도 주지 않아 이걸로 초반에 한참을 시간을 잡아 먹었던 것 같다. 뭔가 문법이 틀린 것 같긴 했는데 도통 그 문제를 찾지를 못했다. 그러다 찾은 문제!
실제로 spring.mail. 이런 식으로 시작되어야 맞는 것인데 내가 띄어쓰기를 하지 않고 딱 붙여 썼으니 yml에 작성한 SMTP에 대한 설정이 인식이 안 됐던 것이다. 그래서 빈을 자꾸 찾을 수 없다고 에러가 났다. 찾고 나니 굉장히 허무했지만 엄격한 yml 파일의 문법에 대해 다시 생각해 볼 수 있는 시간이 됐다고 긍정적으로 생각하기로 했다. 좀 더 머릿속으로 정리 되기도 했고... 다음에는 더 꼼꼼하게 봐야겠다.
2. java.net.SocketTimeoutException: Read timed out
❓컨트롤러, 서비스 로직까지 모두 다 작성하고 최종적으로 포스트맨에서 요청을 보내고 나서 나온 에러. 검색해보니 소켓 통신 시 데이터를 읽을 때 타임아웃이 발생했음을 나타내는 에러라고 한다. 다양한 이유로 발생할 수 있는데 그중에서 서버 응답 시간 초과 설정이 너무 짧게 구성되어 있어도 오류가 발생한다고 한 게 눈에 들어왔다.
timeout 설정은 SMTP 서버와 연결 시도 후 응답을 기다리는 시간을 설정하는 것인데 5000으로 적어놓았으니 5초, 즉 SMTP 클라이언트가 서버에 연결을 시도하고 응답을 받지 못하면 5초 후에 타임아웃될 것임을 의미하는 것이다. 저 시간을 설정하지 않으면 디폴트는 무한대가 된다.
저 시간이 너무 짧게 설정되어 있던 탓에 응답 데이터를 읽다 타임 아웃(Read time out)이 발생한 것이다. 그렇다면 해결 방법은 저 시간을 늘려주거나 없애면 된다. 나는 일단 timeout을 지웠다. 그리고 바로 다음 에러를 만났다.
3. javax.mail.MessagingException: Got bad greeting from SMTP host: smtp.naver.com, port: 465, response: [EOF]
❓2번 에러를 해결하고 다시 실행시키자마자 나온 에러, SMTP 서버가 보안 연결을 요구하는 경우 SSL 또는 TLS를 활성화 해야한다. naver SMTP 서버의 경우 SSL 보안 연결을 필요로 하는데 내가 SSL 활성화를 설정하지 않았기 때문에 나는 에러였다.
ssl.enable : true 설정 추가해주면서 해결 완료인 듯 했으나 만난 다음 에러...
4. org.springframework.mail.MailSendException: Failed messages: com.sun.mail.smtp.SMTPSendFailedException: 554 5.7.1 The sender address is unauthorized FmHdZvs+QxOJwgwR8UKBnw - nsmtp
❓ 이 에러가 제일 해결하는데 애먹었던 것 같다. 이메일 발신자 주소나 발신자 도메인이 SMTP 서버에서 거부되었음을 나타내는 에러라고 한다. 발신자 주소 확인, SMTP 서버에 로그인할 때 사용한 아이디와 비밀번호 올바른지 확인하기 등등 대체적인 해결 방안은 이와 같지만 나는 몇 번이고 확인해도 yml에 작성한 기본 정보들이 틀리지 않았었다.
이러다 이메일 보내는 거 못하는 거 아닌가 불안감이 들 때쯤 찾은 방법 하나, Service 로직에 to(수신자), subject(제목), text(본문) 설정을 해주는데 거기에 from(발신자)에 대한 설정도 같이 하라는 것이었다.
그래서 setFrom() 메서드를 추가하고 yml에 설정한 username을 받아서 이메일 주소를 생성할 수 있도록 해주었다. 하지만 여기에서도 놓친 것이 있었는지 이제는 됐다 싶을 때 다시 아래 에러가 발생했다.
5. java.net.SocketException: Connection or outbound has closed. Failed messages: com.sun.mail.smtp.SMTPSendFailedException: 553 5.7.2 The sender address is not a valid RFC-5322 address GtzcLGnqRT26QKNXifPWYg - nsmtp ; message exceptions (1) are: Failed message 1: com.sun.mail.smtp.SMTPSendFailedException: 553 5.7.2 The sender address is not a valid RFC-5322 address GtzcLGnqRT26QKNXifPWYg - nsmtp
❓여기서 주의해서 봐야할 내용은 The sender address is not a valid RFC-5322 address 이 부분이다. 발신자의 주소가 RFC-5322 표준에 맞지 않아 발생한 것이라고 한다. 여기서 RFC-5322란? 이메일 주소의 형식과 구문을 정의하는 표준이라고 할 수 있다.
즉 InternetAddress 클래스는 이메일 주소 형식의 문자열을 받아서 이메일 주소 객체로 만들어주는 역할을 하는 클래스인데 나는 from으로 아이디만 덜렁 넣어줬으니 이메일 주소 형식에 일치할 리가 없었다. yml 설정 형식 자체가 username 만 적어주는 식이라서 나는 그냥 아래와 같이 문자열로 이메일 주소를 추가해주었다.
>> 완성본을 보고 싶다면 여기로
'SEB_BE_45 > Main-Project' 카테고리의 다른 글
[Main-project] 후회는 없다! 꾸준하게 걸어가자 (0) | 2023.09.25 |
---|---|
[Main-project] SpringBoot - 비밀번호 재설정을 위한 이메일 보내기 1 (0) | 2023.09.03 |
[Main-project] 시작은 미약해도 (0) | 2023.08.31 |