본문 바로가기

개발/Java & Spring

[Spring boot] Spring boot로 이메일 보내기(Spring boot starter, JavaMailSender, JSP, Gradle) - 개발일기A[1]

13인치 그램으로 4년을 버티고,
이제 에디터 프로그램도 느려져서 결국 맥북을 질러버렸당
당분간 빚쟁이입니다 흑흑,,

다행이 금방 배송왔고 드디어 스프링 부트 프로젝트를 시작할 수 있게 되었당당당
아직 스프링 프레임워크에 대해서 완전하게 아는게 아니라 걱정이 됐는데,
워낙 내 스타일이 뭘 개발하면서 공부해야 잘되는 스타일이라 일단 부딪혀 보기로 함!

 

 

 

spring boot starter + gradle 기반으로 진행하였다.
maven 기반의 스프링만 쓰다가 적응하려니까 완전 머리 뽀개지는줄 ㅠㅠㅠ
xml로 DI 하는거 좋아했는데 다시 자바기반도 공부하고,, 프로퍼티 공부도 하고,,

어찌됐든 시작부터 오래걸렸단 얘기를 구구절절 해봤다 ㅋㅋㅋㅋㅋㅋ

제가 진행하고 있는 프로젝트 설명은 그냥 생략하고!

일단 메인부터 차근차근 만들어보려고 한다.
View는 부트스트랩 오픈소스 + JSP로 구현하였고, 일단 메인부터 만들어 보았다

"사담을 생략하고 싶으시면 굵은 글씨만 보아주세요"

 

 

 

메인페이지.jsp @Copyright a1010100z@naver.com

 

 

 

오늘 내 목표는 하단 이메일 칸에 이메일을 남기면 나한테 이메일이 오도록 구현하는 거!
이 서비스를 이용하려면 이메일 남겨서 나한테 상담 요청해라 라는 기능이다.

자료 찾아봤더니 되게 많이 나와서 금방할 줄 알았는데 하루 종일 걸렸구용 ,, 역시 개발은 삽질의 연속 

스프링은 메일 발송 기능을 위한 MailSender 인터페이스를 제공하고 있다.
이 MailSender인터페이스는 SimpleMailMessage를 전달받아  단순 텍스트 메일 전송 기능을 제공한다.

우리는 이 MailSender 인터페이스를 상속받은 JaveMailSender을 사용하고자 한다.
JavaMailSender은 MimeMessage를 이용해서 메일을 발송하는 기능을 추가적으로 정의한다!

먼저 의존성을 추가해 주겠다.
저처럼 기초 공부 미리 안하고 부딪혀보는 분들을 위해 상세히 설명하겠슴당 

spring boot starter에는 보면 아시다시피 pom.xml 이 없다.
의존성 클릭만으로도 이것저것 추가해서 좋아했더니 어디다가 넣어야하나 한참 해맴.

build.gradle 파일에 의존성을 추가해줍니다.
왜냐면 우린 maven기반이아니라 gradle 기반이니깐
(그 차이점은 나도 이제 공부해보려고 한다. 여기 정리가 잘 되어있는 것 같네요)
http://bkim.tistory.com/13

 

 

 

 

 

다시 돌아와서 
build.gradle에 

 

 

 

dependencies { 	
    compile("org.springframework.boot:spring-boot-starter-mail")
  	compile "org.springframework:spring-context-support"
  	compile "com.sun.mail:javax.mail"
}

 

 

이렇게 세개의 의존이 필요합니다.
추가한 뒤 
프로젝트 오른쪽 클릭 -> gradle -> refreshAll 
하시고 라이브러리-gradle dependencies에 추가되었나 확인해주세요

 

 

 

그런다음 이메일을 실제로 전송할 기능을 구현할 클래스를 만듭니다.
EmailServiceImpl.java

 

 

 

@Service
@RequiredArgumentConstructor
public class EmailServiceImpl {

	private final JavaMailSender emailSender;
	
    public void sendSimpleMessage(String to, String subject, String text) {

       SimpleMailMessage message = createMessage(to, subject, text)
        try{//예외처리
        	emailSender.send(message);
        }catch(MailException es){
        	es.printStackTrace();
            throw new IllegalArgumentException();
        }
    }
    
    private SimpleeMailMessage createMessage(String to, String subject, String text){
    	SimpleMailMessage message = new SimpleMailMessage();
        message.setTo(to);//보낼 대상
        message.setSubject(subject);//제목
        message.setText(text);//내용
        return message;
    }
}

자, 여기서 emailSender를 사용하려면 JavaMailSender를 막 주입해줘야 할 것 같쥬?
제 컨트롤러를 잠깐 보시면

 

 

 

@Controller
@RequiredArgumentConstructor
class Controller{

    private final EmailService emailService;
	
	@RequestMapping(value="/mail", method=RequestMethod.POST)
	public String home3(HttpServletRequest req){
		emailService.sendSimpleMessage("메일주소","제목" , "내용");		
		return "index";
	}
}

이런식으로 컨트롤러 내부에서 JavaMailSender 을 자동주입처리 시켜놨습니다.
이제 저 JavaMailSender을 Bean으로 생성해볼게요

Spring boot로 개발을 진행하려면 Java 기반 코딩에 익숙해지는 것이 좋다고한다.
이럴줄 알았으면 처음 배울 때 자바기반으로 좀 할 걸 그랬다

Config.java

 

import java.util.Properties;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.stereotype.Component;

@Component
@PropertySource("classpath:mail.properties")
public class Config {
	
	Properties pt=new Properties();
	
    @Value("${mail.smtp.port}")
    private int port;
    @Value("${mail.smtp.socketFactory.port}")
    private int socketPort;
    @Value("${mail.smtp.auth}")
    private boolean auth;
    @Value("${mail.smtp.starttls.enable}")
    private boolean starttls;
    @Value("${mail.smtp.starttls.required}")
    private boolean startlls_required;
    @Value("${mail.smtp.socketFactory.fallback}")
    private boolean fallback;



	 @Bean
	 public JavaMailSender javaMailService() {
	       JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
	       javaMailSender.setHost("smtp.gmail.com");
	       javaMailSender.setUsername("gmail계정");
	       javaMailSender.setPassword("gmail 계정 비밀번호");
	       javaMailSender.setPort(port);
	        
	       pt.put("mail.smtp.socketFactory.port", socketPort); pt.put("mail.smtp.auth", auth);
	       pt.put("mail.smtp.starttls.enable", starttls); pt.put("mail.smtp.starttls.required", startlls_required);
	       pt.put("mail.smtp.socketFactory.fallback",fallback);
	       pt.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
	       javaMailSender.setJavaMailProperties(pt);       
	       javaMailSender.setDefaultEncoding("UTF-8");
	       return javaMailSender;
	 }
	    

}

여기서 얼마나 오류로 해맸는지 모른다 ㅠㅠ
분명 하라는데로 하고 레퍼런스도 다 뒤졌는데 똑같은 에러 ,,
해답은 저기 저 프로퍼티파일에 있었다!
저처럼 헤매는 사람이 없길 바라요..

java/main/resources 밑에 프로퍼티 파일을 하나 추가해주세요
mail.properties

 

mail.smtp.auth=true
mail.smtp.starttls.required=true
mail.smtp.starttls.enable=true
mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
mail.smtp.socketFactory.fallback=false
mail.smtp.port=465
mail.smtp.socketFactory.port=465

다 했다 이제 입력 폼에 이메일을 넣고 ! 버튼을 누르면 내 gmail 계정으로 대상 메일에 메일이 도착한 걸 확인할 수 있다

-끝-

큰 고비를 한번 넘은 기분이다! 뭔데 시작부터 어려워ㅠㅠㅠ
이 프로젝트가 끝났을 때쯤 고수는 아니더라도 중수까진 되어있길 바라는 마음입니당 ..


그래서 오늘의 느낀점
1. Gradle이 뭔지부터 좀 알자
2. @Component vs @Configuration 알아보자
3. 의존성 자동 주입(@Autowired, @Inject 등등) 다시 체크하자!