[Node.js] Router

Gomao·2023년 4월 12일
0

Node.js

목록 보기
7/8

Router의 기본 개념

Network에서 데이터 패킷을 목적지까지 전송하기 위한 경로 설정이라고 보면 된다. routing(라우팅) 이라고 부르기도 함.

Node.js에서의 router

클라이언트로부터 들어오는 HTTP 요청(req)을 처리하고,
적절한 핸들러(handler)를 호출하는 기능을 수행한다.

Router를 사용하는 방법

express.js는 기본적으로 Router를 제공하기 때문에,
express module를 통해서 사용할 수 있다.

const express = require("express");
const router = express.Router();

이제 router의 메소드를 사용하여 작업을 수행할 수 있다.
첫 번째 인자는 접속할 경로(path)를 받는다

두 번째 인자는 (req,res,next)의 인자를 받는 콜백함수를 받는다.

// router.post : 데이터 생성(Create)
router.post("/users", (req,res) => {
	res.send("create user")
});

// router.get : 데이터 조회(Read)
router.get("/", (req,res) => {
	res.send("root page")
});

// router.put : 데이터 업데이트(Update)
// router.delete : 데이터 삭제(Delete)

이처럼 router의 메소드를 통해 CRUD를 구현할 수 있다.

request object : path 와 query (Path)

Router에서도 사용하고, 기본적으로 express의 CRUD를 작업할 때, req 객체와 관련된 property 이다.

req.params
경로에 변수를 포함하여 동적인 URL을 만들 때 사용한다.

router.get("/users/:id", (req,res) => {
	const userId = req.params;
    console.log(userId)
});

이때, 만약 /users 로 접속하여 parameter가 설정되어 있지 않다면, req.params는 빈 객체를 return하게 되고,
이 값을 출력하면 undefined가 나온다.

예시 코드를 한 번 보고 가는 게 좋겠다.

const express = require("express");

const app = express();

app.listen(8080, () => {
  console.log("listening on 8080");
});

app.get("/", (req, res) => {
  // res.sendFile(__dirname + "/index.html");
  res.send("gomao");
});

app.get("/test1", (req, res) => {
  res.send("하이?");
});

app.get("/main/:name", (req, res) => {
  const name = req.params.name;
  const showText = `당신은 현재 ${name}주소로 접속 중입니다.`;
  console.log(name);
  res.json(showText);
});

이 코드는, express module을 호출하고, 8080 port를 통해 접속하여,
root page("/")로 접속할 경우 gomao를 출력,
"/test1"로 접속할 경우 하이?를 출력,
"/main/:name"을 통해 path parameter로 접속할 경우
현재 접속중인 path 주소를 포함한 문장을 출력하는 코드이다.

작동 예시를 보도록 하자.

먼저, 8080포트에 성공적으로 연결되었다는 안내가 terminal에 출력된다.

root page에 접속하면 gomao가 정상적으로 출력된다.

/test1에 접속하면 하이?가 정상적으로 출력된다.

/main/cutehane로 접속하면 접속한 path parameter가 잘 출력된다.

또한, 접속한 path parameter가 console.log로 잘 출력된다.

request object : path 와 query (Query)

http get 요청으로 전달된 query string 데이터를 파싱하여 객체 형태로 저장하는 것이다.

이때 query string이란 경로에 ? 기호를 사용하여 아래와 같이 전달하는 것을 말한다.

http://.../search?name=gomao&number=1

이렇게 접근한다면 query 객체는 다음과 같은 형태로 저장된다.

{
	name : "gomao",
    number : "1"
}

이 객체를 아래와 같은 방법으로 핸들러에서 사용할 수 있다.

app.get("/search", (req, res) => {
  const { name, number } = req.query;
  const showText1 = `현재 입력한 이름은 ${name}, 번호는 ${number} 입니다.`;
  res.send(showText1);
  console.log(name, number);
});

브라우저와 console 창에서의 실행 결과를 보도록 하자.

정상적으로 잘 출력이 된다.

만약 아무 값도 입력하지 않으면 어떻게 될까?

query가 정의되지 않았기 때문에 undefined로 출력된다.

이때, path parameter를 입력하지 않으면 어떻게 될까?

이렇게 아예 오류가 난다.

router.get과 app.get의 차이

express.js 포스팅을 함께 보면서 이해하면 좋을 것 같다.

const express = require("express");
const router = express.Router();
const app = express();

router.get("/users", (req,res) => {
	res.send("user list");
})

app.use("/api",router);

위 코드를 분석해보도록 하자.
router.get을 통해 /users 경로로 접근할 경우 "user list"를 출력한다.

이때 app.use를 통해 /api/users 경로로 router 객체를 마운트 할 수 있다.

반면에 app.get을 사용하면 root page에 대한 라우팅을 등록할 수 있다.

const express = require('express');
const app = express();

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

app.get을 사용하는 경우는,
root application에 대한 라우팅을 등록하는 경우이고,
router.get을 사용하는 경우는,
특정 경로에 대한 라우팅을 처리하는 라우터 객체를 생성하는 경우이다.

즉, app.get은 조금 더 광범위한 라우팅 처리를 하고, 전체 application에 대한 미들웨어를 등록할 수 있으나,
router.get은 특정 경로에 대한 라우팅과 해당 라우터 객체에서만 동작하는 미들웨어를 등록할 수 있다.

profile
코딩꿈나무 고마오

0개의 댓글