Node 강의 65

2-9 유저 데이터 저장

db 폴더 아래 user 폴더를 만들어줍니다. user 폴더에는 user.queries.js 파일을 만들어 유저가 서버에 최초 접속할 경우 유저 정보를 DB에 저장하기 위한 쿼리  CREATE_USER: 'INSERT INTO user (id, device_id) VALUES (?,?)',와 생성 전 해당 유저가 이미 존재 했는지 조회하는 쿼리  FIND_USER_BY_DEVICE_ID: 'SELECT * FROM user WHERE device_id = ?',그리고 이미 존재하는 유저가 다시 서버에 접속 했다면 마지막으로 접속한 로그인 날짜, 시간을 갱신해줄   UPDATE_USER_LOGIN: 'UPDATE user SET last_login = CURRENT_TIMESTAMP WHERE id = ?..

2-8 DB 마이그레이

먼저, DB2_NAME = USER_DBDB1_NAME = GAME_DB 우리가 USER_DB와 GAME_DB를 사용하겠다고 작성해놨기 때문에위와 같이 GAME_DB와 USER_DB를 만들어줘야 합니다.  GAME_DB와 USER_DB에 테이블을 생성하기 위해서db/sql 폴더를 만들고 user_db.sql 파일을 생성해줍니다. user_db.sql에는CREATE TABLE IF NOT EXISTS user(    id         VARCHAR(36) PRIMARY KEY,    device_id  VARCHAR(255) UNIQUE NOT NULL,    last_login TIMESTAMP DEFAULT CURRENT_TIMESTAMP,    created_at TIMESTAMP DEFAULT C..

2-7 DB 연동

DB 컨넥션 Pool을 만들기 위한 사전 작업으로 MySQL을 로컬 환경으로 구성해야 합니다. .env  파일이 현재 아래와 같은데PORT = 3000HOST = 127.0.0.1CLIENT_VERSION = 1.0.0PORT = 3000HOST = 127.0.0.1CLIENT_VERSION = 1.0.0DB1_NAME = GAME_DBDB1_USER = 개인의 UserIdDB1_PASSWORD = 개인의 PASSWORDDB1_HOST = 127.0.0.1DB1_PORT = 3306DB2_NAME = USER_DBDB2_USER = 개인의 UserIdDB2_PASSWORD = 개인의 PASSWORDDB2_HOST = 127.0.0.1DB2_PORT = 3306위와 같이 변경해줍니다. 그리고 환경 변수를 ..

2-6 세션, 핸들러 추가

클라이언트가 서버에 접속하고 그에 따른 이밴트를 처리하기 위해이밴트를 처리할 Handler를 만들어보겠습니다. src 폴더에 session 폴더를 만들어주고,game.session.js와 session.js를 만들어줍니다.먼저, session.js파일에는 export const userSessions = [];// 유저 세션export const gameSessions = [];// 게임 세션위와 같이 유저 세션과 게임 세션이라는 배열을 만들어줍니다. 이제 user.session.js에 필요한 내용을 적어보겠습니다. 먼저, export const addUser = (socket, uuid) => {  // 유저를 추가하는 함수  const user = { socket, id: uuid, sequence:..

2-5 패킷 파싱

먼저,  src 폴더에서 utils라는 폴더를 만들어주고 그 폴더 안에 parser라는 폴더를 만들어준다.parser 폴더에는 packetParser.js라는 파일을 만들어준다. packetParser.js 파일export const packetParser = (data)=>{  // data : 매개변수로 byte 배열을 매개 변수로 받아옵니다.} packetParser라는 함수를 만들어주고 (data)를 매개변수로 가져 옵니다.그 후, import { getProtoMessages } from '../../init/loadProtos.js';export const packetParser = (data)=>{  // data : 매개변수로 byte 배열을 매개 변수로 받아옵니다.  const proto..

2-4 프로토 파일 로드

1) protobufjs 간단 사용법1. 프로토콜 버퍼 정의 파일 작성하기 먼저, 최상위 폴더에 protobuf 파일을 만들고, request와 response 폴더를 만듭니다.request 폴더에는 common.proto 파일을 생성해주고, syntax = 'proto3';package common;message Package{    uint32 handlerId =1;    string userId = 2;    string clientVersion =3;    uint32 sequence = 4;    byte payload = 5;}위의 내용은 클라이언트가 서버에 내용을 보내기 위한 내용들로 어떠한 이벤트가 "어떠한 handlerId로 유저가 clientVersion과 sequence를 가지고 요..

2-3 (중요)이벤트 구분, 바이트 배열 분해

1. 이벤트, 패킷 헤더이벤트를 구분해서 관리할 수 있다.바이트 배열에서 패킷 헤더를 구분할 수 있다. 1) 소켓 이벤트 분리하기const server = net.createServer((socket) => {  console.log(`Client connected from ${socket.remoteAddress} : ${socket.remotePort}`);  socket.on('data', (data) => {    console.log(data);  });  socket.on('end', () => {    console.log('Client disconnected');  });  socket.on('error', (err) => {    console.error('Socket error : ',..

2-2 중앙집중식 환경변수 관리

1. 중앙 집중식 관리모든 환경 변수와 상수는 한 곳에서 관리, 다른 파일에서 동일한 값을 사용하여도 일관성을 유지변경이 필요할 때 한 곳에서만 수정하면 된다.환경 변수, 상수의 직접 사용이 아니기 때문에 코드가 명확해지는 효과필요한 경우 개발, 테스트, 프로덕션 환경 별로 다른 설정 사용이 가능하다. src 폴더에 constans폴더를 생성하고 env.js 파일을 만들어줍니다. 그리고, .env 파일을 만들어 줍니다. .env 파일 안에는PORT = 3000HOST = 127.0.0.1CLIENT_VERSION = 1.0.0위와 같이 서버의 주소(HOST), 포트 번호(PORT), CLIENT_VERSION 이 들어갑니다. env.js 파일은 .env 파일에 있는 정보들을 process로 부터 가져와 ..

2-1 실전 게임 서버 만들기

1. 사용할 라이브러리들 1) dotenvdotenv는 환경 변수를 .env 파일에 저장하고 이를 Node.js 어플리이케션에 로드개발자가 코드에서 직접 환경 변수를 설정하는 대신 별도의 파일로 관리할 수 있게 해줍니다.2) lodahJavaScript의 유틸리티 라이브러리배열, 객체, 함수 등의 데이터 처리를 위한 당양한 기능을 제공선응이 뛰어나고 코드의 가독성을 높이는 데 유용3) mysql2MySQL 데이터 베이스와 상호 작용하기 위한 Node.js 클라이언트 라이브러리4) protobufjsGoogle의 Protocol Buffers(포로토콜 버퍼)를 사용하여 데이터 직렬화 및 역직렬화를 지원하는 라이브러리add) 직렬화 : 메모리를 디스크에 저장하거나 네트워크 통신에 사용하기 위한 형식으로 변환..

1-5 핸들러, 제약조건 적용하기

1. 어떤 핸들러와 조건을 설정할 것인가? 핸들러핸들러 ID작업10소문자를대문자로 변경11데이터를 역순으로 변경 제한 조건메시지의 크기가 1024 바이트 보다 큰 경우에는 에러 반환 이후 커넥션 해제 2. 제한된 크기를 설정해줬기 때문에 Server에서 Client가 범위 내 메시지 보냈는지 확인하기 먼저, constant.js에서export const MAX_MESSAGE_LENGTH = 1024;// Clinet가 서버로 보낼 메시지 가능 최대 길이위와 같이 메시지 제한 크기를 작성해줍니다. 수정된 이후 : export const TOTAL_LENGTH_SIZE = 4;export const HANDLER_ID = 2;export const MAX_MESSAGE_LENGTH = 1024;// Clin..

Node 강의/심화 2024.10.18