[ 목적 ]
자바스크립트를 공부해보고 싶다. 업무 중 사용하는 자바스크립트 언어와 자바스크립트로 구축하는 nestjs가 궁금해서 작성한다.
[ nestjs ]
처음 사용하고 스프링과 매우 유사하다고 느꼈다. 스프링과 같이 DI를 이용하여 클래스( 함수형 컴포넌트 )를 사용할 수 있다.
스프링과 대체적으로 비슷한 것을 볼 수 있다.
스프링과 대체적으로 비슷한 구조를 가지고 있어 이해하기 너무 쉬웠다.
개발하는 방식 역시 dto, entity를 만들고 db와 연동하여 service단에 로직을 구성하고 respository에 db쿼리를 만드는 것도 똑같았다.
언어 역시 typescript를 사용하여 명확한 자료형덕분에 더 이해하는게 쉬웠다.
자바스크립트가 워낙 근본없는 언어라 생각했는데, 역시 근본없는 언어인 것 같고 너무 간략화 해놓아서 재미가 없다.
[ socket.io ]
기존에 알고 있던 소켓 통신을 좀 더 편리하게 사용하기 위한 라이브러이다.
nestjs경우에는 gateway라는 모듈을 통해 소켓 서버를 구현해야한다.
// 뭐 더 자세히 뭔가 있을 것 같은데 아직 겉만 핥고 있어서 더 깊게는 못쓰겠다.
nestjs을 웹소켓 서버로 사용하고 싶을 경우에, gateway에 웹 소켓 설정을 해야한다.
1. 네임스페이스를 만든다.
2. 웹 소켓이 connect, disconnect 될 경우에 작업을 설정한다.
3. 메시지(채팅방, 토픽)을 받아 해당 채팅방에 데이터를 전송하는 로직을 작성한다.
간단하게 이 정도로 설명할 수 있을 것 같다.
여기서 고도화를 하게 된다면, vip 회원을 위한 채팅방, 사용자 초대 등 로직을 만들 수 있을 것 같다.
socket.io 라이브러리는 http 연결을 통해 소켓 통신을 한다. 그래서 소켓연결 시 url을 http://~~~~~.com 요렇게 형식을 주어야한다.
websocket 라이브러리 경우 ws://~~~ 이런 형식을 주어야한다. 그래서 확장성은 socket.io라이브러리가 더 좋다.
자신이 사용하는 환경에 맞춰 골라서 사용하면 좋을 것 같다.
chatGPT 의 힘을 빌린 경과 다음과 같이 설명해주었다.
WebSocket:
- WebSocket은 HTML5에서 정의된 표준 프로토콜입니다. 실시간 양방향 통신을 지원하는 네트워크 프로토콜로, 클라이언트와 서버 간의 지속적인 연결을 통해 데이터를 전송합니다.
- 웹 브라우저와 서버 간의 통신에 초점을 맞추어 설계되었으며, 다양한 플랫폼과 프레임워크에서 지원됩니다.
- WebSocket은 저수준의 API를 제공하며, 클라이언트와 서버 간의 통신을 직접 처리해야 합니다. 이로 인해 더욱 직관적이고 빠른 성능을 제공할 수 있습니다.
- 단점으로는 보안, 신뢰성 및 확장성과 같은 추가적인 기능을 개발자가 직접 구현해야 한다는 점이 있습니다.
Socket.IO:
- Socket.IO는 WebSocket을 기반으로 한 실시간 통신을 위한 JavaScript 라이브러리입니다. WebSocket의 기능을 보완하고 다양한 추가 기능을 제공합니다.
- 실시간 통신에 필요한 여러 기능을 내장하고 있으며, 이벤트 기반 통신을 간단하게 구현할 수 있습니다. 다양한 플랫폼과 프레임워크에서 지원됩니다.
- Socket.IO는 WebSocket 외에도 폴링(polling) 및 롱 폴링(long-polling)과 같은 다른 전송 방식도 지원합니다. 이는 오래된 웹 브라우저나 일부 네트워크 환경에서도 작동할 수 있도록 합니다.
- 추가적인 기능과 호환성을 제공하기 위해 Socket.IO는 프로토콜 레벨에서 일부 오버헤드를 가질 수 있습니다. 이는 일부 상황에서 성능 저하의 원인이 될 수 있습니다.
둘 사이의 선택은 사용 사례와 요구 사항에 따라 다를 수 있습니다. WebSocket은 저수준의 API로 빠른 성능을 원하는 경우에 적합하며, Socket.IO는 추가적인 기능과 호환성을 필요로 하는 경우에 유용합니다.
오늘 간단히 nestjs를 활용해 crud를 간단히 해보고 소켓을 이용해 채팅방을 구현해보았는데, 예전에 카프카랑 레디스를 이용해서 pub,sub을 해봐서 이해가 더 빨랐던 것 같다. 또 스프링 부트를 계속 사용해와서 nestjs를 이해하기 쉬웠다.