inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

172만명의 커뮤니티!! 함께 토론해봐요.

shutdown()을 호출하는 이유

해결됨

Windows 소켓 프로그래밍 입문에서 고성능 서버까지!

클라이언트에서 showdown()을 호출할때 연결 종료 4 way handshake가 발생하는것을 와이어샤크를 통해서 확인하였습니다. shutdown()을 호출하지 않고 closesocket()으로도 연결 종료 4 way handshake가 발생되는데 왜 closesocket() 전에 showdown()을 호출하는 것인가요?

  • socket.io
  • udp
  • iocp
  • tcpip
random123 댓글 1 좋아요 0 조회수 184

프로토콜이 적용된 파일 송신 서버에서 send, recv 질문 있습니다!

해결됨

Windows 소켓 프로그래밍 입문에서 고성능 서버까지!

안녕하세요 널널한 개발자님! 언제나 강의 잘보고 있습니다. 예제 소스 코드 보고 있는데 의문이 생겨서 이렇게 질문드립니다. 이전 강의에서 recv와 send는 1:1로 매칭되지 않는다라고 하셨었는데 프로토콜이 적용된 파일 송신 서버 제작 강의 예제를 보면 MYCMD 나 GETFILE 구조체를 recv 함수로 한번씩 읽어오시는것같아서요. 혹시 recv로 한번에 읽어오는 데이터의 크기가 GETFILE, MYCMD의 크기보다 작아 한 번 더 읽어야 하는 경우가 발생할 수 있을까요? 해당 코드 구문입니다!

  • socket.io
  • udp
  • iocp
  • tcpip
HMiso 댓글 2 좋아요 0 조회수 175

"파일 송신 서버 제작" 강의 질문입니다!

해결됨

Windows 소켓 프로그래밍 입문에서 고성능 서버까지!

안녕하세요! 파일 송신 서버 제작 강의 부분중에 궁금한 것이 생겨 질문드립니다. "파일 데이터를 전송할 때 큰 데이터를 한 번에 올리는 것이 더 성능적으로 좋아질 수 있다." 라고 하셨는데, 그 이유가 무엇인지 구체적으로 알고 싶습니다. 제가 생각한 것은 시스템 콜 호출 횟수 감소(유저->커널 레벨의 모드 스위치 감소) 디스크 읽기 최적화? (한 번에 순차적으로 접근할 수 있는게 많아지는...?) (I/O를 여러 번 하면, 할 때마다 랜덤 엑세스를 해야하니까, 디스크 seek 타임이 많아지는 이유가 맞을까요?) CPU가 접근하는 커널 페이지 버퍼의 캐시 히트율 증가 정도인데요. 혹시 다른 이유가 더 있는지 궁금합니다. 감사합니다.

  • socket.io
  • udp
  • iocp
  • tcpip
bknote71 댓글 2 좋아요 0 조회수 181

대표적인 장애 유현 2

해결됨

Windows 소켓 프로그래밍 입문에서 고성능 서버까지!

안녕하세요 개발자님 수신측 에서 송신측으로 순서 바뀜 및 패킷 유실에 대한 응답을 송신측으로 전달 하면, 송신측에서 재전송을 시도 하는데, 송신측에서는 수신측으로 데이터를 전송 할때, 재전송 요청에 대해 미리 대비해서 수신측으로 전송 되기전의 패킷을 TCP Buffer 에 쌓아 놓고, 전송을 하며, 정상적인 응답이 와야 TCP Buffer 에서 비우는 작업을 하는 것인가여? TCP Buffer 에 전송전에 데이터를 쌓아 놓는 것은 맞는 걸까여? 수신측에 재전송 요청에 대한 데이터 조회는 TCP Buffer 에서 찾는것은 맞는 걸까여?

  • socket.io
  • udp
  • iocp
  • tcpip
otteu1m 댓글 2 좋아요 0 조회수 151

대표적인 TCP 장애 유현

해결됨

Windows 소켓 프로그래밍 입문에서 고성능 서버까지!

안녕하세요 개발자님 강의 너무 잘 들고 있습니다. 자세한 답변 부탁드립니다. 와이어 샤크를 톨해 대표적인 TCP 장애 유형 을 다 캡처하는 작업 까지 진행 했습니다. 여기서 의문인 것은, Packet Loss, TCP Out of order, Retransmission , Dup ACK 를 통해 세그먼트된 데이터의 유실 이나 순서를 OS가 최대한 보장 하기 위한 노력이다라고 생각하고, (의문점) 첫번째, 세그먼트 조각 모음 하는 장소 그 다음 전송된 세그먼트들을 조각 모음 하는 장소가 TCP Buffer(Window Size) 이며, 여기서 유실된 세그먼트 및 순서 및 중복을 검증 하고, 그 응답(대표적인 TCP 장애유형)을 송신측으로 전송 한다. ( O , X ) 2. (의문점) 두번째, Socket 으로 전송 시점 TCP Buffe r를 통해 완성된 데이터(세그먼트의 조각이 다도착해서 순서를 마춘 상태, 중복은 버리고) 가 잘 만들어 졌다고 가정한 상태에서, 완성된 데이터를 Socket 에 Copy 하는지 ? , 아니면 TCP buffer 에 세그먼트가 도착 하자마자(세그먼트 조각 모음 하지 않고), 즉시 Socket에 Copy 가 이루어 지는지가 궁금 합니다. !!!!! 세그먼트 조각 모음을 하지 않으면, 대표적인 TCP 장애 유형을 검증 하는 것이 힘들거 같고, 방식이 궁금 하여 문의 드립니다.

  • socket.io
  • udp
  • iocp
  • tcpip
otteu1m 댓글 2 좋아요 0 조회수 186

초기세팅중 packge.json 에러떠요

미해결

Slack 클론 코딩[실시간 채팅 with React]

폴더에 있는 패키지들이 모두 에러인데 axios쪽인거 같은데 어떻게 해결하면될까요..

  • react
  • 웹팩
  • typescript
  • socket.io
  • babel
  • 클론코딩
최주영 댓글 2 좋아요 0 조회수 177

이벤트 기반 파일 입출력과 callback 기반 파일 입출력이 네트워크에도 쓰이는 기법인가요?

해결됨

Windows 소켓 프로그래밍 입문에서 고성능 서버까지!

안녕하세요.이벤트 기반 파일 입출력과 callback 기반 파일 입출력에 대해 궁금한 점이 있어 질문 드립니다. IOCP를 설명하시기 전 단계에서 이벤트 기반 파일 입출력과 callback 기반 파일 입출력에 대해 설명을 해주셨는데, 이 두 기법은 네트워크에서도 쓰이는 기법인지 아니면 IOCP를 설명하기 위한 베이스 기법으로서 설명을 해주신 건지 궁금합니다

  • socket.io
  • udp
  • iocp
  • tcpip
TMI_JUNG 댓글 2 좋아요 0 조회수 143

개발환경 질문이 있습니다.

해결됨

Windows 소켓 프로그래밍 입문에서 고성능 서버까지!

장애발생 관련해서 PC 2대가 있는게 좋다고 하셨는데 혹시 가상머신으로는 괜찮을까요

  • socket.io
  • udp
  • iocp
  • tcpip
구병주 댓글 1 좋아요 0 조회수 161

morgan모듈이 cors 문제가 발생할때만 OPTIONS 메서드가 로깅이 되는 이유가 궁금합니다.

미해결

[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지

cors 정책 적용 // routes/v2.js const express = require("express"); const { verifyToken, apiLimiter } = require("../middlewares"); const { createToken, getMyPosts, getPostsByHashtag, corsWhenDomainMatches, getFollowersByUser, getFollowingsByUser, } = require("../controllers/v2"); const router = express.Router(); // router.use((req, res, next) => { // res.setHeader("Access-Control-Allow-Origin", "http://localhost:4000"); // res.setHeader("Access-Control-Allow-Headers", "content-type"); // next(); // }); router.use(corsWhenDomainMatches); // CORS 정책 적용 미들웨어 // 토큰 발급 라우터 // /v2/token router.post("/token", apiLimiter, createToken); ... module.exports = router; morgan 로깅 CORS 정책 미적용 // routes/v2.js const express = require("express"); const { verifyToken, apiLimiter } = require("../middlewares"); const { createToken, getMyPosts, getPostsByHashtag, corsWhenDomainMatches, getFollowersByUser, getFollowingsByUser, } = require("../controllers/v2"); const router = express.Router(); // router.use((req, res, next) => { // res.setHeader("Access-Control-Allow-Origin", "http://localhost:4000"); // res.setHeader("Access-Control-Allow-Headers", "content-type"); // next(); // }); // router.use(corsWhenDomainMatches); // CORS 미들웨어 비활성화 // 토큰 발급 라우터 // /v2/token router.post("/token", apiLimiter, createToken); ... module.exports = router; morgan 로깅 찾아보니 OPTIONS 메서드는 CORS 문제 때문이 아닌 브라우저는 요청을 보내기전 OPTIONS 메서드로 먼저 예비요청을 보낸다는 것을 알았습니다. 그렇다면 OPTIONS 메서드는 모든 요청마다 예비 요청으로 이뤄지고 있을텐데 왜 CORS 문제일때만 OPTIONS 메서드가 로깅이 되는지 궁금합니다.

  • node.js
  • mysql
  • mongodb
  • express
  • typescript
  • socket.io
  • jwt
김현수 댓글 2 좋아요 0 조회수 191

TCP/IP vs UDP , 멀티 스레드에서의 병목 현상에 대한 질문이 있습니다!

해결됨

Windows 소켓 프로그래밍 입문에서 고성능 서버까지!

안녕하세요! 항상 좋은 강의 감사합니다. 강의를 듣다가 궁금한 점이 있어서 질문을 드립니다! Q1. TCP/IP 의 경우 서버 입장에서 사용자가 연결되어 있다는 착각에 빠지지 말라고 알려주셨습니다. 하트비트를 어차피 보내줄 것이라면 UDP 로 설계를 해도 상관없는 건가요? 연결을 신뢰할 수 없음에도 TCP/IP를 사용하는 이유가 궁금합니다. Q2. 멀티 스레드 환경에서 GQCS를 할 경우, 스레드들이 공유하는 큐에 락을 걸어서 적용해봤습니다. 하지만 이 경우 큐에 접근할 때 병목 현상이 우려됩니다. 해당 세션이 특정 스레드에서만 처리되도록 하여 락을 없애는 것과 락을 걸고 여러 스레드에서 접근할 수 있도록 하는 것 중 어느 것을 선호하시나요? Q3. 어쩌면 Q2와 거의 같은 질문일 수도 있겠습니다. 멀티-스레드 환경에서 락 에 대한 대안이 있나요?

  • socket.io
  • udp
  • iocp
  • tcpip
댓글 2 좋아요 0 조회수 249

CORS - Access-Control-Allow-Origin 누락 문제

미해결

Slack 클론 코딩[실시간 채팅 with React]

강좌보면서 proxy 설정하고 back 폴더 npm run dev, alecture 폴더 npm run build 했는데 회원가입 버튼을 누르니 콘솔창에 시간차로 계속 Access to XMLHttpRequest at ' https://sleact.nodebird.com/api/users ' from origin ' http://localhost:3095 ' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. app.js:2 GET https://sleact.nodebird.com/api/users net::ERR_FAILED 200 (OK) (익명) @ app.js:2 e.exports @ app.js:2 e.exports @ app.js:2 l.request @ app.js:2 r.forEach.l.<computed> @ app.js:2 (익명) @ app.js:2 r.Z @ 678.js:1 (익명) @ app.js:2 (익명) @ app.js:2 (익명) @ app.js:2 (익명) @ app.js:2 o @ app.js:2 (익명) @ app.js:2 (익명) @ app.js:2 D @ app.js:2 [신규] Edge에서 Copilot을 사용하여 콘솔 오류 설명: 클릭 오류를 설명합니다. 자세한 정보 다시 표시 안 함 signup:1 Access to XMLHttpRequest at ' https://sleact.nodebird.com/api/users ' from origin ' http://localhost:3095 ' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. app.js:2 GET https://sleact.nodebird.com/api/users net::ERR_FAILED 200 (OK) (익명) @ app.js:2 e.exports @ app.js:2 e.exports @ app.js:2 l.request @ app.js:2 r.forEach.l.<computed> @ app.js:2 (익명) @ app.js:2 r.Z @ 678.js:1 (익명) @ app.js:2 (익명) @ app.js:2 (익명) @ app.js:2 (익명) @ app.js:2 o @ app.js:2 (익명) @ app.js:2 setTimeout onErrorRetry @ app.js:2 (익명) @ app.js:2 (익명) @ app.js:2 (익명) @ app.js:2 u @ app.js:2 Promise.then c @ app.js:2 (익명) @ app.js:2 o @ app.js:2 (익명) @ app.js:2 (익명) @ app.js:2 D @ app.js:2 signup:1 Access to XMLHttpRequest at ' https://sleact.nodebird.com/api/users ' from origin ' http://localhost:3095 ' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. 319.js:1 undefined app.js:2 POST https://sleact.nodebird.com/api/users net::ERR_FAILED라는 오류가 발생합니다. copilot을 실행시켜보니 Access-Control-Allow-Origin과 Origin이 같아야하는데 Access-Control-Allow-Origin 부분이 누락되었다고 나옵니다. 네트워크 200번대는 실행에는 성공한거라고 들었는데... 도움주시면 감사하겠습니다! 제 webpack.config.ts 첨부하겠습니다. import path from 'path'; //import ReactRefreshWebpackPlugin from '@pmmmwh/react-refresh-webpack-plugin'; import webpack, { Configuration as WebpackConfiguration } from "webpack"; import { Configuration as WebpackDevServerConfiguration } from "webpack-dev-server"; //import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer'; interface Configuration extends WebpackConfiguration { devServer?: WebpackDevServerConfiguration; } import ForkTsCheckerWebpackPlugin from 'fork-ts-checker-webpack-plugin'; const isDevelopment = process.env.NODE_ENV !== 'production'; const config: Configuration = { name: 'sleact', mode: isDevelopment ? 'development' : 'production', devtool: !isDevelopment ? 'hidden-source-map' : 'eval', resolve: { extensions: ['.js', '.jsx', '.ts', '.tsx', '.json'], alias: { '@hooks': path.resolve(__dirname, 'hooks'), '@components': path.resolve(__dirname, 'components'), '@layouts': path.resolve(__dirname, 'layouts'), '@pages': path.resolve(__dirname, 'pages'), '@utils': path.resolve(__dirname, 'utils'), '@typings': path.resolve(__dirname, 'typings'), }, }, entry: { app: './client', }, module: { rules: [ { test: /\.tsx?$/, loader: 'babel-loader', options: { presets: [ [ '@babel/preset-env', { targets: { browsers: ['IE 10'] }, debug: isDevelopment, }, ], '@babel/preset-react', '@babel/preset-typescript', ], env: { development: { plugins: [require.resolve('react-refresh/babel')], }, }, }, exclude: path.join(__dirname, 'node_modules'), }, { test: /\.css?$/, use: ['style-loader', 'css-loader'], }, ], }, plugins: [ // new ForkTsCheckerWebpackPlugin({ // async: false, // // eslint: { // // files: "./src/**/*", // // }, // }), new webpack.EnvironmentPlugin({ NODE_ENV: isDevelopment ? 'development' : 'production' }), ], output: { path: path.join(__dirname, 'dist'), filename: '[name].js', publicPath: '/dist/', }, devServer: { historyApiFallback: true, // react router port: 3090, devMiddleware: { publicPath: '/dist/' }, static: { directory: path.resolve(__dirname) }, proxy: { '/api/': { target: 'http://localhost:3095', changeOrigin: true, }, }, }, }; if (isDevelopment && config.plugins) { // config.plugins.push(new webpack.HotModuleReplacementPlugin()); // // config.plugins.push(new ReactRefreshWebpackPlugin()); // // config.plugins.push(new BundleAnalyzerPlugin({ analyzerMode: 'server', openAnalyzer: true })); } if (!isDevelopment && config.plugins) { // config.plugins.push(new webpack.LoaderOptionsPlugin({ minimize: true })); // // config.plugins.push(new BundleAnalyzerPlugin({ analyzerMode: 'static' })); } export default config;

  • react
  • 웹팩
  • typescript
  • socket.io
  • babel
  • 클론코딩
nayoung hwang 댓글 3 좋아요 0 조회수 470

메모리 관련 문제로 질문드립니다.

해결됨

Windows 소켓 프로그래밍 입문에서 고성능 서버까지!

IOCP 서버를 클래스로 만들어 보려고 하고 있습니다. Thread 생성까지 오류 없이 되다가 Client가 접속되면 문제가 발생합니다. 디버깅 결과 client_list는 메모리 할당이 되었으며 clientSocket이 정상적으로 도착한 상태입니다. 하지만 위의 사진과 같이 push_back을 하려고하면 오류가 발생합니다. 해당 쓰레드의 함수는 class 내부의 메소드로 정의 및 구현되어있습니다. socket_list와 socket_cs를 class 외부에서 정의했을 때에도 같은 현상이 발생합니다. 참고할만한 레퍼런스나 해결법이 있을까요?

  • socket.io
  • udp
  • iocp
  • tcpip
박주현 댓글 2 좋아요 0 조회수 211

로그인 후에 화면 변화가 없습니다

미해결

[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지

로그인 로그아웃까지는 되는데 포스트 부분이 화면이 안뜹니다. html 문제인가요? 아니면 JS 문제인가요? 제가 작성한 코드를 올리고 싶은데 올릴 수 있는 방법이 있을까요? 여기에는 파일도 올릴 수 없고 이미지도 안올라가져서 어떻게 질문을 해야할지 모르겠어요

  • node.js
  • mysql
  • mongodb
  • express
  • typescript
  • socket.io
  • jwt
민지영 댓글 3 좋아요 0 조회수 288

mac에서 mongo download 하는 방법도 알려주시면 안되나요..?

미해결

[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지

강의 내용과 달라서 따라하기 어렵습니다... https://www.mongodb.com/ko-kr/docs/manual/tutorial/install-mongodb-on-os-x/ mongoDB 매뉴얼 보고 설치를 시도했는데요 잘 설치가 된 건지 잘 모르겠습니다...

  • node.js
  • mysql
  • mongodb
  • express
  • typescript
  • socket.io
  • jwt
민지영 댓글 2 좋아요 0 조회수 330

경매 시간을 자유롭게 조정할 수 있게 만들때, 경매 시작 시간도 유저가 조정할 수 있게 만들어야 할까요

미해결

[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지

숙제로 경매 시간을 자유롭게 조정할 수 있게 구현하라고 하셨는데, 처음 사용자가 상품을 생성할 때 경매 종료 시간과 경매 시작 시간을 입력받을 수 있게 만들라는 말씀이실까요? 경매 시작 시간도 조정할 수 있게 하면 sse로 서버 시간을 매초마다 클라이언트에게 보내는 의미가 없을 것 같아 여쭤봅니다!

  • node.js
  • mysql
  • express
  • socket.io
yeolan 댓글 2 좋아요 0 조회수 148

강의에 사용한 js파일들 받을수 있을까요?

해결됨

[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지

현재 개정3판 노드 강의를 듣고 있는데 강의에서 사용하시는 js파일들 받을수있을까요? 아니면 이미 올려두신곳이 있다면 알려주세요!

  • node.js
  • mysql
  • mongodb
  • express
  • typescript
  • socket.io
  • jwt
철수 댓글 3 좋아요 0 조회수 182

mysql연동건너뛰기

미해결

[웹 개발 풀스택 코스] Node.js 프로젝트 투입 일주일 전 - 기초에서 실무까지

제가 mysql연동이 잘 되지 않아 건너뛰고 보려고 하는데 express라우터부터 그냥 봐도 크게 영향받지않고 진행할 수 있을까요??

  • node.js
  • mysql
  • mongodb
  • express
  • 웹-크롤링
  • socket.io
영준 댓글 1 좋아요 0 조회수 127

로그인 페이지 무한 새로고침 현상

미해결

Slack 클론 코딩[실시간 채팅 with React]

안녕하세요 어느 날 갑자기 로그인 페이지가 무한 새로고침 현상이 발생 됩니다 백엔드 쪽에는 로그 /api/users 304로 새로고침마다 계속 응답해줘서 문제가 없는 것 같고 프런트쪽 문제인 것 같은데 개발자 도구를 볼 수 없을정도로 계속 새로고침 되서 당황스럽네요 ㅠㅠ 그래서 제로초님 깃허브 front/App/index.tsx, front/LogIn/index.tsx 코드 전체 붙여넣어도 동일 현상이 발생됩니다... 무언가 라이브러리 충돌이 있나 싶은데 package.json 코드입니다 { "name": "artus-sleact-front", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "dev": "webpack serve --env development", "build": "cross-env NODE_ENV=production webpack", "test": "echo \"Error: no test specified\" && exit 1" }, "author": "ethan", "license": "MIT", "dependencies": { "@emotion/babel-plugin": "^11.11.0", "@emotion/react": "^11.11.4", "@emotion/styled": "^11.11.5", "@loadable/component": "^5.16.4", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.15", "autosize": "^6.0.1", "axios": "^1.7.2", "cross-env": "^7.0.3", "css-loader": "^7.1.2", "dayjs": "^1.11.12", "gravatar": "^1.8.2", "react": "^17.0.2", "react-custom-scrollbars": "^4.2.1", "react-dom": "^17.0.2", "react-mentions": "^4.4.10", "react-refresh": "^0.14.2", "react-router": "^5.3.4", "react-router-dom": "^5.3.4", "react-toastify": "^7.0.4", "regexify-string": "^1.0.19", "socket.io-client": "^4.7.5", "style-loader": "^4.0.0", "swr": "^2.2.5", "ts-node": "^10.9.2", "typescript": "^5.5.3", "webpack-bundle-analyzer": "^4.10.2", "webpack-cli": "^5.1.4" }, "devDependencies": { "@babel/core": "^7.24.7", "@babel/preset-env": "^7.24.7", "@babel/preset-react": "^7.24.7", "@babel/preset-typescript": "^7.24.7", "@types/autosize": "^4.0.3", "@types/loadable__component": "^5.13.9", "@types/node": "^20.14.9", "@types/react-custom-scrollbars": "^4.0.13", "@types/react-mentions": "^4.1.13", "@types/react-router": "^5.1.20", "@types/react-router-dom": "^5.3.3", "@types/socket.io-client": "^1.4.35", "@types/webpack": "^5.28.5", "@types/webpack-bundle-analyzer": "^4.7.0", "@types/webpack-dev-server": "^4.7.2", "@types/gravatar": "^1.8.6", "@types/react": "^17.0.80", "@types/react-dom": "^17.0.25", "babel-loader": "^9.1.3", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", "eslint-config-react-app": "^7.0.1", "eslint-plugin-flowtype": "^8.0.3", "eslint-plugin-import": "^2.29.1", "eslint-plugin-jsx-a11y": "^6.9.0", "eslint-plugin-prettier": "^5.1.3", "eslint-plugin-react": "^7.34.4", "fork-ts-checker-webpack-plugin": "^9.0.2", "prettier": "^3.3.2", "webpack": "^5.92.1", "webpack-dev-server": "^4.15.2" } }

  • react
  • 웹팩
  • typescript
  • socket.io
  • babel
  • 클론코딩
deusfm 댓글 2 좋아요 0 조회수 635

vscode 자동완성 확장 질문

미해결

[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지

안녕하세요! 강의 잘 듣고 있는 수강생 입니다! 제로초님 강의를 보면 다음과 같은 코드가 있을 때 const express = require('express'); const path = require('path'); const app = express(); app.get('/',(req,res)=>{ res.sendFile(path.join(__dirname,'index.html')); console.log('GET / '); }) app에 대한 HTTP METHOD 를 지원하는 라우팅 함수 및 req, res 에서 사용할 수 있는 함수들에 대해 자동 완성 되는 부분을 봤는데요. (예:`app.get()`,`res.writeHead()` 등) vscode의 각종 extensions 들을 설치해보고 vscode 자체의 옵션도 찾아봤지만 도저히 제로초님 처럼 자동 완성 되지가 않네요ㅜㅜ 제가 이클립스를 사용하다가 이번에 노드 공부해보려고 다른 IDE를 사용해서 그런지 자동완성이 되지 않는 부분이 매우 불편한데 혹시 강사님 개발 환경 공유 가능할까요? 강의와는 상관이 없는 질문인 점 죄송합니다

  • node.js
  • mysql
  • mongodb
  • express
  • typescript
  • socket.io
  • jwt
우지원 댓글 2 좋아요 0 조회수 200

chat.adapter.rooms의 시간순 정렬 여부

미해결

[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지

// socket.js socket.on('disconnect', async () => { console.log('chat 네임스페이스 접속 해제'); // /room/방아이디 => URL에서 가져오기. const { referer } = socket.request.headers; const roomId = new URL(referer).pathname.split('/').at('-1'); const currentRoom = chat.adapter.rooms.get(roomId); // 현재 방의 인원이 0이면(방장도 나감) 자동삭제. const userCount = currentRoom?.size || 0; if (userCount === 0) { await removeRoom(roomId); room.emit('removeRoom', roomId); // room 네임스페이스에 이 방이 제거됬다고 알려서 실시간으로 제거할 것임. console.log('방 제거 요청 성공'); } else { // 시스템 메시지 DB 저장 const systemChat = `${socket.request.session.color}님이 퇴장하셨습니다.`; await createChat(roomId, 'system', systemChat); const memberList = [...currentRoom].map((socketId) => { return { color: chat.sockets.get(socketId).request.session.color, socketId, }; }); // 누군가 나가면 그 방의 모든 사람에게 시스템 메시지 및 정보 전달. socket.to(roomId).emit('exit', { user: 'system', chat: systemChat, memberList, }); } }); }); }; 여기서 chat.adapter.rooms.get(roomId) = currentRoom이 Set객체인데 여기 쌓이는 socketId들은 접속한 순서대로 쌓이나요? 그러니까, 시간순 정렬이 되어있는 건가요? 방장 위임하는 기능 구현 중인데 '방에 방장 정보를 저장한다' 이걸 어떻게 해야할 지 모르겠습니다 🤔

  • node.js
  • mongodb
  • express
  • socket.io
yeolan 댓글 2 좋아요 0 조회수 128

인기 태그

인프런 TOP Writers

주간 인기글