포폴/일정관리앱

일정 관리 프로젝트에 이벤트 드리븐 아키텍처를 적용하며

slown 2025. 4. 21. 18:05

목차

1.왜 이벤트 드리븐인가? (비동기, 느슨한 결합의 필요성)

2.이벤트 드리븐 아키텍처란?

3.일정 관리 프로젝트 구조에 적용하기.

 

1.왜 이벤트 드리븐인가? (비동기, 느슨한 결합의 필요성)

기존의 웹 애플리케이션은 대부분 RESTful API 기반의 동기식 통신 구조를 사용합니다. 이 방식은 구조가 단순하고 개발이 쉽지만, 다음과 같은 단점이 있습니다.:

  • 서비스 간 강한 결합도 발생
  • 기능 추가/변경 시 기존 코드 수정이 필요
  • 처리 속도 저하 (모든 후처리를 요청 스레드에서 처리함)

예를 들어, 내가 개발 중인 일정 관리 프로젝트에서는 단순히 일정을 생성하는 것뿐 아니라, 다음과 같은 후처리 작업이 필요했습니다:

  • 실시간 WebSocket 알림 전송
  • 반복 일정 자동 생성
  • 회원가입시의 이메일 발송
  • 일정 변경/삭제에 따른 연관 작업 처리

이러한 작업을 모두 동기 방식으로 처리하면 각 기능이 하나의 서비스 클래스에 얽히며 코드가 점점 비대해지고 유지보수가 까다로워집니다. 또한, 후처리 중 하나라도 실패하면 전체 트랜잭션이 롤백될 수 있는 위험이 존재합니다. 이런 문제를 해결하기 위해 이벤트 드리븐 아키텍처를 도입하게 되었습니다.

2.이벤트 드리븐 아키텍처란?

이벤트 드리븐 아키텍처(Event-Driven Architecture, EDA)는 "이벤트 발생 → 이벤트 수신 → 이벤트 처리" 흐름으로 시스템이 동작하는 구조입니다. 서비스를 직접 호출하는 대신, 이벤트를 발행하고, 다른 서비스(또는 모듈)가 그 이벤트를 구독(Subscribe) 하여 후속 작업을 수행합니다. 이벤트에 관한 장단점은 아래와 같습니다.

 

장점

  • 서비스 간 결합도 감소 → 독립적 배포 가능
  • 새로운 기능 확장 시 기존 코드 건드릴 필요 없음
  • 장애 전파가 적음 (비동기 처리)

단점

  • 시스템 구조가 복잡해짐
  • 디버깅/로그 추적 어려움 → 분산 트레이싱이 필요 
  • 트랜잭션 처리 어려움 → 보상 처리(Saga) 필요

3.일정 관리 프로젝트 구조에 적용하기.

지금 현재 내가 만들고 있는 일정관리 프로젝트에 이벤트를 적용해 보겠습니다. 다음은 회원가입을 하게 되면 회원가입 축하의 이메일을 보내는 로직을 이벤트에 적용을 했습니다. 아래는 적용을 했을때의 다이어그램과 코드입니다.

 

 

3-1. 서비스 로직에서 이벤트를 발행

MemberSignUpEvent memberSignUpEvent = new MemberSignUpEvent(
    createdResult.getId(),
    createdResult.getUserEmail(),
    createdResult.getUserId()
);
eventPublisher.publishEvent(memberSignUpEvent);

 

회원 가입 후 필요한 정보를 담은 이벤트 객체를 생성하고, ApplicationEventPublisher를 통해 이벤트를 발행합니다.

 

3-2. 리스너 후 처리후 비동기 처리.

@Async
@EventListener
public void handleSchedule(MemberSignUpEvent event) {
    sendWelcomeEmail(event);
    saveNotificationToDatabase(event);
    sendRealTimeNotification(event);
}

 

이벤트 리스너는 @Async와 함께 동작하여 비동기적으로 이벤트를 수신하고, 후처리 작업(이메일, 알림 DB 저장, WebSocket 전송 등)을 수행합니다.

 

3-3. 구조의 변화와 장점

 

기존에는 회원가입이라는 단일 동작에 여러 후처리 작업이 얽혀 있어 코드의 응집도가 낮고 유지보수가 어려웠습니다.

이벤트 기반 구조로 변경한 후에는 

  • 회원가입 로직은 단순하게 유지되고,
  • 후처리는 별도의 리스너에서 분리되어 실행되며,
  • 각 기능을 독립적으로 테스트하거나 확장할 수 있게 되었습니다.

이러한 개선을 통해 전체 알림 시스템을 더 견고하고 유연한 구조로 진화시킬 예정입니다. 향후에는 Kafka + WebSocket 기반으로 다음 기능도 확장할 예정입니다:

  • 일정 생성/수정/삭제 시 WebSocket을 통한 실시간 알림
  • Kafka를 통한 알림 이벤트 비동기 처리 안정성 강화
  • DLQ 및 장애 복구 전략 추가 설계

이를 통해 전체 알림 시스템을 보다 견고하고 유연한 이벤트 기반 시스템으로 진화시킬 예정입니다.