이번 방학에 진행 중인 프로젝트에서 "제보하기"를 통해 사용자의 제보가 이메일로 전송되는 기능을 맡았다.
사실 별 거 아닌 쉬운 과정이긴 하지만... 스프링으로 이메일이 전송되는 게 개인적으로 신기하고 재밌었어서 포스트로도 남겨보려 한다.
우선 해당 기능의 와이어프레임은 다음과 같다.

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
테스트 결과



재미지다...
'Dev > Backend' 카테고리의 다른 글
| [Springboot] Spring IoC 컨테이너 쉽게 이해하기 (2) | 2025.04.06 |
|---|---|
| RESTful API란? (0) | 2025.03.31 |
| [Node.js / TypeScript] 발생한 문제와 해결 방법들 (2) | 2024.08.26 |
| [Node.js / TypeScript] 프로젝트 회고와 소회 그 사이 (1) | 2024.08.26 |
| [TypeScript/TypeORM] Entity.ts 작성하기 (1) | 2024.07.24 |