항해99

항해99 62일차 TIL - 동기와 비동기, 블락킹과 논블락킹

자몽포도 2023. 2. 19. 15:40

항해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 관련 요청이 왔을 때, 스레드가 이 일을 처리하기 위해 묶여있지 않고 다른 일을 할 수 있으면 된다. 결국 필요한건 논 블락킹이라는 결론이 났다. 일단 부딪혀봐야겠다.