라우터 분리하기

김무연·2023년 12월 15일

Backend

목록 보기
42/49
post-thumbnail

express.Router

app.js 가 길어지는 것을 막을 수 있음

  • userRouter 의 get은 /user 와 /가 합쳐져서 GET /user/가 됨

기존의 app.get('/about), app.post('/')... 이 모든 것을 app.js 하나에다가 모든 코드를 넣기에는 app.js 가 너무 길어져서 유지보수 측면에서 힘들 수가 있다.

때문에 router부분, 즉 GET, POST 메서드를 쓰는 것을 routes 폴더로 따로 뺀 후 app.js에서 호출만 해서 쓴다.

// routes/user.js

const express = require('express');

const router = express.Router();

// GET /user 라우터
router.get('/', (req, res) => {
  res.send('Hello, User');
});

module.exports = router;
// app.js

const userRouter = require('./routes/user');
app.use('/user', userRouter);

이렇게 파일을 두 개로 분리해서 app.js 에 너무 코드가 길어지지 않게 한다. 이러한 경우 app.use의 경로와 user의 경로가 합쳐지게 되어서

app.use의 /user + user라우터의 / 가 합쳐져서 = GET /user/ 이 URL이 되게 된다.

라우트 매개변수

:id 를 넣으면 req.params.id로 받을 수 있음

  • 동적으로 변하는 부분을 라우트 매개변수로 만듦
  • 동적으로 변하는 라우트를 만들 때는 무조건 일반 라우터 보다 뒤에 위치
  • 왜냐하면 동적으로 변하는 라우터가 앞에 있을 시 동적으로 변하는 라우터만 실행되고 뒤의 라우터는 실행이 안됨
const express = require('express');

const router = express.Router();

// GET /user 라우터
router.get('/:id', (req, res) => {
  res.send(`Hello, User ${req.params.id}`);
});

module.exports = router;

위와 같은 경우 req.params 에 매개변수 id가 들어오게 되어 req.params.id 하면 출력이 된다.

쿼리 스트링

req.query로 쿼리스트링을 받을 수 있음

/users/123?limit=5&skip=10 주소 요청인 경우

라우터 그룹화하기

  • 주소는 같지만 메서드가 다른 코드가 있을 때
router.get('/', (req, res) => {
  res.send('Hello, Express');
});

router.post('/', (req, res) => {
  res.send('post hello')
})

위 처럼 주소는 같지만 안의 메서드가 get, post로 다를 시 router.route로 묶어준다

router.route('/')
  .get((req, res) => {
    res.send('GET Hello, express');
  })
  .post((req, res) => {
    res.send('POST HELLO EXPRESS');
  });

보통은 메서드를 먼저쓰고 주소를 썻지만, 공통 주소면, 주소를 묶어서 주소먼저 쓰고 다음 메서드를 써 줌

req 객체

  • req.app: req 객체를 통해 app 객체에 접근할 수 있습니다. req.app.get('port')와 같은 식으로 사용할 수 있습니다.
  • req.body: body-parser 미들웨어가 만드는 요청의 본문을 해석한 객체입니다.
  • req.cookies: cookie-parser 미들웨어가 만드는 요청의 쿠키를 해석한 객체입니다.
  • req.ip: 요청의 ip 주소가 담겨 있습니다.
  • req.params: 라우트 매개변수에 대한 정보가 담긴 객체입니다.
  • req.query: 쿼리스트링에 대한 정보가 담긴 객체입니다.
  • req.signedCookies: 서명된 쿠키들은 req.cookies 대신 여기에 담겨 있습니다.
  • req.get(헤더 이름): 헤더의 값을 가져오고 싶을 때 사용하는 메서드입니다
  • res.app: req.app처럼 res 객체를 통해 app 객체에 접근할 수 있습니다.
  • res.cookie(키, 값, 옵션): 쿠키를 설정하는 메서드입니다.
  • res.clearCookie(키, 값, 옵션): 쿠키를 제거하는 메서드입니다.
  • res.end(): 데이터 없이 응답을 보냅니다.
  • res.json(JSON): JSON 형식의 응답을 보냅니다.
  • res.redirect(주소): 리다이렉트할 주소와 함께 응답을 보냅니다.
  • res.render(뷰, 데이터): 다음 절에서 다룰 템플릿 엔진을 렌더링해서 응답할 때 사용하는 메서드입니다.
  • res.send(데이터): 데이터와 함께 응답을 보냅니다. 데이터는 문자열일 수도 있고H TML일 수도 있으며, 버퍼일 수도 있고 객체나 배열일 수도 있습니다.
  • res.sendFile(경로): 경로에 위치한 파일을 응답합니다.
  • res.setHeader(헤더, 값): 응답의 헤더를 설정합니다.
  • res.status(코드): 응답 시의 HTTP 상태 코드를 지정합니다.

메서드 체이닝을 지원함

res
	.status(201)
    .cookie('test', 'test')
    .redirect('/admin')

응답은 무조건 한 번만

미들웨어를 포함해서 응답이 두 번이상 되면 에러가 발생함

profile
Notion에 정리된 공부한 글을 옮겨오는 중입니다... (진행중)

0개의 댓글