포스트

노드 학습 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

  1. req.app : app 객체에 접근 가능. get() , set() 으로 사용 가능
  2. req.body : body-parser 가 해석한 객체
  3. req.cookies : cookie-parser 가 해석한 쿠키 객체
  4. req.ip : 요청자 ip
  5. req.params : 라우트 매개변수
  6. req.query : 쿼리스트링
  7. req.signedCookies : cookie-parser가 해석한 서명된 쿠키 객체
  8. req.get(헤더 이름) : 헤더의 값을 가져옴

res

  1. res.app : app 객체에 접근 가능
  2. res.cookie(키, 값, 옵션) : 쿠키를 설정
  3. res.clearCookie(키, 값, 옵션) : 쿠키를 제거
  4. res.end() : 데이터 없이 응답을 보냄
  5. res.json(JSON) : JSON 형식의 응답을 보냄
  6. res.redirect(주소) : 주소로 리다이렉트
  7. res.render(뷰, 데이터) : 템플릿 엔진을 렌더링 해서 응답
  8. res.send(데이터) : 데이터와 함께 응답을 전송
  9. res.sendFile(경로) : 경로의 파일을 응답
  10. res.set(헤더, 값) : 응답 헤더 설정
  11. res.status(코드) : 응답 HTTP 상태 코드 지정
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.