API상태 확인을 위해서 이런 저런 API를 하나하나 실행해 보고있던 중, 저번달엔 잘만 되던 네이버 메일전송이 에러를 뿜어냈다.
여기저기 포스팅을 일단 에러를 이용해서 찾아보았는데
그냥 3POP설정 사용으로 해결했다는 사례도 있었고,
2월 12일 기준 네이버 웍스 외부 앱 비밀번호 사용으로 해결하라는 NAVER측 답변이 달린 질문도 보았지만,
두 방법 모두 내 프로젝트에는 적용해도 성과가 없었다.
기존의 네이버 smtp를 이용할 때 네이버계정 email과 password를 기반으로 smtp에 접근해 nodeMailer로 만들어진 NestJs MailerModule을 이용해서 이메일을 전송했었다.
MailerModule.forRootAsync({
useFactory: () => ({
transport: {
host: 'smtp.naver.com',
port: 587,
auth: {
user: process.env.EMAILADDRESS,
pass: process.env.EMAILPASSWORD,
},
},
defaults: {
from: `'TaeHyeongBNB' <${process.env.EMAILADDRESS}>`,
},
}),
}),
env를 살펴보고 내 메일을 살펴보았을 때 password에는 이상이 없었는데 왜 접근이 안될까? 분명 저번달까지만 해도 문제없었는데.
혹시 password가 내가 기억하는 다른 password인가? 싶어서 직접 naver에서 로그아웃을 하고 새로 로그인을 진행했다.
그런데! password가 틀린것은 아니었지만, 최근에 네이버 계정에 따로 설정한 것이 눈에 보였다.
계정에 대한 2단계 인증 휴대폰 어플인증이었다. 최근 내 네이버메일을 누군가의 해킹시도로 비밀번호 실패 본인인증 절차를 격게되어 2단계 인증을 설정했었다.
생각해보면 내 프로젝트에서 smtp에 내 naver계정에 접근해서 메일을 보내려면 매번 2단계 인증이 적용되어야만 보낼 수 있을 것이다.
따라서 email주소와 password가 문제가 없었더라도, 인증절차의 추가로 인해 따로 smtp관련 내용을 건드리지 않았지만, 계정엑세스로 인해 직접적인 영향을 주는 상황이 되어버린 것이었다.
이 상황을 해결하기 위해 따로 smtp에 접근할 수 있는 비밀번호로 어플리케이션 전용 비밀번호를 설정하게 되었다.
네이버ID >> 보안설정 >> 2단계 인증 관리 >> 애플리케이션 비밀번호 관리 >> 비밀번호 생성
위의 과정을 통해 SMTP에서 사용할 비밀번호를 생성하고 env에 값을 재설정 해주니 정성적으로 메일이 발송되는 것을 확인할 수 있었다.
위 오류를 해결하면서 의문점이 들었다. 나는 분명 메일전송에 대한 testcode를 작성하였지만, 위와 같은 문제가 발생할 때 test를 아무리 하였다해서 문제를 걸러내지 못했다.
testcode에서 실질적으로 메일을 보내는 로직은 받는 인자도 검증하고 해당 함수가 불려지는지는 검증하지만, 실제로 메일을 보내진 않는다.
실제 메일을 매번 보낸다면 만약 CI과정에서 marge할때 마다 test메일을 보내고 요금이 계속 부과될 것이기 때문에 mailerService.send()와 같은 함수는 jest.fn() 모킹을 통해서 유추하는 값을 반환하게끔 작성해준다.
그렇다면? 이건 제대로 테스트 한게 맞는건가?? 아직도 나는 테스트 코드를 작성하고 있지만, 항상 의문이 들 때가 많은데 어느것이 정답인 것인지 잘 모르겠다.