소켓

socket 튜토리얼 - emit 메소드와 emitWithAck 둘 중에 뭘 써야할까?

코줍 2024. 5. 2. 22:33

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