Spring framework core (6) - ApplicationEventPublisher

2020. 1. 14. 01:08· Java/Spring framework

IoC Container - ApplicationEventPublisher

옵저버 패턴의 구현체로, 이벤트 기반 프로그래밍에 유용한 인터페이스를 제공한다.

Observer pattern

옵저버 패턴엔 행위자, 관찰자가 존재한다.

행위자의 어떤 행동으로 변경 사항이 발생하면 즉시 관찰자에게 알려주는 것이 요점이다.

가장 대표적인 응용 사례는 데이터 바인딩이라고 할 수 있다.

웹 프론트엔드 개발에 가장 많이 사용되는 프레임워크 중 Angular, React 등은 데이터 바인딩을 지원하고 있다.

View가 어떤 데이터를 바라보고 있고, 그 데이터가 변하는 즉시 View도 그 변화를 반영한다.

물론 View가 바뀐 데이터를 반영하는 과정엔 프로그래머의 개입이 필요하지 않다.

Event Publisher / Subscriber

Spring에선 Event를 발생시키는 publisher, Event를 받아서 처리하는 subscriber를 아주 간단하게 구현할 수 있다.

아래와 같이 소스 코드를 작성한다.

  1. Event
    • Event의 정보를 담는 POJO
public class Event {

    private int data;

    public Event(int data) { this.data = data; }

    public int getData() { return data; }
}
  1. AppRunner
    • Spring boot application이 실행된 후 이벤트를 발생시키는 장소
    • ApplicationEventPublisher를 주입받아 활용
    • ApplicationContext도 publishing 가능
@Component
public class AppRunner implements ApplicationRunner {

    @Autowired
    private ApplicationEventPublisher publisher;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        // event publishing
        publisher.publishEvent(new Event(100));
    }
}
  1. EventHandler
    • Event를 처리하는 객체
    • @EventListener Annotation을 붙여서 구현
    • 처리할 객체 (Event)를 매개변수로 받는다.
@Component
public class EventHandler {
    @EventListener
    public void handler(Event event) {
        System.out.println(“Event data : “ + event.getData());
    }
}

결과

Event data : 100

AppRunner 에서 발생시킨 이벤트를 확인할 수 있다.

Multiple Subscriber

이벤트 처리를 하는 곳이 하나 이상일 수도 있다.

그럴 때는 위의 3번과 같은 방법으로 작성하면 된다.

  1. AnotherHandler
    • 위의 3번과 같은 이벤트를 처리할 객체
@Component
public class AnotherHandler {
    @EventListener
    public void handler(Event event) {
        System.out.println(“Another handler : “ + event.getData());
    }
}

결과

Event data : 100
Another handler : 100

Event 처리 순서

위의 방법은 하나의 이벤트를 여러 개의 핸들러에서 처리할 수 있지만 순서는 보장하지 않는다.

순서를 정해주기 위해 @Order 를 활용한다.

AnotherHandler 에만 우선순위를 적용해보자.

  1. AnotherHandler
    • 우선순위 적용
@Component
public class AnotherHandler {

    @EventListener
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public void handler(Event event) {
        System.out.println(“Another handler : “ + event.getData());
    }
}

결과

Another handler : 100
Event data : 100

의도한 대로 AnotherHandler 가 먼저 동작했다.

Ordered 는 인터페이스로, 두 개의 필드와 1개의 구현체로 구성되어 있다.

두 필드값 HIGHEST_PRECEDENCE, LOWEST_PRECEDENCE 의 값을 비교해보면

숫자가 낮은 값이 높은 우선순위를 가진다는 것을 알 수 있다.

저작자표시 비영리 (새창열림)

'Java > Spring framework' 카테고리의 다른 글

Spring framework core (8) - Resource  (0) 2020.01.15
Spring framework core (7) - ResourceLoader  (0) 2020.01.14
Spring framework core (5) - Message Source  (0) 2020.01.12
Spring framework core (4) - Environment  (0) 2020.01.12
Spring framework core (3) - Bean scope  (0) 2020.01.12
'Java/Spring framework' 카테고리의 다른 글
  • Spring framework core (8) - Resource
  • Spring framework core (7) - ResourceLoader
  • Spring framework core (5) - Message Source
  • Spring framework core (4) - Environment
감동이중요해
감동이중요해
https://github.com/dhmin5693 dhmin5693@naver.com
티끌모아 산을 쌓아보자https://github.com/dhmin5693 dhmin5693@naver.com
감동이중요해
티끌모아 산을 쌓아보자
감동이중요해
전체
오늘
어제
  • 분류 전체보기 (111)
    • 알고리즘 (35)
    • Infra & Dev tools (10)
      • Git (2)
      • Cloud platform (5)
      • Mac, Linux (3)
    • BigData (1)
    • IT 도서 (11)
      • Clean Code (8)
    • Java (36)
      • Spring framework (19)
      • JPA (5)
      • Domain Driven Design (3)
    • Database (2)
      • oracle (1)
      • mysql (0)
    • Computer Science (7)
      • 운영체제 (7)
    • 기타 (9)
      • 크롤링(파이썬) (1)
      • 회고 (4)
      • Career (0)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

공지사항

  • About me

인기 글

태그

  • 프로세스
  • 우아한테크캠프2기
  • Linux
  • 영속
  • 회고
  • Spring
  • AWS
  • Java
  • DDD
  • Mac
  • JPA
  • bean
  • 운영체제
  • Stream
  • 영속상태
  • Database
  • 알고리즘
  • Clean Code
  • 메모리
  • 블라인드공채

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
감동이중요해
Spring framework core (6) - ApplicationEventPublisher
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.