Overivew
- 알림을 비동기로 처리하여, 실패의 여부와 무관하게 알림을 보낼 수 있고, 신속하게 처리 가능합니다
시나리오
- 현재 동기식으로 로직이 처리된다
- AOP를 신고하는 메서드에 적용시켜, 해당 API가 실행되면 디스코드의 report 채널에 알림이 가게한다
AOP
@Aspect
@Slf4j(topic = "AspectModule")
@Component
@RequiredArgsConstructor
public class AspectModule {
private final UserService userService;
private final DiscordMessageService dms;
@Before("execution(public * com.sparta.doguin.domain.report.service.ReportService.report(..))")
public void before(JoinPoint jp) {
ReportRequest.Report reqReport = (ReportRequest.Report) getArg(jp,1);
User reportUser = (User) getArg(jp,0);
User reportedUser = userService.findById(reqReport.reporteeId());
dms.sendMsgReportChannel(reportUser.getId(),reportedUser.getId(), reqReport.title(),reqReport.content());
}
private Object getArg(JoinPoint jp, int order) {
return jp.getArgs()[order];
}
}
신고하는 메서드
@PostMapping
public ResponseEntity<ApiResponse<Void>> report(@AuthenticationPrincipal AuthUser authUser, @RequestBody ReportRequest.Report reportRequest) {
User user = User.fromAuthUser(authUser);
Long start = System.currentTimeMillis();
reportService.report(user, reportRequest);
Long end = System.currentTimeMillis();
System.out.println("Start - end ? " + (end - start));
return ApiResponse.of(ApiResponse.of(ApiResponseReportEnum.REPORT_RECEIVED_SUCCESS));
}
먼저 동기식으로 처리하였을때의 속도차이를 알아보자

- 461ms가 걸린모습이다

- 디스코드에도 정상적으로 진행된 모습이다
이번에는 비동기식으로 처리하여보자
@Async
@Before("execution(public * com.sparta.doguin.domain.report.service.ReportService.report(..))")
public void before(JoinPoint jp) {
ReportRequest.Report reqReport = (ReportRequest.Report) getArg(jp,1);
User reportUser = (User) getArg(jp,0);
User reportedUser = userService.findById(reqReport.reporteeId());
dms.sendMsgReportChannel(reportUser.getId(),reportedUser.getId(), reqReport.title(),reqReport.content());
}
- 기존 AOP코드에 @Async만 달아주었다

- 461ms -> 63ms 로 응답속도가 개선됨을 확인 할 수 있다
나는 오늘 무엇을 알았는가?
- 처음에 알림 기능을 구현할때 다들 이벤트 리스너로 하길래, 나도 이벤트 리스너로 하려고하였다
- 하지만 난 세부적인 범위에서 처리하는것이 아닌, 그냥 단순히 신고 메서드가 호출됐을때 로그를 남기고, 디스코드 알림에게만 가면 충분하였기에 AOP로 구현 할 수 있었다
- AOP를 사용함으로써 신성한 비즈니스 로직을 더럽히지않고, 관심사 분리를 통해 내가 원하는 바를 이룰 수 있었다