https://castle0312.tistory.com/14
[Node.js] SNS 만들기 - Express로 서버 구축
학습 목표 Node.js와 Express로 기본적인 서버 만들기 들어가기 전 해당 글은 작성자가 프로젝트를 끝내고 정리하는 식의 글이기 때문에 작성한지 오래된 코드나 글의 경우 좀 내용이나 설명이 빌
castle0312.tistory.com
이전 글인 서버 만들기에 이어서 이번에는 라우터 파일들을 만드는 과정에 대해 알아보자
학습 목표
서버에서 라우팅했던 라우터 파일들을 만드는 방법에 대해 학습
들어가기 전

전체적인 파일 구조를 캡쳐한 사진이다. 보이다시피 app.js와 routes, uploads, models, middleware, database, controllers등으로 나누어져 있다. 이번 글에서는 이 중 routes에 대한 글이다.
1. routes 파일 생성 예시
예시로 가져온 signupRoutes.js파일이다. 먼저 express 모듈을 가져와서 Router객체를 만들고 api 명세에 맞게 각 api의 요청에 해당하는 메서드와 경로를 지정하여 라우팅을 한다.
// signupRoutes.js
const express = require('express');
const router = express.Router();
const signupController = require('../controllers/signupController');
router.post('/part1', signupController.processPart1); // 인적사항 받는 부분
router.post('/check-userID', signupController.checkUserID);// 아이디 중복검사
router.post('/email-verification', signupController.sendEmail); // 이메일 인증 로직
router.get('/search-address', signupController.searchAddress);
router.post('/part2', signupController.processPart2); // 지역설정 하는 부분
router.post('/part3', signupController.processPart3); // 태그설정 하는 부분
module.exports = router;
보다시피 router 객체에는 여러가지 메서드가 있는데 post, get, delete, put이 있다. 여기서 각 메서드는 http 통신의 post, get, delete, put과 같은 말이다. 각설하고 각 요청에 맞는 메서드를 지정하였다면 그 메서드의 매개변수로는 먼저 각 요청 url에 맞게 지정을 하고 그 다음으로 보낼 메서드를 지정하면 된다. 위 예시를 설명하자면 post 요청이 "/part1"으로 오면 signupController에 있는 processPart1이라는 메서드로 이동하는 것이라고 생각하면 된다. 이런 식으로 해당 파트에 맞는 api들을 전부 라우팅하면 된다.
여기서 보통 굳이 app.js와 routes 파일들을 나눌 필요가 있는지 의문을 가지는 경우가 있다.
물론 전에 만든 app.js 서버 파일에서 전부 라우팅을 설정해도 기능 상으로는 전혀 문제가 되지 않고 동작도 완벽하게 동일하게 돌아간다. 정말 간단한 프로젝트라면 그렇게 작성해도 가독성이나 프로젝트를 이해하기 어렵지 않지만 프로젝트 크기가 조금만 커질때 app.js에 모든 라우팅을 하면 가독성이 너무 떨어지고 그에 따라 유지보수를 하는데도 어려움이 생기기 때문에 대부분의 경우에는 그냥 routes 폴더를 따로 나눠 각 파트별로 라우팅을 관리하는 방법을 사용한다. 이렇게 하면 가독성과 프로그램 이해에 어려움이 없으며 유지보수에 큰 도움이 된다.
2. 라우팅 파일에서 미들웨어 사용 및 기타 기능 사용 법
이제 라우팅을 할때 미들웨어를 사용하는 경우를 알아보자. 가장 대표적인 예시가 api 요청시 해당 요청이 올바른 사용자로 부터 온 것인지 확인하기 위한 미들웨어를 활용하는 것이다. 보통의 api 요청에서는 해당 요청이 올바른 것인지 확인하기 위하여 api 요청마다 사용자를 확인하므로 따로 메서드를 만들어서 필요할때마다 api요청을 처리하기 전에 사용자 확인을 하는 미들웨어를 활용한다.
const express = require("express");
const router = express.Router();
const userController = require("../controllers/userController"); //userController는 객체고 router.post는 두 번째 인자로 callback 함수를 받아야하기 때문에 이러한 형태로 작성
const { upload, profile } = require("../config");
const authMiddleware = require("../middleware/authMiddleware");
const mypageController = require("../controllers/mypageController");
const scrapController = require("../controllers/scrapController.js");
router.post("/login", userController.loginUser);
router.post("/finduser", userController.findUser);
router.post("/findpassword", userController.findPassword);
router.put("/updatepassword", userController.updatePassword);
router.get("/profile/:userId", authMiddleware, mypageController.getUserProfile);
router.get(
"/community/:userId",
authMiddleware,
mypageController.getUserCommunityList
);
router.get(
"/companion/:userId",
authMiddleware,
mypageController.getUserCompanionList
);
module.exports = router;
파위 코드는 사용자와 관련된 api를 라우팅하는 파일인데 일부 라우팅을 보면 authMiddleware라는 메서드를 거치고 그 다음에 각 메서드로 가는 것을 볼 수 있다. 이렇게 라우팅을 할때 미들웨어를 활용해서 사용자 인증이나 혹은 다른 메서드를 활용할 수 있다.
각 api 요청의 전체 url은 "http://localhost:3000/users/login" 과 같은 형식으로 되어있다. 이 말은 라우터 파일을 오기전에 이미 서버 파일에서 /users에 대한 라우팅을 한 다음 usersRoutes파일로 와서 한번 더 라우팅을 하는 형식이기 때문에 실제 라우팅 파일에서는 앞부분에 해당하는 /users를 적지 않은 것이다. 정리하자면 전체 요청 url이 "파트/기능"으로 이루어져 있으면 파트를 기준으로 먼저 라우팅하고 각 파트에서 특정 기능을 한번더 라우팅해서 처리한다고 생각하면 된다.
다음으로는 get메서드에서 활용하는 파라미터 활용법이다. 보다시피 라우팅 url에 ":userID"와 같이 하면 해당 부분은 파라미터로 인식을 하여 프론트에서 쿼리스트링이나 해당 url에서 변수로 생각하고 req.params.userID 혹은 req.query.userID와 같이 사용하여 해당 값을 사용할 수 있다. 그리고 해당 기능은 되도록이면 라우터 목록의 마지막에 위치하도록 해야 다른 라우터들과 충돌이 일어날 확률을 줄여준다. 예를 들어 "/community"라는 요청이 들어오고 라우팅 목록에 "/community" 와 "/community/:userID"가 있으면 서로 위치에 따라서 첫번째로 라우터로 이동하거나 두번째 라우터로 이동할 수 있다. 그러므로 일반적인 경우는 앞에 놔두고 파라미터를 사용하는 경우 뒤에 놔두는 것이 좋다.
정리
정리하자면 라우터 파일을 만들때는 Router객체를 활용해서 각 요청에 맞게 api를 연결해주면 되는 것이다. 이를 위해서는 프론트에서의 요청 url과 백엔드에서의 url을 서로 정확하게 맞출 필요가 있다. 다음으로는 controller에 대해 알아보기 전에 model에 관해 알아보는 글이다.
'Node.js(Express)' 카테고리의 다른 글
| [Node.js] JWT 사용하기 - access token, refresh token (0) | 2024.01.20 |
|---|---|
| [Node.js] JWT에 대해 알아보기 (0) | 2024.01.18 |
| [Node.js] SNS 만들기 - Controller 만들기 (0) | 2024.01.18 |
| [Node.js] SNS 만들기 - Model 만들기 (0) | 2024.01.18 |
| [Node.js] SNS 만들기 - Express로 서버 구축 (4) | 2024.01.13 |