본문 바로가기

개발일지/TIL

[230809] 알림 기능 구현

알림 기능 구현 기술 선택

💬 알림 기능은 실시간으로 이루어져야 합니다. 서버에서 클라이언트 방향으로만 데이터가 전송이 됩니다. 서버의 부담이 상대적으로 적게 들어가야 합니다.

✅ 실시간을 보장하며, 서버에서 클라이언트로 단반향 데이터 통신을 사용할 수 있는 SSE를 선택하기로 했다. 뿐만 아니라 양방향을 지원하는 WebSocket보다 서버에 주는 부담도 적다.

 

✔ SSE 기능 구현

💬 알림과 실시간 입찰 가격 조회 기능을 하나의 SSE로 처리하려고 했다. SSE가 별도로 만들어진다면 서버가 부담이 될 수 있다고 판단했기 때문이다.

 

public class SseService {
    private static final Long DEFAULT_TIMEOUT = 1000 * 60 * 30L;
    private static final List<SseEmitter> emitters = new ArrayList<>();

    public SseEmitter connect(Long id, String lastEventId) {
        SseEmitter emitter = new SseEmitter(DEFAULT_TIMEOUT);

        emitters.add(emitter);

        emitter.onCompletion(() -> emitters.remove(customSseEmitter));
        emitter.onTimeout(() -> emitters.remove(customSseEmitter));

        try {
            emitter.send("connect user : " + id);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        return emitter;
    }

    public void send(Long id, Object data) {
        for(SseEmitter sendEmitter : emitters) {
            try {
                sendEmitter.sseEmitter()
                        .send(SseEmitter.event()
                                .name(event.toString())
                                .data(data));
            } catch (IOException exception) {
                emitters.remove(sendEmitter);
                throw new RuntimeException("연결 오류!");
            }
        }
    }
}

 

✔ 결과