본문 바로가기
Dev/Backend

[Spring] 이메일 전송 로직 구현하기

by haerr 2025. 1. 24.

이번 방학에 진행 중인 프로젝트에서 "제보하기"를 통해 사용자의 제보가 이메일로 전송되는 기능을 맡았다.

사실 별 거 아닌 쉬운 과정이긴 하지만... 스프링으로 이메일이 전송되는 게 개인적으로 신기하고 재밌었어서 포스트로도 남겨보려 한다. 

 

우선 해당 기능의 와이어프레임은 다음과 같다.

 

 

UserController에 엔드포인트 추가

@PostMapping("/report-event")
@Operation(summary = "이벤트 제보 API", description = "이벤트를 제보합니다.")
public ApiResponse<String> reportEvent(
    @Valid @RequestBody UserRequestDTO.UserReportRequestDTO request) {
        userCommandService.reportEvent(request);
        return ApiResponse.onSuccess("이벤트 제보가 성공적으로 전송되었습니다.");
    }

 

 

RequestDTO 작성

public class UserRequestDTO {
    @Getter
    public static class UserReportRequestDTO {
        @NotBlank(message = "이벤트명을 입력해주세요.")
        private String eventName;

        @NotBlank(message = "애니메이션명을 입력해주세요.")
        private String animationName;

        private String additionalInfo;
    }
}

 

추가 정보는 선택사항이라 따로 validation을 추가하지 않았다.

 

UserCommandService 작성

public interface UserCommandService {
    void reportEvent(UserRequestDTO.UserReportRequestDTO request);
}

 

 

UserCommandServiceImpl로 서비스 구현

@Service
@RequiredArgsConstructor
public class UserCommandServiceImpl implements UserCommandService {
    private final UserRepository userRepository;
    private final EmailUtil emailUtil;

    @Override
    @Transactional
    public void reportEvent(UserRequestDTO.UserReportRequestDTO request) {
        String subject = "[이벤트 제보] " + request.getEventName();
        String content = String.format(
                "이벤트명: %s\n애니메이션명: %s\n추가사항: %s\n",
                request.getEventName(),
                request.getAnimationName(),
                request.getAdditionalInfo() == null ? "없음" : request.getAdditionalInfo()
        );

        // 이메일 전송
        emailUtil.sendEmail("otakumap0123@gmail.com", subject, content);
    }
}

 

EmailUtil 작성

혹시나(?) 재사용될 가능성을 고려해 util 디렉토리 안에 작성했다.

@Component
@RequiredArgsConstructor
public class EmailUtil {
    private final JavaMailSender mailSender;

    public void sendEmail(String to, String subject, String content) {
        try {
            SimpleMailMessage message = new SimpleMailMessage();
            message.setTo(to);
            message.setSubject(subject);
            message.setText(content);
            mailSender.send(message);
        } catch (MailException e) {
            throw new RuntimeException("Failed to send email.", e);
        }
    }
}

 

 

** build.gradle에 다음 의존성 설정이 돼있는지도 확인할 것.

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-mail'
}

 

 

** application.yml에 SMTP 서버 설정이 있는지도 확인

spring:
  mail:
    host: smtp.gmail.com
    port: 587
    username: your-email@gmail.com
    password: your-email-password
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true

 

 

테스트 결과

swagger로 테스트
200 응답
메일 확인!

 

재미지다...