트래픽 경찰관: 라우팅 (Routing)
사용자가 어떤 주소(URL)로 들어왔느냐에 따라 다른 화면을 보여주는 것을 라우팅(Routing)이라고 합니다. Express는 app.get('/about', ...)처럼 매우 직관적인 메서드를 제공하여 수백 개의 URL도 깔끔하게 관리할 수 있습니다.
HTTP 메서드 4대장 (CRUD)
단순히 주소만 나누는 것이 아닙니다. 동일한 주소라도 '목적'에 따라 메서드를 다르게 받는 것이 REST API 설계의 기본입니다.
| 메서드 |
의미 (역할) |
Express 문법 예시 |
| GET |
데이터를 조회(Read)할 때 사용. 브라우저에서 주소를 치고 들어가는 것은 무조건 GET입니다. |
app.get('/posts', ...) |
| POST |
새로운 데이터를 생성(Create)할 때 사용. 로그인, 회원가입 폼 전송 시 쓰입니다. |
app.post('/login', ...) |
| PUT / PATCH |
기존 데이터를 수정(Update)할 때 사용합니다. |
app.put('/posts/:id', ...) |
| DELETE |
데이터를 삭제(Delete)할 때 사용합니다. |
app.delete('/posts/:id', ...) |
URL에서 동적 데이터 뽑아내기
// 1. req.params (콜론 지정 파라미터)
URL 요청: /users/123
라우트 정의: app.get('/users/:id')
추출 방법: req.params.id (결과: '123')
// 2. req.query (물음표 뒤 쿼리스트링)
URL 요청: /search?keyword=node&page=2
라우트 정의: app.get('/search')
추출 방법: req.query.keyword (결과: 'node')
라우트 파라미터 & 쿼리 스트링 추출
URL 경로를 쪼개어 특정 변수를 추출하는 req.params와 URL 뒤에 붙는 검색어를 추출하는 req.query의 사용법입니다.
const express = require('express');
const app = express();
// 1. URL 파라미터 (req.params)
// 콜론(:)으로 시작하는 경로는 변수처럼 취급됩니다.
app.get('/users/:id', (req, res) => {
const userId = req.params.id; // '999' 추출
console.log(`[Route 매칭] app.get("/users/:id")`);
console.log(`> req.params 객체 추출 결과:`, req.params);
res.send(`<h1>유저 상세 정보</h1><p>조회된 유저 ID: ${userId}</p>`);
});
// 2. 쿼리 스트링 (req.query)
// URL 뒤에 ?keyword=apple&sort=desc 형태로 붙어오는 검색/필터 조건
app.get('/search', (req, res) => {
const keyword = req.query.keyword; // 'apple'
const sort = req.query.sort; // 'desc'
console.log(`\n[Route 매칭] app.get("/search")`);
console.log(`> req.query 객체 추출 결과:`, req.query);
res.send(`<h1>검색 결과</h1><p>검색어: ${keyword}, 정렬: ${sort}</p>`);
});
app.listen(3000, () => {
console.log('서버가 3000번 포트에서 대기 중입니다...');
});
$ node router.js
서버가 3000번 포트에서 대기 중입니다...
(클라이언트가 http://localhost:3000/users/999 접속)
[Route 매칭] app.get("/users/:id")
> req.params 객체 추출 결과: { id: '999' }
(클라이언트가 http://localhost:3000/search?keyword=apple&sort=desc 접속)
[Route 매칭] app.get("/search")
> req.query 객체 추출 결과: { keyword: 'apple', sort: 'desc' }