디스코드 알림을 비동기로 처리하여보자

Terror·2024년 11월 1일

최종 프로젝트

목록 보기
14/28

Overivew

  • 알림을 비동기로 처리하여, 실패의 여부와 무관하게 알림을 보낼 수 있고, 신속하게 처리 가능합니다

시나리오

  • 현재 동기식으로 로직이 처리된다
  • AOP를 신고하는 메서드에 적용시켜, 해당 API가 실행되면 디스코드의 report 채널에 알림이 가게한다

AOP

@Aspect
@Slf4j(topic = "AspectModule")
@Component
@RequiredArgsConstructor
public class AspectModule {
    private final UserService userService;
    private final DiscordMessageService dms;

    /**
     * 특정 유저가 어떤 유저를 신고했는지 로그를 보여줌
     *
     * @param jp
     */
    @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를 사용함으로써 신성한 비즈니스 로직을 더럽히지않고, 관심사 분리를 통해 내가 원하는 바를 이룰 수 있었다
profile
테러대응전문가

0개의 댓글