노드 학습 11일차
라우터 분리하기
라우트가 많아지면 app.js
의 코드가 무수하게 길어지기 때문에 구분하여 분리할 수 있는 라우트는 따로 관리하는 것이 좋습니다.
예를들어 게시판과 사용자 관련 라우터가 많다면 각각 postRouter, userRouter로 구분해서 관리하는 것이 좋습니다.
파일 구조 예시
다음은 프로젝트 내에 routes
폴더를 만든 파일 구조의 예시입니다.
라우터 코드 예시
분리된 라우터의 코드 예시입니다.
routes/user.js
예시)
1
2
3
4
5
6
7
8
9
const express = require('express');
const router = express.Router();
router.get('/', (req, res) => {
res.render('hello, user');
})
module.exports = router;
express.Router()
로 생성한 객체에서 라우터를 설정하고 이를 내보냅니다. routes/index.js
의 구조도 위와 동일합니다.
분리된 라우터 연결하기
라우터 파일도 하나의 파일로써 require()
하여 사용할 수 있습니다.
1
2
3
4
5
6
const indexRouter = require('./routes');
const userRouter = require('./routes/user');
// 생략
app.use('/',indexRouter);
app.use('/user',userRouter);
여기서 주의할 점은 /user
에 연결한 uerRouter의 기본 경로인 /
는 서로 상쇄되는 것이 아니고 연결되기 때문에 /user/
라우터가 됩니다. 실질적으로 /user/
와 /user
는 서로 동일하기 때문에 기능적으로는 차이가 없습니다.
라우트 매개변수
라우트 경로에서 사용되는 와일드카드의 역할 입니다. 경로의 원하는 위치에 :{id}
를 넣어 사용합니다.
{id}
의 값은 상황에 따라 알맞게 사용하면 됩니다.
request
객체의 params
에서 키를 찾아 사용할 수 있습니다.
예시)
1
2
3
4
5
6
7
8
9
app.get('/user/:id',(req,res)=>{
console.log(req.params.id);
// 생략
})
app.get('/post/:no',(req,res)=>{
console.log(req.params.no);
// 생략
})
라우트 매개변수 사용 시 주의사항
일반 라우터보다 뒤에 위치해야합니다.
앞에 위치하게 되면 일반 라우터가 동작하지 않고 전부 매개변수로 처리됩니다.
다음의 예시에서 /user/post
는 실행되지 않습니다.
예시)
1
2
3
4
5
6
7
8
app.get('/user/:id',(req,res)=>{
//생략
})
// 실행되지 않음
app.get('/user/post',(req,res)=>{
// 생략
})
쿼리스트링 사용법
request
객체의 query
속성 에서 값을 가져올 수 있습니다. 먼저 url 쿼리스트링에 대해 간단하게 요약하자면… http 메서드 중 get
방식의 경우 파라미터를 url에 바로 입력하는 경우가 많습니다.
예를들면 /user?page=1&limit=10
과 같은 형식입니다.
예시)
1
2
3
4
5
6
7
// /user/9999?page=1&limit=10 으로 연결 했다고 가정하겠습니다.
app.get('/user/:id',(req,res)=>{
console.log(req.query);
// {page : 1, limit : 10} 이 출력됩니다.
// 생략
})
라우트 그룹화 하기
주소는 같은데 메서드가 다른 경우 이를 그룹화 할 수 있습니다. 기존의 라우터 순서가 http 메서드를 정하고 url을 정한다면 여기서는 route()
함수를 통해 url을 먼저 정하고 메서드를 구분합니다.
수정 전 예시)
1
2
3
4
5
6
router.get('/test',(req,res)=>{
// 생략
})
router.post('/test',(req,res)=>{
// 생략
})
수정 후 예시)
1
2
3
4
5
6
7
router.route('/test')
.get((req,res)=>{
//생략
})
.post((req,res)=>{
// 생략
})
req, res 객체 살펴 보기
지금까지 배웠던 미들웨어 등을 통해 접근할 수 있는 req, res 객체에 대한 요약입니다.
req
req.app
: app 객체에 접근 가능.get()
,set()
으로 사용 가능req.body
: body-parser 가 해석한 객체req.cookies
: cookie-parser 가 해석한 쿠키 객체req.ip
: 요청자 ipreq.params
: 라우트 매개변수req.query
: 쿼리스트링req.signedCookies
: cookie-parser가 해석한 서명된 쿠키 객체req.get(헤더 이름)
: 헤더의 값을 가져옴
res
res.app
: app 객체에 접근 가능res.cookie(키, 값, 옵션)
: 쿠키를 설정res.clearCookie(키, 값, 옵션)
: 쿠키를 제거res.end()
: 데이터 없이 응답을 보냄res.json(JSON)
: JSON 형식의 응답을 보냄res.redirect(주소)
: 주소로 리다이렉트res.render(뷰, 데이터)
: 템플릿 엔진을 렌더링 해서 응답res.send(데이터)
: 데이터와 함께 응답을 전송res.sendFile(경로)
: 경로의 파일을 응답res.set(헤더, 값)
: 응답 헤더 설정res.status(코드)
: 응답 HTTP 상태 코드 지정