항해99 62일차 TIL - 동기와 비동기, 블락킹과 논블락킹
항해99 실전 프로젝트를 진행중인데요. 이제 SSE 를 통해 실시간 알림을 구현하고 있어요! 아직 해결해야할 문제가 산더미긴 하지만 상대방에게 초대를 보냈을 때 sse를 통해 보내는 것 까지는 확인해봤어요.
연결이 되는걸 눈으로 확인하니 다른 것들이 눈에 들어왔습니다. sse를 구현한 레퍼런스에서 @Async를 활용했는데요. 저도 일단은 레퍼런스를 따라 붙여놨습니다.
@Async
@EventListener
public void helloPush(ScheduleForm scheduleForm) {
log.info("이벤트 리스너의 살기 감지!");
List<Long> participantsIds = scheduleForm.getParticipantsId();
sendAlarm(scheduleForm, participantsIds);
}
그런데 이것이 왜 필요한건지 의문이 들었는데요. 그런데 나... @Async가 무엇인지도 몰랐습니다.
동기 VS 비동기
제가 이해한 동기와 비동기를 구분하는 핵심은 작업을 어떻게 하는지입니다.
클라이언트의 요청이 왔을 때 그것을 순서대로 처리하면 동기입니다.
예를 들면 작업 A, B, C가 있다고 할 때 A수행 > A마침 > B수행 > B마침 > C수행 > C마침
비동기의 경우 작업을 순서대로 처리하지 않아도 됩니다.
위 예를 불러오면 A수행 > B수행 > C수행 > B마침 > C마침 > A마침
이런 식으로 수행 여부를 확인하지 않고 실행할 수 있습니다.
Blocking VS Non-Blocking
둘의 차이는 I/O 작업이 일어났을 때 제어권 유무입니다.
Block 의 경우 요청을 했을 때, 결과를 기다려야합니다. 조금 더 정확히 말하면 제어권이 없습니다.
Scanner sc = new Scanner(System.in);
System.out.println("이름을 입력하세요");
name = sc.next();
위와 같은 코드를 한 번 쯤은 작성해본적이 있으실텐데요. input 을 입력하기 전까지는 다른 일을 할 수 없습니다.
다만 여기서 중요한 것은 다른 일을 하지 못한다는 것이 아니라 제어권이 없다는 것입니다. 결과가 나올 때 가지 기다려야된다는 것입니다.
Non-Block의 경우, 제어권이 자신에게 있습니다. 그래서 커널에 I/O 작업을 수행했을 때 결과를 기다리지 않고 돌아가도 됩니다.
동기 vs 비동기 개념을 조금 살펴봤지만 아직도 @Asyn 가 필요한지는 의문이다. 프론트 단에서 비동기 논블락으로 백으로 요청을 한다. 그리고 백에서도 필요한건 SSE 관련 요청이 왔을 때, 스레드가 이 일을 처리하기 위해 묶여있지 않고 다른 일을 할 수 있으면 된다. 결국 필요한건 논 블락킹이라는 결론이 났다. 일단 부딪혀봐야겠다.