본문 바로가기

DEVELOPER/Spring & JPA

[스프링] 'JavaMailSender'를 통한 이메일 발송 기능 구현 (Gmail SMPT)

지난 포스팅


해당 포스팅에서는 Gmail SMPT를 활용합니다. 아직 Gmail SMPT 설정 방법을 모르신다면, 아래 게시글을 읽어주세요.

2023.03.21 - [DEVELOPER/Programming] - [SMTP] 메일 전송을 위한, Google Gmail SMTP 설정

 

[SMTP] 메일 전송을 위한, Google Gmail SMTP 설정

안녕하세요😎 백엔드 개발자 제임스입니다 :) 최근에 스프링 부트로 웹을 개발하던 중 인증 메일 전송 기능을 구현하게 되었습니다. 항상 웹에서 회원가입을 진행할 때마다 받게 되는 인증 메

kang-james.tistory.com


안녕하세요😎 백엔드 개발자 제임스입니다 :)

오늘은 [스프링 부트에서 Email 전송 기능을 구현하는 방법]을 알아보도록 하겠습니다. 전부터 다른 웹 서비스를 이용할 때마다, 메일 전송 기능에 궁금증이 있었습니다. 다행히도 이번 스프링을 활용하여 개발을 진행하면서 기능을 구현할 기회가 생겼었습니다. 덕분에 방법을 습득할 수 있었는데요. 이번 포스팅을 통해 그 방법과 사용했던 인터페이스들을 소개하도록 하겠습니다.

 

메일 전송 라이브러리 사용을 위한 설정


저번 포스팅에서 Gmail SMTP를 설정하고, 앱 패스워드를 받았습니다. 이렇게 받아온 정보들을 스프링에 적용시켜야 합니다.

의존성(Dependency) 추가

spring-boot-starter-mail을 추가합니다.
Maven(메이븐) 빌드툴 사용 시

Gradle(그래들) 빌드툴 사용 시

Application Properties 설정

저는 resources > application.properties 파일로 설정을 추가했습니다.

  • Gmail SMTP를 활용하기 때문에 mail.username 에는 Gmail 계정을 입력합니다.
  • mail.password에는 Gmail SMTP를 설정하면서 발급받았던 App 패스워드를 작성합니다.
* 중요한 포인트
위와 같이 SMTP 설정을 진행하면, Spring Boot가 자동으로 JavaMailSender를 빈으로 등록합니다.

 

Email 전송을 위한 인터페이스와 기능 구현


기능 구현 전, 인터페이스와 클래스 알아보기

1) 인터페이스 JavaMailSender

이번 Email 전송 기능을 구현 위해서 해당 인터페이스를 활용했습니다. Spring에서 제공하는 JavaMailSender는 웹 애플리케이션에서메일을 손쉽게 보낼 수 있도록 해주는 API입니다.

JavaMailSender 인터페이스에 정의된 메서드

내부에 정의된 메서드를 보면 createMimeMessage()와 send()로 구성되어 있습니다. 이것을 보고 메일을 전송하는 역할이란 것을 대략적으로 알 수 있습니다. 특히 MimeMessage라는 타입을 생성하거나 매개변수 타입으로 이용되는 것이 보입니다.


2) 그렇다면 [MimeMessage]는 무엇일까요?

MIME은 Multi-purpose Internet Mail Extesions의 약자로, 전자 우편을 위한 인터넷 표준 포맷을 의미합니다. 현재 대부분의 전자 우편은 MIME 형식이라고 생각하면 좋습니다. 이러한 MIME 형식은 문자뿐만 아니라 파일을 첨부하여 전송합니다.
기본적으로 SMTP는 7비트 ASCII 문자만을 지원합니다. 즉, 영어 이외의 전자 우편은 전송될 수 없습니다. MIME은 ASCII가 아닌 문자 인코딩을 이용해 영어가 아닌 다른 언어로 된 전자 우편을 보낼 수 있는 방식을 정의합니다. 따라서 해당 포맷으로 변환하여 SMTP로 전송한다면, 다양한 용량의 파일과 문자들을 보낼 수 있게 되는 것입니다.

MimeMessage Docs

위 이미지는 MimeMessage 클래스의 Docs입니다. 요약하자면, 이메일 메시지를 MIME 포맷으로 구현할 수 있도록 도와주는 클래스입니다. 즉, 우리가 전송하는 메일에 단순 텍스트가 아닌 파일 또는 HTML 등을 첨부할 수 있게 되는 것입니다.


추가로 JavaMailSender는 MailSender 인터페이스를 상속받고 있습니다. 따라서 SimpleMailMessage(단순 텍스트 기반 메일)를 전송하는 메서드도 다룹니다.

 

Email 전송 기능 구현

Local 환경에서는 단순 텍스트를 Consol에 출력하도록 구현
Dev 환경에서는 Html 파일을 첨부한 Gmail을 전송하도록 구현

1) Mail 추상화

Service 계층에서 Local 환경과 Dev 환경에 따라 다른 기능을 구현하기엔 코드가 길어지는 문제가 발생했습니다.
따라서 공통부분을 분리하고, 환경에 따라 다른 역할을 수행할 수 있도록 추상화를 진행했습니다.

Local에서와 Dev에서 공통으로 받을 [받는 사람, 메일 제목, 메일 내용]을 필드로 가진 EmailMessage 객체를 만들었습니다. 그리고 이를 매개변수 받고 추상화의 역할을 수행할 EmailService 인터페이스를 생성했습니다. 이제 local과 dev가 상이한 구현체를 만들도록 하겠습니다.

2) [Local 구현체] Consol에 단순 텍스트 출력

로컬 환경 EmailService 구현체

Local 환경에선 테스트 목적이기 때문에 실제로 메일 전송하지 않고, log를 통해 내용을 Consol에 출력하도록 했습니다.

3) [Dev 구현체] Html 파일을 첨부한 Gmail 전송

전송하는 Email에 Html 파일을 첨부하기 위해서 MimeMessage 객체를 활용했습니다. 그리고 이를 전송하기 위해서 위에서 알아봤던 JavaMailSender를 주입받았습니다.

(Properties에 Gmail SMTP 설정을 하면서 자동으로 빈으로 등록되었기 때문에, 바로 주입이 가능합니다.)

* MimeMessageHelper 클래스
MIME 메시지 생성을 위한 도우미 클래스입니다. HTML 레이아웃의 이미지, 일반적인 메일 첨부 파일 및 텍스트 콘텐츠에 대한 지원을 제공합니다.

매개변수로 받아 왔던 이메일 정보(받는 사람, 제목, 내용)를 MimeMessageHelper를 통해 등록합니다. 마지막으로 JavaMailSender의 send 메서드를 통해 Email을 전송할 수 있습니다.

4) Email로 전송할 Html 파일 생성

View Tempalte Engine인 타임리프(Thymleaf) 활용

resources > templates 경로 안에 아래와 같은 메일 전송용 Html 파일을 만들었습니다. Thymleaf의 문법인 'th:'와  '${name}'으로 서버의 데이터를 활용할 수 있습니다. 

5) Email 전송을 수행할 기능 구현

의존성 주입

먼저 Email 전송 기능을 구현할 서비스에 추상화했던 EmailService와 TemplateEngine을 주입합니다. 여기서 TemplateEngine은 뷰 템플릿을 실행할 클래스로, 전송할 Email Html을 문자열로 불러오기 위한 객체입니다.

 

Get Message 메서드

전송할 Email Html 내용을 문자열로 가져오는 과정입니다. 여기서 Context 객체를 활용해서 서버의 데이터를 Html로 전송할 수 있습니다.

SpringMVC의 Model.addAttribute()와 같은 역할을 수행합니다.

 

Email 전송 기능의 메서드

마지막으로 미리 만들어두었던 EmailMessage에 해당 메일을 받을 사용자의 이메일 계정과 제목, 내용을 저장합니다. 이어서 EmailService의 send()를 통해, Local 환경과 Dev 환경인지 체크 후 기능을 수행하게 됩니다.

Email 전송 기능 결과 화면

이전부터 인증 메일 전송에 대해 궁금했는데 이렇게 구현해 보니 정말 뿌듯합니다 :)

이 과정에서 View template을 활용하는 방법과 다양한 스프링 기능, 라이브러리의 Docs를 읽는 재미를 느꼈습니다.


Reference

  • [인프런] 스프링과 JPA 기반 웹 애플리케이션 개발, 백기선 님 강의

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-JPA-%EC%9B%B9%EC%95%B1/dashboard

 

스프링과 JPA 기반 웹 애플리케이션 개발 - 인프런 | 강의

이 강좌에서 여러분은 실제로 운영 중인 서비스를 스프링, JPA 그리고 타임리프를 비롯한 여러 자바 기반의 여러 오픈 소스 기술을 사용하여 웹 애플리케이션을 개발하는 과정을 학습할 수 있습

www.inflearn.com

 

반응형