관리 메뉴

제뉴어리의 모든것

Spring Boot에서 이벤트 사용하기 본문

Spring Boot

Spring Boot에서 이벤트 사용하기

제뉴어리맨 2021. 3. 23. 14:11

특정 처리 완료에 대한 이벤트 콜백을 작성해보자

 

필요 의존성 :

- spring-boot-starter-web

 

 

  • TestController.java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    @Autowired
    ConnectionService service;


    @GetMapping("/connect/{id}")
    public void connect(@PathVariable String id) {
        System.out.println("연결 시도");
        service.connect(id);

    }

    @GetMapping("/disconnect/{id}")
    public void disConnect(@PathVariable String id) {
        System.out.println("연결 끊기 시도");
        service.disconnect(id);

    }
}

예제를 위해 만든 일반적인 컨트롤러다.

/connect/ url 이후에 오는 id란 파라미터가 connect 메소드의 파라미터로 들어온다.

 

  • ConnectionService.java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;

@Service
public class ConnectionService {

    @Autowired
    ApplicationEventPublisher publisher;

    public void connect(String id) {
        //connect 처리
        publisher.publishEvent(new connected(id));
    }

    public void disconnect(String id) {
        //disconnect 처리
        publisher.publishEvent(new disconnected(id));
    }
}

일반적인 Service 클래스다.

다만 //connect 처리 부분에서 connect에 대한 처리를 했다 가정하고, ApplicationEventPublisher 변수에 

connected란 본인이 만든 임의의 도메인 클래스를 넘겨줘서 Event를 publish(발표) 한다는 개념 정도로 알고있자. 

밑에 disconnect 함수는 동일한 개념이지만 disconnected란 이벤트를 발생시킨다는 것만 다르다.

 

 

  • connected.java
public class connected {
    private String id;

    public connected(String id) {
        this.id = id;
    }

    public String getID() {
        return id;
    }
}

이벤트에 대한 도메인 클래스

 

 

  • disconnected.java
public class disconnected {
    private String id;

    public disconnected(String id) {
        this.id = id;
    }

    public String getID() {
        return id;
    }
}

이벤트에 대한 도메인 클래스

 

 

  • SmsEventHandler.java
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;


//EventListener들의 집합
@Component
public class SmsEventHandler {


    @EventListener
    public void idconnected(connected event) {
        System.out.println("접속 완료 콜백");
        System.out.println(event.getID() + "님이 접속 하였습니다");
    }

    @EventListener
    public void iddisconnected(disconnected event) {
        System.out.println("접속종료 완료 콜백");
        System.out.println(event.getID() + "님이 접속을 종료하였습니다");
    }
}

EventListener들의 집합 Component 쯤으로 생각하자.

각종 Event에 대한 리스너들이 등록 되어 있는 Component이다.

중요한 점은, 

메소드에 @EventListener 애노테이션을 붙이고, 매개변수로 위에서 정의한 "이벤트에 대한 도메인 클래스"(connected, disconnected) 를 파라미터로 정의하면 ConnectionService 객체에서 이벤트를 등록 한것으로 인해 EventListener로 등록된 메소드에 콜백이 발생한다. 

*ConnectionService 의 이벤트 등록 부분

 publisher.publishEvent(new connected(id));

 

 

참조 : shinsunyoung.tistory.com/88