Backend

[Java Springboot] 이메일 발송 API 만들기

사과만쥬 2024. 7. 15. 09:00

SSAFY에서 프로젝트를 하면서 1:1 문의를 이메일로 받을 수 있게끔 처리했다.

그 API를 작업하려고 한다.

난이도는 크게 어렵지 않다. 금방 할 수 있는 수준.

 

사전에 필요한 것(Backend)

1. 최소한의 Java및 Springboot 사용 지식

2. Intellij Ultimate

 

개발 버전

Java 17

Springboot 3.3.0

 

 

 

1. Backend 작업

1) 의존성 설치

build.gradle 파일

 

Spring Boot Starter Mail을 이용하였다.

여러 방법이 있겠지만, Gmail의 SMTP 서버를 활용하여 이메일을 발송하는 방법을 이용해보고자 한다.

관련 의존성을 build.gradle 파일에 잘 넣어서 gradle을 reload 시켜주면 된다.

implementation 'org.springframework.boot:spring-boot-starter-mail'

 

2) DTO 작업 진행

DTO(Data Transfer Object)란?

Data Transfer Object의 약자로, 프로세스 간에 데이터를 전달하는 용도의 객체를 의미한다.

사용하는 이유에는 여러 가지가 있겠으나, 나는 기존 프로젝트에서 프론트-백 통신 시 원하는 데이터만 주고받기 위해 사용하였다.

현재 Git에 올라가 있는 내 프로젝트를 보면 매번 DTO를 다르게 설정하였다.

아래 첨부한 예시 이미지는 게시판 DTO인데, 게시글 작성과 게시글 수정 시 보내주는 데이터가 달라서 그렇게 작성하였다.

 

 

그러나 이 API의 경우 DTO가 하나밖에 필요하지 않아, DTO 디렉토리에 필요한 DTO 파일만 작성하였다.

 

QnaRequestDto.java

package org.example.async_pjt.qna.dto;

import lombok.Getter;

@Getter
public class QnaRequestDto {
    private String email;
    private String content;
}

 

나의 경우에는 1:1 문의였기 때문에, 답변받을 사람의 이메일 주소와 질문한 이메일 내용이 필요했다.

 

3) application.properties 파일 수정하기

이메일을 받으려면 이메일을 받기 위한 설정들이 필요하다.

이를 작업하기 위해 아래와 같은 설정들을 먼저 해줘야 한다.

 

 

1. 메일에 들어가서 우측 상단의 톱니바퀴 버튼을 클릭한다.

 

2. 여기서 모든 설정 보기를 클릭하여 전달 및 POP/IMAP으로 들어가 설정을 아래와 같이 변경해 준다.

이 설정이 끝나면 2단계 인증을 진행해줘야 한다.

 

3. 계정을 클릭합니다.

 

 

4. 검색창에 [앱 비밀번호]를 입력합니다.

 

5. 앱 이름을 입력하고 만들기 버튼을 클릭합니다.

클릭하면 아래와 같이 16자 알파벳으로 만들어진 비밀번호가 나오는데, 이걸 메모장에 잘 정리해 둡니다.

 

이렇게 받은 정보들을 application.properties에 잘 넣어줍니다.

 

 

application.properties를 아래와 같이 수정합니다.

spring.mail.host=smtp.gmail.com
spring.mail.port=587 // 사람마다 다를 수 있음.
spring.mail.username=사용한 이메일
spring.mail.password=16자리 앱 비밀번호
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.timeout=5000
spring.mail.properties.mail.smtp.starttls.enable=true

 

 

 

모든 셋팅이 끝났으면 Controller단하고 Service단을 수정합니다.

QnaService.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;

@Service
public class QnaService {

    @Autowired
    private JavaMailSender mailSender;

    public void sendMessage(String email, String content) {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setTo("문의를 받아야 할 사람의 이메일");
        message.setReplyTo(email); // 보내는 사람의 이메일(프론트단에서 이메일 입력으로 받음)
        message.setText(content); // 이메일 내용
        message.setSubject("이메일 문의");

        mailSender.send(message);
    }
}

 

QnaController.java

import org.example.async_pjt.qna.dto.QnaRequestDto;
import org.example.async_pjt.qna.service.QnaService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class QnaController {

    @Autowired
    private QnaService qnaService;

    @PostMapping("/api/v1/qna")
    public String sendQna(@RequestBody QnaRequestDto qnaRequestDto) {
        qnaService.sendMessage(qnaRequestDto.getEmail(), qnaRequestDto.getContent());
        return "문의가 성공적으로 전송되었습니다.";
    }
}

 

위와 같이 설정 후 테스트를 진행합니다.

 

 

로컬에서 간단하게 테스트를 진행했습니다.

이메일이 잘 도착한 것 역시 확인할 수 있습니다.

 

 

그러나 이 API의 경우에도 문제점이 하나 있는데, 

위의 파일을 다시 보면, 

 

 

전송하는데 시간이 4초나 걸림을 확인할 수 있습니다.

이 문제를 해결하기 위해 비동기 처리를 스프링부트에서 시도할 예정인데, 이것은 다음 게시글을 통해 다뤄보도록 하겠습니다.