[SpringBoot] JavaMailSender 자동 주입 불가 오류

smlee·2022년 7월 10일
2

에러 일지

목록 보기
10/24

👀 문제 상황

네이버 SMTP를 사용하여 이메일 인증을 구현하려고 했다.
이 때, JavaMailSender를 사용하여 이메일을 보낼 수 있도록 하였다. 이 과정에서 application.yml에 이메일 전송을 위한 정보를 저장하였다. application.yml에 담겨있던 코드는 밑과 같았다.

spring:
  mail:
    host: smtp.naver.com
    port: 465
    username: {YOUR_NAVER_ADDRESS}
    password: {YOUR_NAVER_PASSWORD}
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true

그리고 빌드를 하여 테스트를 해보았더니 다음과 같은 오류가 발생하였다.

Consider defining a bean of type 'org.springframework.mail.javamail.JavaMailSender' in your configuration.

이는 Configuration을 찾지 못해 생긴 오류였다. 그래서 해결책으로 @Autowired 어노테이션을 달아주었더니 다음과 같은 오류를 보았다.


자동주입을 할 수 없다는 에러였다. 하지만, build.gradle에 implementation 'org.springframework.boot:spring-boot-starter-mail'라는 의존성이 추가되어 있었고, application.yml도 제대로 되어있었다.

💻 해결

에러 메세지를 보면 'JavaMainSender' 타입의 bean을 찾을 수 없습니다.라는 문구가 보일 것이다. 즉, JavaMailSender 타입의 bean을 새로 등록하면 된다는 생각을 하였다.

따라서 config를 관리하는 디렉터리에 mail이라는 디렉터리를 만들고 MailConfig.java를 만들어주었다.

@Configuration
public class MailConfig {
    @Bean
    public JavaMailSender javaMailService() {
        JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();

        javaMailSender.setHost("smtp.naver.com");
        javaMailSender.setUsername("네이버 SMTP 설정 이메일");
        javaMailSender.setPassword("네이버 계정 비밀번호");

        javaMailSender.setPort(465);

        javaMailSender.setJavaMailProperties(getMailProperties());

        return javaMailSender;
    }

    private Properties getMailProperties() {
        Properties properties = new Properties();
        properties.setProperty("mail.transport.protocol", "smtp");
        properties.setProperty("mail.smtp.auth", "true");
        properties.setProperty("mail.smtp.starttls.enable", "true");
        properties.setProperty("mail.debug", "true");
        properties.setProperty("mail.smtp.ssl.trust","smtp.naver.com");
        properties.setProperty("mail.smtp.ssl.enable","true");
        return properties;
    }
}

위와 같이 @Configuration@Bean을 사용하여 수동으로 스프링 컨테이너를 등록하였다.

0개의 댓글