nextjs app router 의 /api/stream 이라는 라우트 경로에
get()요청 기능을 포함한 클로져 영역이 있음.
이 영역에 get() 함수와 같이 websocket()이 생성되도록 코드를짜두었음.
그다음 get()요청이 들어오면 해당 websocket() 세션이 실행되어 nextjs 애플리케이션 과 같은 세션에서 소캣 클래스가 동작하도록했음.
next 애플리케이션은 작동중인대 서버에대한 모든 요청이 거부됨.
출력이 안된다는건 외부와 연결이 불가능하단거고 port 문제라는걸 인지함.
당시 오류가 난 원인인 코드는 아래와 같음.
// nextjs app route,
// dir : /api/streamingSocket
class ExecuteSocketServer() {
...
}
const mySocket = new ExecuteSocketServer();
export async function GET() {
mySocket.startWebSocket()
}
// 대략적인 구조.
이렇게 해본이유는
function GET 과 mySocket 은 같은 영역에있으나 서로 라이프사이클이 다르게 처리받는다는 생각을 바탕으로 nextjs 위에서 소켓 세션이 함수나 객체로서 동작할줄알았음. gc또한 다른 콜스택을 사용하니까 get만 정리시킬줄알았음.
파일 자체가 모듈로서 빌드에 포함될시 해당 모듈은 반드시 next 서버 실행시 한번은 실행되고 mySocket에 ExecuteSocketServer객체가 생성된다는 점 이였음.
근대 이건 Node js 를 사용하는 애플리케이션에 대한 잘못된 이해였음.
아래 그림이 실제로 nodejs런타임환경이 실행중인 계층임
GPT에게 이 계층을 텍스트로 표현해달라햇음.
내가 착각한건 웹소캣생성자가 단순한 function ,class 와 같은것인줄알았고 WebSocketServer가 nextjs 애플리케이션 내부 세션에서 integration 가능한 요소중 하나로 봤음.
하지만 전혀 아님.
출처: Node js 문서
웹소캣 생성자는 http서버생성을 추상화한 기능과 ws 라이브러릴 같이 동작시켜 생성됨.
내가한건 같은 포트에 2개의 서버를 , 같은 애플리케이션에 2개의 서버를 만든것임.
ws 관련 코드
ws 의 websocket 테스트 코드 실행시 http 서버를 생성후 웹소캣 관련 기능들을 동작시킴.
next 든 express든 뭐든 간에 nodejs라는 애플리케이션 이 제어하는 하위 애플리케이션임.
즉 nodejs가 nextjs가 3000포트를 점유할수있게 도와주는 역할을 하고있음.
nodejs 런타임 환경에 대해서 알고있다고 생각했지만 매우잘못된 생각이였음.
아주 예전에 nodejs 런타임에 대한 글을 쓴적이 있는대도 잘못 알고있엇음.
오류 발생 후 문제를 즉각 인지하고 1시간 내로 소켓 전용 서버를 따로 작성해서 개발하는대 지장은 없었으나, 구체적으로 왜 문제인지가 궁금해서 기록으로 남김.
nodejs와 nextjs의 상관관계 참조글.
https://pieces.app/blog/nextjs-vs-nodejs-a-modern-contrast?utm_source=chatgpt.com
(node js websocket 문서 )
https://nodejs.org/ko/learn/getting-started/websocket#native-websocket-client