socket.io로 공부를 하다보면, emit과 emitWithAck 메소드를 보게된다.
이 두 메소드의 기능은 서버 <-> 클라이언트 간의 데이터를 방출하는 기능으로 동일하다.
다른 점이라면, emitWithAck는 emit과 다르게 Promise객체를 반환시킨다는 점이다
1. 비동기 작업 지원
간단한 socket통신을 구성할 땐 상관없지만,
로직이 복잡해질 수록 비동기 처리를 효율적으로 관리할 수 있어야 한다.
그런 점에서 반환된 Promise를 통해 작업을 순차적으로 혹은 병렬적으로 실행하는등 관리를 할 수 있게 되는 것이다.
2. 에러처리의 용이성
emit메소드로 에러처리 할 경우
// 클라이언트
socket.timeout(5000).emit("request", {foo, "bar"}, (err, response) => {
if(err){
// 지연시간 동안(5000밀리초) 이벤트가 확인되지 않았을 때의 로직
}
else{
console.log(response)
}
})
// 서버
io.on("connection", (socket) => {
socket.on("request", (arg1, callback) => {
cosole.log(arg1) // {foo, "bar"}
callback({
status : "ok"
})
})
})
emitWithAck메소드로 에러처리 할 경우
try {
const response = await socket.timeout(5000).emitWithAct("request", {foo : "bar"})
console.log(response.status) // "ok"
}
catch(e){
}
// 서버
io.on("connection", (socket) => {
socket.on("request", (arg1, callback) => {
cosole.log(arg1) // {foo, "bar"}
callback({
status : "ok"
})
})
})
Promise를 반환하기 때문에 비동기 작업의 에러를 캐치하기 위해 try-catch문을 사용하게 된다.
⭐️ if-else문을 사용하면, 에러가 발생한 객체에 대해서 수명이 유지되기 때문에 에러를 처리하는 동안에도 에러가 발생하는 객체를 참조하는 코드가 정상처리 되는 경우가 있다.
⭐️ 그러나 try-catch문은 에러가 발생한 객체는 바로 예외를 시키면서 동시에 try 블록 내 모든 객체들이 스코프에서 벗어나 참조할 수 없게끔 예외처리를 해버린다.
⭐️ 또한,예외를 throw할 때 예외객체의 클래스를 명확하게 정의하는 것도 할 수 있다. if-else보다 훨씬 더 구조적이고 깔끔한 예외처리를 할 수 있다.
if-else, try-catch 예시코드 보러가기 ↗️
try catch 가 if else 와 다른 점
if-else와 try-catch가 다른 점은 try 구문에서 예외가 throw되면, 그 즉시 그 블럭이 종료되고 catch 블럭...
blog.naver.com
그럼 emitWithAck()가 더 좋은 거 아냐? emit()을 사용하는 이유는?
1. emit : 실시간 업데이트가 중요한 경우
emit() 메소드는 간단한 이벤트를 전송할 때 주로 쓰며, 콜백함수도 있기 때문에 간단한 응답 및 에러처리가 가능하다.
그리하여 좀 빠르게 양방향 통신이 필요할 때, 즉 실시간 업데이트 같은 게 필요할 때 사용한다고 한다.
2. emitWithAck : 응답 확인이 명확하게 필요한 경우
아무래도 Promise 객체를 반환함으로서 서버의 응답을 확인할 수 있는 메소드기 때문에 특정 응답을 확인한 후에 클라쪽에서 적절한 작업이 수행될 수 있는 그런 작업에 중요한 메소드라고 볼 수 있다.
뭐 예를 들면 실시간 채팅같은 거?
'소켓' 카테고리의 다른 글
socket 튜토리얼 - Emitting events (0) | 2024.05.02 |
---|---|
socket 튜토리얼 - STEP1 부터 STEP5 (0) | 2024.05.01 |