학습
🔷🔹🟦
Express가 무엇인지 학습.
RESTful API의 기본 원칙과 사용법 학습.
1. Express
express는 경량화 웹 개발 프레임 워크로, Node를 이용한 웹 어플리케이션 개발에 가장 널리 쓰이는 확장 모듈 중 하나입니다.
https://velog.io/@seosu2000/Express%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80
express를 알기전에 일단 Node.js가 무엇인지 알아 봐야겠죠?
Node.js란?
웹에서 js사용해야 하는 것을 웹 없이도 사용할 수 있게 하는 것
💡
정의: Node.js는 크로스플랫폼 오픈소스 자바스크립트 런타임 환경으로 윈도우, 리눅스, macOS 등을 지원한다. Node.js는 V8 자바스크립트 엔진으로 구동되며, 웹 브라우저 바깥에서 자바스크립트 코드를 실행할 수 있다.
정리: 간단하게 Node.js는 JavaScript를 브라우저 밖에서 사용 가능하게 만드는 도구 입니다!
특징:
이벤트 기반, 비동기 I/O를 지원하여 높은 성능을 발휘합니다.
JavaScript를 사용하여 서버 및 네트워크 애플리케이션을 개발할 수 있습니다.
이벤트 기반(Event-Driven)이란?
비동기 작동-> 빠져서 대기
다른 함수 작동되고 작동중이던 함수가 끝나면(콜스텍에서 빠지면) 비동기함수가 돌아와서 실행됨
💡
위 이미지를 식당 시스템으로 비유해서 설명하겠습니다.
-이벤트 기반 프로그레밍-
EventEmitter: "새로운 주문이 들어왔습니다!"라고 알리는 종업원.
Events(Queue): 손님들의 주문서가 담긴 대기열.
Event Loop: 대기열에서 주문서를 하나씩 꺼내 주방에 전달하는 웨이터.
Event Handler: 주문서를 보고 요리를 만드는 주방장.연산
💡
개념: 프로그램의 흐름이 이벤트(사건)에 따라 결정되는 프로그래밍 방식입니다.
이벤트: 사용자 입력(클릭, 키보드 입력), 시스템 이벤트(타이머, 네트워크 요청 등)와 같이 프로그램 내외부에서 발생하는 모든 사건을 말합니다.
작동 방식:
이벤트가 발생하면 그에 대응하는 콜백 함수나 핸들러가 실행됩니다.
// 버튼 클릭 이벤트 처리
button.on('click', () => {
console.log('버튼이 클릭되었습니다.'); // 에러펑션? 이 수행됩니다
});
이벤트 드리븐 : 필요할 때 만 사용. 안쓸 떄는 다른 프로그램이 돌아
🔷🔹🟦
비동기 I/O(Asynchronous I/O)란?
동기 방식: 직원이 혼자 음료 주문, 제조, 전달 한다고 생각 하시면 됩니다. → 속도가 느리겠죠
비동기 방식: 주문을 받고 진동벨을 전달 하는 직원 1명, 음료 만들고 음료를 전달하는 직원 1명 나눠서 일하고 있다고 생각하시면 됩니다. → 주문과 제조 과정을 나누고 손님은 진동벨을 가지고 쉬고 있으면 됩니다. 속도도 빨라지고 고객은 앉아서 음료를 기다리며 다른일을 하면 됩니다.
동기 : 일꾼 1명
비동기:일꾼 여럿. 요청하고 다른거 하러감
위 그림에서 보듯이, 동기 방식에서는 한 가지 업무를 완료할 때까지 다른 업무를 시작하지 못합니다. 반면, 비동기 방식에서는 메인 업무를 진행하면서도 부가적인 업무를 각각 담당자에게 맡겨 동시에 처리할 수 있습니다.
💡
개념: 입력/출력 작업을 요청한 후, 그 작업이 완료될 때까지 기다리지 않고 다음 코드를 실행하는 방식입니다.
작업이 완료되면 콜백 함수나 Promise 등을 통해 결과를 처리합니다.
Node.js에서 예시:
파일 시스템 접근, 네트워크 요청 등 I/O 작업을 비동기적으로 처리하여 블로킹(blocking)을 최소화합니다.
이를 통해 단일 스레드로도 많은 수의 동시 접속을 효율적으로 처리할 수 있습니다.
예시) 동기적 방식으로 파일 읽기
import fs from 'fs';
console.log('시작');
try {
const data = fs.readFileSync('test.txt', 'utf8');
console.log('파일 내용:', data);
} catch (err) {
console.error('파일 읽기 오류:', err);
}
console.log('종료');
🔷🔹🟦
💡
출력 결과는?
시작
파일 내용: 안녕하세요.
종료
async, await는 비동기를 동기처럼 쓸 수 있게 해줍니다.
await가 끝날 때 까지 기다려 달라는
비동기적 방식으로 파일 읽기
import fs from 'fs/promises';
async function readFile() {
console.log('시작');
try {
const data = await fs.readFile('test.txt', 'utf8');
console.log('파일 내용:', data);
} catch (err) {
console.error('파일 읽기 오류:', err);
}
console.log('종료');
}
readFile();
console.log('파일 읽기 함수 호출됨');
💡
출력 결과는?
시작
파일 읽기 함수 호출됨
파일 내용: 안녕하세요.
종료
npm, npx란?
💡
npm과 npx의 주요 차이점은 npm은 패키지를 설치하고 관리하는 데 사용되는 반면 npx는 패키지를 설치하지 않고 실행하는 데 사용된다는 것입니다.
npm (Node Package Manager):관리
Node.js의 기본 패키지 매니저입니다.
패키지(모듈)를 설치, 업데이트, 삭제하는 데 사용됩니다.
npm install express
예시) chalk 모듈 설치 및 실행
💡
https://www.npmjs.com/package/chalk
npm i chalk
기본 사용법
import chalk from 'chalk';
console.log(chalk.blue('Hello world!'));
결과
🔷🔹🟦
npx (Node Package eXecute): <- 한번만 실행 시 사용
npm 5.2.0 버전부터 추가된 도구입니다.
패키지를 글로벌로 설치하지 않고도 실행할 수 있습니다.
일회성 실행에 유용합니다.
npx prisma db push
아래 처럼 스크립트를 적으면 npm run prisma:push로 실행 가능
"scripts": {
"prisma:push": "prisma db push"
}
npx 예시)
💡
cli 입력: npx cowsay "안녕하세요"
출력 결과:
Express와 같은 모듈이란 무엇인가?
모듈:
필요한 코드를 모아놓은 것
특정 기능을 수행하는 코드의 집합입니다.
재사용성과 유지보수를 높여줍니다.
모듈은 내장 모듈, 외부 모듈로 나뉩니다.
내장모듈은 fs(파일시스템), http(웹서버), path(파일경로), crypto(암호화)등이 있습니다.
기본 내장 파일 시스템 모듈 예시
const fs = require('fs');
const fs = require('fs');
fs.readFile('example.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
Express:
Node.js에서 가장 많이 사용되는 웹 애플리케이션 프레임워크입니다.
간결하고 유연한 API로 웹 서버를 쉽게 구축할 수 있습니다.
express vs http
서버는 express가 아니더라도 node기본 내장 모듈인 http를 사용해서 만들 수 있습니다.
하지만 코드가 복잡해지고 어렵기 때문에 express를 사용하는것이 편합니다.
http server
import http from 'http';
const server = http.createServer((req, res) => {
if (req.url === '/' && req.method === 'GET') {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('http 모듈로 서버 만들기!');
} else {
res.writeHead(404, { 'Content-Type': 'text/plain' });
res.end('404 Not Found!');
}
});
const port = 3000;
server.listen(port, () => {
console.log(`HTTP server running on http://localhost:${port}`);
});
express server
import express from 'express';
const app = express();
app.get('/', (req, res) => {
res.send('express 모듈로 서버 만들기!');
});
app.use((req, res, next) => {
res.status(404).send('404 Not Found');
});
const port = 3000;
app.listen(port, () => {
console.log(`Express server running on http://localhost:${port}`);
});
CJS 모듈과 ESM 모듈의 차이점 (package.json의 type 설정)
💡
중요한점은 CJS, ESM 모두 자바스크립트 코드를 모듈화하여 더 효율적이고 유지보수가 쉬운 개발을 가능하게 하는 것입니다.
🔷🔹🟦
기능적으로 ESM이 먼가 더 많죠? 앞으로는 ESM을 사용하면 되지만
옛날코드(레거시)를 유지보수 할 수 있기때문에 CJS모듈 방식도 알아야 합니다.
ESM 는 최신 것
CJS (CommonJS) 모듈: - 옛날 꺼. 잘 안써서 생략함
require() 함수와 module.exports를 사용합니다.
기본적으로 Node.js에서 사용되는 모듈 시스템입니다.
내보내기 (Export)
// math.js
function add(a, b) {
return a + b;
}
module.exports = add;
가져오기 (Import)
// app.js
const add = require('./math');
console.log(add(5, 3)); // 출력: 8
ES6 모듈:
경로치고 shoft + Tap.하면 자동완성 추천 뜸
import와 export 키워드를 사용합니다.
최신 JavaScript 표준에 따라 설계되었습니다.
내보내기 (Export)
// math.js
export function multiply(a, b) {
return a * b;
}
가져오기 (Import)
// app.js
import { multiply } from './math.js';
console.log(multiply(4, 2)); // 출력: 8
package.json 설정:
"type": "module"을 추가하면 ES6 모듈을 사용할 수 있습니다.
설정이 없으면 기본적으로 CJS 모듈로 인식됩니다.
Express 주요 메서드
라우팅(클라이언트의 요청에 따른 응답 결정)
한 식당에서 손님이 메뉴판을 보고 특정 요리를 주문하면, 주방에서는 그 주문에 맞는 요리를 준비합니다. 이때, 손님의 주문이 들어오는 경로와 방식에 따라 주방에서 어떤 요리를 준비할지 결정하는 것을 라우팅 이라고 생각 하면 됩니다.
// GET 요청에 대한 라우트
app.get('/menus', (req, res) => {
res.send('메뉴판을 보여줍니다.');
});
// POST 요청에 대한 라우트
app.post('/orders', (req, res) => {
res.send('주문을 받았습니다.');
});
라우팅 메서드:
app.get(path, callback): GET 요청 처리
app.post(path, callback): POST 요청 처리
app.put(path, callback): PUT 요청 처리
app.delete(path, callback): DELETE 요청 처리
app.patch(path, callback): PATCH 요청 처리
app.all(path, callback): 모든 HTTP 메서드 처리
라우팅 : 경로 결정
라우터 : 주문생성?
미들웨어(요청과 응답 사이에서 특정 작업을 수행하는 함수들)
🔷🔹🟦
식당에서 손님이 주문을 하면, 웨이터가 그 주문을 주방에 전달하기 전에 알레르기 정보나 특별 요청 사항을 확인하고 처리하는 과정을 생각해보세요. 이처럼 웨이터가 주문을 중간에서 처리하는 역할이 미들웨어 라고 생각 하면 됩니다.
~로 요청하고 다님
import express from "express";
const app = express();
// 모든 요청에 대해 실행되는 미들웨어
app.use((req, res, next) => { // app.use는 무조건 실행됨
console.log();
console.log(`⏰ 요청 시간: ${Date.now()}`);
next(); // 다음 미들웨어 또는 라우트로 제어를 전달
});
// 특정 경로(orders)에만 적용되는 미들웨어
app.use("/orders", (req, res, next) => {
console.log("🧑🍳 주문을 시작합니다.");
console.log("🧑🍳 고객에게 알러지 정보를 물어 봅니다.");
next();
});
app.get("/orders", (req, res) => {
console.log("🍗 주문 페이지입니다.");
res.send("🍗 주문 페이지입니다.");
});
app.get("/", (req, res) => {
console.log("🍎 시작 페이지입니다.");
res.send("🍎 시작 페이지입니다.");
});
app.listen(3000, () => {
console.log("서버가 3000번 포트에서 실행 중입니다.");
});
미들웨어 사용:
app.use(middleware): 모든 요청에 미들웨어 적용
내장 미들웨어: express.json(), express.urlencoded()
express.json(), express.urlencoded() 설명
express.json():
JSON 형식의 요청 본문을 파싱합니다.
Content-Type이 'application/json'인 요청을 처리합니다.
파싱된 데이터는 req.body 객체에 저장됩니다.
express.urlencoded():
URL-encoded 형식의 데이터를 파싱합니다.
주로 HTML 폼을 통해 전송된 데이터를 처리합니다.
Content-Type이 'application/x-www-form-urlencoded'인 요청을 처리합니다.
파싱된 데이터는 req.body 객체에 저장됩니다.
Express Router(Express Router는 라우팅을 모듈화)
대형 식당에서 각 섹션마다 담당 웨이터를 두어 해당 섹션의 주문을 관리 한다고 생각하면 됩니다. 이렇게 하면 각 섹션의 웨이터가 자신의 구역을 효율적으로 관리 가능합니다.
Router를 사용하여 모듈화된 라우팅 시스템을 구축할 수 있습니다.
예시:
// routes/users.js
import express from 'express';
const router = express.Router();
router.get('/users', (req, res) => {
// 전체 사용자 목록 반환
});
router.post('/users', (req, res) => {
// 새로운 사용자 등록
});
export default router;
// routes/menus.js
import express from 'express';
const router = express.Router();
router.get('/menus', (req, res) => {
res.send('메뉴판을 보여줍니다.');
});
router.post('/menus', (req, res) => {
res.send('메뉴판에 메뉴를 추가합니다.');
});
export default router;
요기!!!!
MVC 패턴 설명 및 예시
🔷🔹🟦
💡
MVC 패턴은 웹 애플리케이션을 구조화하는 방법으로, 레스토랑에 비유해 보겠습니다.
Model (데이터와 그 데이터를 처리)DB다루는 스키마
레스토랑의 주방! 주방은 재료(데이터)를 가지고 요리(비즈니스 로직)를 만들어냅니다.
View (사용자에게 정보를 표시)보여주는 화면
레스토랑의 식탁! 식탁은 주방에서 준비한 요리(정보)를 손님에게 제공합니다.
Controller (사용자 입력을 처리, 그에 따라 모델과 뷰를 조정)
레스토랑의 웨이터! 웨이터는 손님의 주문(입력)을 받아 주방에 전달하고 준비된 요리를 손님에게 가져다줍니다.
MVC 패턴:
Model: 데이터와 비즈니스 로직 처리 (/src/models 데이터 구조 정의, 데이터 베이스와 상호 작용)
View: 사용자 인터페이스 담당 (클라이언트가 보는 화면)
Controller: 요청을 처리하고 응답 생성 (/src/controllers 애플리케이션 흐름 제어와 관련된 로직 처리)
MVC 패턴 예시: - 영상보기
package.json
{
"name": "project",
"version": "1.0.0",
"type": "module",
"dependencies": {
"bcrypt": "^5.0.1",
"express": "^4.18.2",
"mysql2": "^2.3.3",
"prisma": "^4.4.0",
"@prisma/client": "^4.4.0"
}
}
src/models/userModel.js
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
export const createUser = async (userData) => {
return await prisma.user.create({
data: userData,
});
};
export const findUserByEmail = async (email) => {
return await prisma.user.findUnique({
where: { email },
});
};
src/controllers/authController.js
import * as userModel from '../models/userModel.js';
import bcrypt from 'bcrypt';
export const signup = async (req, res) => {
try {
const { email, password, name } = req.body;
if (!email || !password || !name) {
return res.status(400).json({ error: '필수 필드가 누락되었습니다.' });
}
const existingUser = await userModel.findUserByEmail(email);
if (existingUser) {
return res.status(409).json({ error: '이미 가입된 이메일입니다.' });
}
const hashedPassword = await bcrypt.hash(password, 10);
const newUser = await userModel.createUser({
email,
password: hashedPassword,
name,
});
res.status(201).json({ message: '회원가입 성공', userId: newUser.id });
} catch (error) {
console.error(error);
res.status(500).json({ error: '서버 오류가 발생했습니다.' });
}
};
src/routes/authRouter.js
import { Router } from 'express';
import { signup } from '../controllers/authController.js';
const router = Router();
router.post('/sign-up', signup);
export default router;
src/app.js
import express from 'express';
import authRouter from './routes/authRouter.js';
const app = express();
app.use(express.json());
app.use('/api/auth', authRouter);
app.listen(3000, () => {
console.log('서버가 3000번 포트에서 실행 중입니다.');
});
2. RESTful API
API란?
💡
API(Application Programming Interface)는 프로그램들이 서로 통신할 수 있게 해주는 약속입니다.
쉽게 말해 레스토랑에서 요리사에게 주문을 하기 위해서 키오스크를 사용하는데 우리가 왼쪽 프로그램(브라우저)에서 오른쪽 프로그램(서버)으로 요청할 때 중간에서 처리를 도와주는 친구(약속)가 API라고 생각해 주세요.
RESTful API란?
post는 등록
get은 조회
put -수정하는데 전체 컬럼 없데이트, 필요하면 정보 생성
패치 : 데이터 하나 수정
🔷🔹🟦
💡웹상에서 규칙을 지켜서 요청하는 것
엄격한 의미로 REST(Representational State Transfer)는 네트워크 아키텍처 원리의 모음이다. 여기서 '네트워크 아키텍처 원리'란 자원을 정의하고 자원에 대한 주소를 지정하는 방법 전반을 일컫는다. 웹 상의 자료를 HTTP위에서 SOAP이나 쿠키를 통한 세션 트랙킹 같은 별도의 전송 계층 없이 전송하기 위한 아주 간단한 인터페이스를 말한다. 이 두 가지의 의미는 겹치는 부분과 충돌되는 부분이 있다. 필딩의 REST 아키텍처 형식을 따르면 HTTP나 WWW가 아닌 아주 커다란 소프트웨어 시스템을 설계하는 것도 가능하다. 또한, 리모트 프로시저 콜 대신에 간단한 XML과 HTTP 인터페이스를 이용해 설계하는 것도 가능하다.
필딩의 REST 원리를 따르는 시스템은 종종 RESTful이란 용어로 지칭된다. 열정적인 REST 옹호자들은 스스로를 RESTafrians 이라고 부른다.
💡
RESTful API는 웹에서 자원을 다루기 위한 규칙을 정의한 API입니다.
주요 특징:
HTTP 메서드를 사용하여 자원에 대한 행동을 정의합니다.
GET: 정보 조회
POST: 새로운 정보 생성
PUT: 전체 정보 수정 / 수정할 데이터 없으면 데이터 생성
PATCH: 일부 정보 수정
DELETE: 정보 삭제
URL 작성 규칙:
명사를 사용하고 복수형으로 작성합니다. (예: /users, /posts)
계층 구조를 표현할 때는 /를 사용합니다. (예: /users/123/posts)
소문자를 사용합니다.
단어 사이는 하이픈(-)으로 구분합니다.(카멜케이스 안씀)
동사나 행동을 URL에 포함하지 않습니다. (이미 method에 행동을 표시)
POST - /users/create
DELETE - /users/123/delete
근데 겟 포스트 풋 패치같은거는 http 메서드에서만사용되나여? 다른데는 안쓴다함
RESTful API 예시
1. 인증(Authentication)
기능
|
메서드
|
엔드포인트
|
설명
|
요청 헤더
|
요청 바디
|
성공 응답
|
실패 응답
|
회원가입
|
POST
|
/auth/sign-up
|
새로운 사용자 생성
|
없음
|
사용자 정보
|
201 Created { "message": "회원가입 성공" }
|
400 Bad Request { "error": "필수 필드 누락" }
|
로그인
|
POST
|
/auth/sign-in
|
인증 토큰 생성
|
없음
|
로그인 정보
|
200 OK { "token": "JWT 토큰" }
|
401 Unauthorized { "error": "인증 실패" }
|
로그아웃
|
DELETE
|
/auth/logaut
|
인증 토큰 삭제
|
Authorization: Bearer 토큰
|
없음
|
200 OK { "message": "로그아웃 성공" }
|
401 Unauthorized { "error": "인증 필요" }
|
2. 선수(Players) 관리
기능
|
메서드
|
엔드포인트
|
설명
|
요청 헤더
|
요청 바디
|
성공 응답
|
실패 응답
|
선수 목록 조회
|
GET
|
/players
|
모든 선수 목록 조회
|
Authorization: Bearer 토큰
|
없음
|
200 OK { "players": [...] }
|
401 Unauthorized { "error": "인증 필요" }
|
선수 상세 조회
|
GET
|
/players/{playerId}
|
특정 선수 정보 조회
|
Authorization: Bearer 토큰
|
없음
|
200 OK { "player": { ... } }
|
404 Not Found { "error": "선수 없음" }
|
선수 생성
|
POST
|
/players
|
새로운 선수 생성
|
Authorization: Bearer 토큰
|
선수 정보
|
201 Created { "message": "선수 생성 성공" }
|
400 Bad Request { "error": "필수 필드 누락" }
|
선수 수정
|
PATCH
|
/players/{playerId}
|
기존 선수 정보 수정
|
Authorization: Bearer 토큰
|
선수 정보
|
200 OK { "message": "선수 수정 성공" }
|
404 Not Found { "error": "선수 없음" }
|
선수 삭제
|
DELETE
|
/players/{playerId}
|
선수 삭제
|
Authorization: Bearer 토큰
|
없음
|
200 OK { "message": "선수 삭제 성공" }
|
404 Not Found { "error": "선수 없음" }
|
3. 경기(Games) 관리
기능
|
메서드
|
엔드포인트
|
설명
|
요청 헤더
|
요청 바디
|
성공 응답
|
실패 응답
|
경기 목록 조회
|
GET
|
/games
|
모든 경기 목록 조회
|
Authorization: Bearer 토큰
|
없음
|
200 OK { "games": [...] }
|
401 Unauthorized { "error": "인증 필요" }
|
경기 상세 조회
|
GET
|
/games/{gameId}
|
특정 경기 정보 조회
|
Authorization: Bearer 토큰
|
없음
|
200 OK { "game": { ... } }
|
404 Not Found { "error": "경기 없음" }
|
경기 생성
|
POST
|
/games
|
새로운 경기 생성
|
Authorization: Bearer 토큰
|
경기 정보
|
201 Created { "message": "경기 생성 성공" }
|
400 Bad Request { "error": "필수 필드 누락" }
|
경기 수정
|
PATCH
|
/games/{gameId}
|
기존 경기 정보 수정
|
Authorization: Bearer 토큰
|
경기 정보
|
200 OK { "message": "경기 수정 성공" }
|
404 Not Found { "error": "경기 없음" }
|
경기 삭제
|
DELETE
|
/games/{gameId}
|
경기 삭제
|
Authorization: Bearer 토큰
|
없음
|
200 OK { "message": "경기 삭제 성공" }
|
404 Not Found { "error": "경기 없음" }
|
4. 팀(Teams) 관리
기능
|
메서드
|
엔드포인트
|
설명
|
요청 헤더
|
요청 바디
|
성공 응답
|
실패 응답
|
팀 목록 조회
|
GET
|
/teams
|
모든 팀 목록 조회
|
Authorization: Bearer 토큰
|
없음
|
200 OK { "teams": [...] }
|
401 Unauthorized { "error": "인증 필요" }
|
팀 상세 조회
|
GET
|
/teams/{teamId}
|
특정 팀 정보 조회
|
Authorization: Bearer 토큰
|
없음
|
200 OK { "team": { ... } }
|
404 Not Found { "error": "팀 없음" }
|
팀 생성
|
POST
|
/teams
|
새로운 팀 생성
|
Authorization: Bearer 토큰
|
팀 정보
|
201 Created { "message": "팀 생성 성공" }
|
400 Bad Request { "error": "필수 필드 누락" }
|
팀 수정
|
PATCH
|
/teams/{teamId}
|
기존 팀 정보 수정
|
Authorization: Bearer 토큰
|
팀 정보
|
200 OK { "message": "팀 수정 성공" }
|
404 Not Found { "error": "팀 없음" }
|
팀 삭제
|
DELETE
|
/teams/{teamId}
|
팀 삭제
|
Authorization: Bearer 토큰
|
없음
|
200 OK { "message": "팀 삭제 성공" }
|
404 Not Found { "error": "팀 없음" }
|
숙제
3. 과제
💡
여러분 지금 풋살 온라인 프로젝트도 바쁠 것으로 예상돼서 간단하게 과제를 내드리겠습니다.
👉 Express에서 배운 mvc 패턴을 사용하여 /players 의 CRUD를 구현.(생성, 업뎃, .. 영상 참고
players는 축구선수로 정의 하겠습니다. (차범근, 메시, 호날두, 박지성, 손흥민 등)
mvc패턴이 어려우면 routes, controller만 구현
DB(Model)는 인메모리 사용 (코드에서 배열, 객체 사용 - 이것인 인메모리 입니다.)
RESTful API 규칙을 준수하여 API 작성(router)
이벤트 : 언제발생할지 모르는 이벤트... 느낌? 으로 자주 씀
이 링크는 지우기
https://chatgpt.com/share/67511bec-9780-800e-8cc9-a10111398810
※ 요약
◆
※ 기억할 것
◆
※Tip
◆
'내일배움캠프_게임서버(202410) > 분반 수업 Basic-A' 카테고리의 다른 글
베이직 강의 24.12.12 - 5주차 Database와 ORM(Prisma) (1) | 2024.12.12 |
---|---|
basic 4주차 과제 (3) | 2024.12.07 |
베이직 241203 화 - 숙제 해설 (0) | 2024.12.03 |
과제하기 24.11.28.목 Class / Promise 이해하고 활용하기 (0) | 2024.11.28 |
241126 화 (0) | 2024.11.26 |