๐Ÿ‘ฉโ€๐Ÿ’ป
Megaptera Frontend
  • ์ฃผ์ฐจ๋ณ„ ํ•™์Šต
    • megaptera-front
    • 1. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ
      • 1. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ
      • 2. TypeScript
      • 3. React
      • 4. Testing Library
      • 5. Parcel & ESLint
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 2. JSX
      • 1. JSX
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 3. React๋กœ ์‚ฌ๊ณ ํ•˜๊ธฐ
      • 1. React Component
      • 2. React State
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 4. React Hooks
      • 1. Express
      • 2. Fetch API & CORS
      • 3. React์˜ Hook
      • 4. useRef & Custom Hook
      • 5. usehooks-ts
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 5. ํ…Œ์ŠคํŠธ
      • 1. TDD
      • 2. React Testing Library
      • 3. MSW
      • 4. Playwright
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 6. External Store
      • 1. External Store
      • 2. TSyringe
      • 3. Redux ๋”ฐ๋ผํ•˜๊ธฐ
      • 4. usestore-ts
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 7. React Router
      • 1. Routing
      • 2. Routes
      • 3. Router
      • 4. Navigation
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 8. CSS in JS
      • 1. Design System
      • 2. Style Basics
      • 3. CSS in JS
      • 4. styled-components
      • 5. props์™€ attrs
      • 6. Global Style & Theme
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 9. ์‡ผํ•‘๋ชฐ ๋ชฉ๋ก, ์ƒํ’ˆ ํŽ˜์ด์ง€
      • 1. ๊ฐœ๋ฐœํ•˜๊ธฐ ์ „ ์ค€๋น„
      • 2. ๋ชฉ๋ก ๋ณด๊ธฐ
      • 3. ์ƒํ’ˆ ์ƒ์„ธ ๋ณด๊ธฐ
      • 4. ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋ณด๊ธฐ
      • 5. ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ์ƒํ’ˆ ๋‹ด๊ธฐ
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 10. ์‚ฌ์šฉ์ž ์ธ์ฆ, ์ธ๊ฐ€
      • 1. ๋กœ๊ทธ์ธ
      • 2. ๋กœ๊ทธ์•„์›ƒ
      • 3. ํšŒ์›๊ฐ€์ž…
      • 4. ์ฃผ๋ฌธ ๋ชฉ๋ก & ์ฃผ๋ฌธ ์ƒ์„ธ
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 11. ์ฃผ๋ฌธ, ๊ฒฐ์ œ
      • 1. ๋ฐฐ์†ก ์ •๋ณด ์ž…๋ ฅ
      • 2. ํฌํŠธ์› ๊ฒฐ์ œ ์š”์ฒญ
      • 3. ๋ฐฐ์†ก ๋ฐ ๊ฒฐ์ œ ์ •๋ณด ์ „๋‹ฌ
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 12. ์–ด๋“œ๋ฏผ
      • 1. ๊ด€๋ฆฌ์ž ์›น ์‚ฌ์ดํŠธ ๊ฐœ๋ฐœ ์‹œ์ž‘
      • 2. ๋กœ๊ทธ์ธ, ์‚ฌ์šฉ์ž ๋ชฉ๋ก
      • 3. ์นดํ…Œ๊ณ ๋ฆฌ ๊ด€๋ฆฌ
      • 4. ์ฃผ๋ฌธ ๊ด€๋ฆฌ
      • 5. ์ƒํ’ˆ ๊ด€๋ฆฌ
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
Powered by GitBook
On this page
  • 1. Express
  • ํ”„๋ก ํŠธ์—”๋“œ๋„ ๋ฐฑ์—”๋“œ ์ง€์‹์„ ์•Œ์•„์•ผ ํ• ๊นŒ?
  • ๊ฐ„๋‹จํ•œ ์„œ๋ฒ„ ์•ฑ npm ํŒจํ‚ค์ง€ ์„ธํŒ…
  • Hello World ์˜ˆ์ œ
  • 2. URL ๊ตฌ์กฐ
  • ํ•„๋”ฉ ์ œ์•ฝ ์กฐ๊ฑด
  • 3. REST API
  • 4. HTTP Method(CRUD)
  • Thinking in React ์˜ˆ์ œ
  1. ์ฃผ์ฐจ๋ณ„ ํ•™์Šต
  2. 4. React Hooks

1. Express

Previous4. React HooksNext2. Fetch API & CORS

Last updated 2 years ago

1. Express

Node.js๋ฅผ ์œ„ํ•œ ๋น ๋ฅด๊ณ  ๊ฐœ๋ฐฉ์ ์ธ ๊ฐ„๊ฒฐํ•œ ์›น ํ”„๋ ˆ์ž„์›Œํฌ Node.js ์ดˆ๊ธฐ๋ถ€ํ„ฐ ์กด์žฌํ•œ ์˜ค๋ž˜๋œ ํ”„๋ ˆ์ž„์›Œํฌ โ†’ ํ‘œ์ค€์  ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, API ๊ฐœ๋ฐœ์„ ์œ„ํ•ด ์„ค๊ณ„๋จ

ํ”„๋ก ํŠธ์—”๋“œ๋„ ๋ฐฑ์—”๋“œ ์ง€์‹์„ ์•Œ์•„์•ผ ํ• ๊นŒ?

๋ฐฑ์—”๋“œ ์ง€์‹ ์—†์ด ํ”„๋ก ํŠธ ์ž‘์—…์„ ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅ

๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป ๋ฐฑ์—”๋“œ ์ง€์‹์„ ์•Œ์•„์•ผ ํ•˜๋Š” ์ด์œ 

  1. ๋ฐฑ์—”๋“œ์™€ ํ˜‘์—… ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์–ด๋””์ชฝ์—์„œ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ํ™•์‹คํžˆ ์•Œ ์ˆ˜ ์žˆ์Œ(์–ต์šธํ•œ ์ƒํ™ฉ ๋ฐฉ์ง€)

  2. BFF(Backend For Frontend) API๋ฅผ ๋‹ค์ด๋ ‰ํŠธ๋กœ ์˜์กดํ•  ๋•Œ์˜ ์ด์Šˆ๋“ค์„ ํ•ด๊ฒฐํ•˜๊ณ ์ž BFF๊ฐ€ ๋“ฑ์žฅ ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ์œ„ํ•œ ์ค‘๊ฐ„ ์„œ๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ

  3. ํ…Œ์ŠคํŠธ์—์„œ์˜ ๋ชจํ‚น

  4. Nextjs ์‚ฌ์šฉ ์‹œ API๋ฅผ ๋”ฐ๋กœ ์žก์•„์ค„ ๋•Œ

๊ฐ„๋‹จํ•œ ์„œ๋ฒ„ ์•ฑ npm ํŒจํ‚ค์ง€ ์„ธํŒ…

1. ์ž‘์—… ํด๋” ์ค€๋น„

mkdir express-demo-app
cd mkdir express-demo-app

2. ํŒจํ‚ค์ง€ ์ดˆ๊ธฐํ™”

npm init -y

3. gitignore ํŒŒ์ผ ์ƒ์„ฑ

touch .gitignore
echo "/node_modules/" > .gitignore

4. TypeScript

npm i -D typescript
npx tsc --init

5. ts-node ์„ค์น˜

์ปดํŒŒ์ผ ์—†์ด Node.js์—์„œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ง์ ‘ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Œ(๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ TS ์ฝ”๋“œ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ)

npm i -D ts-node

6. ESLint

npm i -D eslint
npx eslint --init
? How would you like to use ESLint? โ€ฆ
โฏ To check syntax, find problems, and enforce code style

? What type of modules does your project use? โ€ฆ
โฏ JavaScript modules (import/export)

? Which framework does your project use? โ€ฆ
โฏ None of these โœ…

? Does your project use TypeScript?
โฏ Yes

? Where does your code run? โ€ฆ
โœ” Node โœ…

? How would you like to define a style for your project? โ€ฆ
โฏ Use a popular style guide

? Which style guide do you want to follow? โ€ฆ
โฏ XO: https://github.com/xojs/eslint-config-xo-typescript

? What format do you want your config file to be in? โ€ฆ
โฏ JavaScript

? Would you like to install them now with npm?
โฏ Yes

? Which package manager do you want to use? โ€ฆ 
โฏ npm

7. Express ์„ค์น˜

npm i express
npm i -D @types/express

Hello World ์˜ˆ์ œ

1. TypeScript์— ๋งž์ถฐ์„œ app.ts ํŒŒ์ผ ์ž‘์„ฑ

// app.ts
import express from 'express';

const port = 3000;

const app = express();

app.get('/', (req, res) => {
    res.send('Hello, world!');
});

app.listen(port, () => {
    console.log(`Server running at http://localhost:${port}`);
});

2. ts-node๋กœ ์‹คํ–‰

npx ts-node app.ts
npm i -D nodemon
npx nodemon app.ts

โš ๏ธ ts-node์— ๋Œ€ํ•œ ์˜์กด์„ฑ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ts-node๋ฅผ ๊ผญ ์„ค์น˜ํ•ด์•ผ ํ•จ โš ๏ธ ์‹ค์ œ ์„œ๋น„์Šคํ•˜๋Š” ์„œ๋ฒ„์—์„œ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ ๋จ

Monitor for any changes in your node.js application and automatically restart the server - perfect for development node.js ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ์„œ๋ฒ„๋ฅผ ์ž๋™์œผ๋กœ ๋‹ค์‹œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

4. package.json ํŒŒ์ผ scripts ์ถ”๊ฐ€

 "scripts": {
    "start": "nodemon app.ts",
    "lint": "eslint --fix ."
  },

2. URL ๊ตฌ์กฐ

๋Œ€๊ฐœ๋Š” ํ•„๋”ฉ ์ œ์•ฝ ์กฐ๊ฑด 4๊ฐ€์ง€๋ฅผ ๋ชจ๋‘ ๋งŒ์กฑํ•˜์ง€ ์•Š๊ณ , Resource์™€ HTTP Verb๋งŒ ๋„์ž…ํ•˜๋Š” ์ˆ˜์ค€์œผ๋กœ ์‚ฌ์šฉ

  • โŒ /write-post

  • โœ… /posts โ†’ ๋ญ”๊ฐ€๋ฅผ ํ•œ๋‹ค (CRUD)

ํ•„๋”ฉ ์ œ์•ฝ ์กฐ๊ฑด

๋‹ค์Œ ์ œํ•œ ์กฐ๊ฑด์„ ์ค€์ˆ˜ํ•˜๋Š” ํ•œ ๊ฐœ๋ณ„ ์ปดํฌ๋„ŒํŠธ๋Š” ์ž์œ ๋กญ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Œ

  • ์ธํ„ฐํŽ˜์ด์Šค ์ผ๊ด€์„ฑ : ์ผ๊ด€์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ถ„๋ฆฌ๋˜์–ด์•ผ ํ•œ๋‹ค.

  • ๋ฌด์ƒํƒœ(Stateless) : ๊ฐ ์š”์ฒญ ๊ฐ„ ํด๋ผ์ด์–ธํŠธ์˜ ์ฝ˜ํ…์ŠคํŠธ๊ฐ€ ์„œ๋ฒ„์— ์ €์žฅ๋˜์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค.

  • ์บ์‹œ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ(Cacheable) : WWW์—์„œ์™€ ๊ฐ™์ด ํด๋ผ์ด์–ธํŠธ๋Š” ์‘๋‹ต์„ ์บ์‹ฑํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ž˜ ๊ด€๋ฆฌ๋˜๋Š” ์บ์‹ฑ์€ ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ๊ฐ„ ์ƒํ˜ธ์ž‘์šฉ์„ ๋ถ€๋ถ„์ ์œผ๋กœ ๋˜๋Š” ์™„์ „ํ•˜๊ฒŒ ์ œ๊ฑฐํ•˜์—ฌ scalability์™€ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค.

  • ๊ณ„์ธตํ™”(Layered System) : ํด๋ผ์ด์–ธํŠธ๋Š” ๋ณดํ†ต ๋Œ€์ƒ ์„œ๋ฒ„์— ์ง์ ‘ ์—ฐ๊ฒฐ๋˜์—ˆ๋Š”์ง€, ๋˜๋Š” ์ค‘๊ฐ„ ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐ๋˜์—ˆ๋Š”์ง€๋ฅผ ์•Œ ์ˆ˜ ์—†๋‹ค. ์ค‘๊ฐ„ ์„œ๋ฒ„๋Š” ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ๊ธฐ๋Šฅ์ด๋‚˜ ๊ณต์œ  ์บ์‹œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•จ์œผ๋กœ์จ ์‹œ์Šคํ…œ ๊ทœ๋ชจ ํ™•์žฅ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐ ์œ ์šฉํ•˜๋‹ค.

  • Code on demand (optional) : ์ž๋ฐ” ์• ํ”Œ๋ฆฟ์ด๋‚˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ œ๊ณต์„ ํ†ตํ•ด ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋กœ์ง์„ ์ „์†กํ•˜์—ฌ ๊ธฐ๋Šฅ์„ ํ™•์žฅ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

  • ํด๋ผ์ด์–ธํŠธ/์„œ๋ฒ„ ๊ตฌ์กฐ : ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋‹จ์ˆœํ™”์‹œํ‚ค๊ณ  ์ž‘์€ ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌ(decouple)ํ•จ์œผ๋กœ์จ ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„์˜ ๊ฐ ํŒŒํŠธ๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ๊ฐœ์„ ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค.

3. REST API

๋กœ์ด ํ•„๋”ฉ(Roy Fielding)์˜ 2000๋…„ ๋ฐ•์‚ฌํ•™์œ„ ๋…ผ๋ฌธ์—์„œ ์†Œ๊ฐœ๋œ ์šฉ์–ด ํ•„๋”ฉ์€ HTTP์˜ ์ฃผ์š” ์ €์ž ์ค‘ ํ•œ ์‚ฌ๋žŒ REST๋Š” ๋„คํŠธ์›Œํฌ ์•„ํ‚คํ…์ฒ˜ ์›๋ฆฌ์˜ ๋ชจ์Œ์ด๋ฉฐ, ์ž์›์„ ์ •์˜ํ•˜๊ณ  ์ž์›์— ๋Œ€ํ•œ ์ฃผ์†Œ๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ „๋ฐ˜์„ ๊ฐ€๋ฆฌํ‚ด ํ•„๋”ฉ์˜ REST ์›๋ฆฌ๋ฅผ ๋”ฐ๋ฅด๋Š” ์‹œ์Šคํ…œ์€ RESTful ์ด๋ผ๋Š” ์šฉ์–ด๋กœ ๋ถˆ๋ฆผ

4. HTTP Method(CRUD)

๐Ÿ“Œ Create(์ƒ์„ฑ), Read(์ƒ์„ธ ์กฐํšŒ), Update(์ˆ˜์ •), Delete(์‚ญ์ œ) + ๋ชฉ๋ก ์กฐํšŒ

๊ธฐ๋ณธ์ ์ธ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค ๋•Œ ์ตœ์†Œํ•œ 5๊ฐœ์˜ API๊ฐ€ ์žˆ์–ด์•ผ ํ•จ

CRUD์— ๋Œ€ํ•ด HTTP Method๋ฅผ ๋Œ€์ž… Read๋Š” Collection(๋ณต์ˆ˜)๊ณผ Item(Element)(๋‹จ์ˆ˜)๋กœ ๋‚˜๋‰จ

  1. Read (Collection) โ†’ GET /products โ‡’ ์ƒํ’ˆ ๋ชฉ๋ก ํ™•์ธ

  2. Read (Item) โ†’ GET /products/{id} โ‡’ ํŠน์ • ์ƒํ’ˆ ์ •๋ณด ํ™•์ธ

  3. Create (Collection Pattern ํ™œ์šฉ) โ†’ POST /products โ‡’ ์ƒํ’ˆ ์ถ”๊ฐ€ (JSON ์ •๋ณด ํ•จ๊ป˜ ์ „๋‹ฌ)

  4. Update (Item) โ†’ PUT(๋ฎ์–ด์“ฐ๊ธฐ) ๋˜๋Š” PATCH(์ผ๋ถ€ ๋ณ€๊ฒฝ) /products/{id} โ‡’ ํŠน์ • ์ƒํ’ˆ ์ •๋ณด ๋ณ€๊ฒฝ (JSON ์ •๋ณด ํ•จ๊ป˜ ์ „๋‹ฌ)

  5. Delete (Item) โ†’ DELETE /products/{id} โ‡’ ํŠน์ • ์ƒํ’ˆ ์‚ญ์ œ

PUT, PATCH, DELETE๋Š” fetch API๋ฅผ ํ†ตํ•ด AJAX ์š”์ฒญ์œผ๋กœ๋งŒ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ(๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ณธ ๋™์ž‘์ด ์•„๋‹˜)

Thinking in React ์˜ˆ์ œ

ํด๋ผ์ด์–ธํŠธ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ฐฑ์—”๋“œ์—์„œ ์ œ๊ณต๋ฐ›๋„๋ก ๊ตฌํ˜„

๊ธฐ๋ณธ ๋ฆฌ์†Œ์Šค URL: /products

app.get('/products', (req, res) => {

	const products = [
		{
			category: 'Fruits', price: '$1', stocked: true, name: 'Apple',
		},
		{
			category: 'Fruits', price: '$1', stocked: true, name: 'Dragonfruit',
		},
		{
			category: 'Fruits', price: '$2', stocked: false, name: 'Passionfruit',
		},
		{
			category: 'Vegetables', price: '$2', stocked: true, name: 'Spinach',
		},
		{
			category: 'Vegetables', price: '$4', stocked: false, name: 'Pumpkin',
		},
		{
			category: 'Vegetables', price: '$1', stocked: true, name: 'Peas',
		},
	];
	
	res.send({ products }); 
});
# CLI๋กœ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•
curl localhost:3000/products
http localhost:3000/products

ํ™œ์šฉ ๋ฐฉ๋ฒ•

res.send({ products }); : JSON์œผ๋กœ ์ž๋™ ๋ณ€ํ™˜

๋ฉ”ํƒ€ ์ •๋ณด๋ฅผ ๊ฐ™์ด ์ค„ ๋•Œ

res.send({ products, currentPage: 1, totalPages: 10 });

๋”ฐ๋กœ ๋„˜๊ฒจ์ค„ ๋•Œ

res.send({ products, pages: { currentPage: 1, totalPages: 10 }});

3. ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ๋งˆ๋‹ค ์„œ๋ฒ„๋ฅผ ์žฌ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ

(Representational State Transfer)

Express
Express ์˜ˆ์ œ
nodemon
Richardson Maturity Model
REST
HTTP Method
Thinking in React
richardsonMaturityModel