스프링 이벤트

반응형
반응형

스프링 이벤트(Spring Events)는 애플리케이션 내에서 컴포넌트 간의 느슨한 결합(loose coupling)을 유지하면서 비동기적 또는 동기적으로 메시지를 전달하는 메커니즘입니다.

스프링의 Observer 패턴 기반으로 동작하며, 특정 이벤트가 발생했을 때 이를 감지하고, 이에 대한 처리를 수행하는 구조입니다.

1. 스프링 이벤트의 구조

  • Event (이벤트): 발생한 상황을 나타내는 객체. ApplicationEvent를 상속하거나 일반 POJO로도 이벤트를 정의 가능.
  • Publisher (발행자): 이벤트를 발생시키는 주체. ApplicationEventPublisher를 사용해 이벤트를 발행.
  • Listener (리스너): 이벤트를 구독하고 처리하는 주체. @EventListener 어노테이션으로 구현.

2. 이벤트의 동작 흐름

  1. 이벤트 객체 생성: 특정 상황에 대한 정보를 담는 객체.
  2. 이벤트 발행 (Publish): ApplicationEventPublisher.publishEvent(event) 메서드를 통해 이벤트 발행.
  3. 이벤트 리스닝 (Listen): @EventListener가 붙은 메서드가 이벤트를 감지하고, 이벤트를 처리.

3. 예시 코드

// 1. 이벤트 객체 정의
public class UserRegisteredEvent {
    private final String username;

    public UserRegisteredEvent(String username) {
        this.username = username;
    }

    public String getUsername() {
        return username;
    }
}

// 2. 이벤트 발행자 (Publisher)
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;

@Service
public class UserService {
    private final ApplicationEventPublisher publisher;

    public UserService(ApplicationEventPublisher publisher) {
        this.publisher = publisher;
    }

    public void registerUser(String username) {
        System.out.println(username + " 등록 완료!");
        publisher.publishEvent(new UserRegisteredEvent(username));
    }
}

// 3. 이벤트 리스너 (Listener)
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

@Component
public class WelcomeEmailListener {

    @EventListener
    public void sendWelcomeEmail(UserRegisteredEvent event) {
        System.out.println("Welcome email sent to " + event.getUsername());
    }
}

4. 실행 결과

john 등록 완료!
Welcome email sent to john

5. 스프링 이벤트의 장점

  • 느슨한 결합(Loose Coupling): 발행자와 리스너가 서로의 존재를 모른 채로 독립적으로 동작.
  • 확장성: 특정 이벤트에 여러 리스너를 붙일 수 있어 기능 확장에 용이.
  • 비동기 처리 가능: @Async 어노테이션을 사용해 비동기 이벤트 리스닝 가능.

6. 비동기 이벤트 리스닝 (선택적)

import org.springframework.scheduling.annotation.Async;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

@Component
public class AsyncWelcomeEmailListener {

    @Async
    @EventListener
    public void sendWelcomeEmail(UserRegisteredEvent event) {
        System.out.println("비동기 메일 전송: " + event.getUsername());
    }
}

결론적으로, 스프링 이벤트는 애플리케이션 내의 구성 요소 간 통신을 단순화하고 결합도를 낮춰, 유지보수성과 확장성을 높이는 데 중요한 역할을 합니다.

 

 

반응형

'국비지원 (스파르타)' 카테고리의 다른 글

카프카는 도대체 어떻게 사용하는 걸까?  (2) 2025.03.07
스프링 시큐리티(인증)  (0) 2025.03.05
DDD와 샤딩(feat.gpt)  (0) 2025.02.28
DDD (시작)  (0) 2025.02.27
첫번째 프로젝트 회고  (0) 2025.02.26

댓글

Designed by JB FACTORY