Server : Request를 받는다.
Router: Request의 URL에 따라 루트를 정해준다. → 어디로 갈지 길만 정해준다.
Node.js에서의 라우팅이란?
Request가 날아왔을 때, 원하는 경로에 따라 적절한 방향으로 경로를 안내해주는 것
URL, method ⇒ 호출 ‘콜백함수’
- 작성했던 코드들을 하나의 파일에서 구동시켜보자

const express = require('express');
const router = express.Router();
router.use(express.json()) // http 외 모듈 'json' 사용
let db = new Map();
let id = 1; //객체 식별 아이디
function isExist(obj) {
if (Object.keys(obj).length) return true;
else return false;
}
// 로그인
router.post('/login', function (req, res) {
console.log(req.body); //id, pwd
//id가 db에 저장된 회원인지 확인
const { userId, password } = req.body;
//let hasUserId = false;
let loginUser = {};
db.forEach(function (user, id) {
//console.log(user.userId);
if (user.userId === userId) {
loginUser = user;
}
})
if (isExist(loginUser)) {
console.log('ID 매칭 성공');
//넘어온 pwd가 id에 맞는 비밀번호인지
if (loginUser.password === password) {
console.log("password 매칭성공");
} else {
console.log("password 매칭 실패");
}
} else {
console.log('입력하신 아이디는 없는 아이디 입니다.');
}
})
// 회원 가입
router.post('/join', function (req, res) {
console.log(req.body);
// 입력된 body 객체가 비어 있지 않은지 확인
if (Object.keys(req.body).length !== 0) {
// 예시로 ID를 부여하는 방식을 간단히 시뮬레이션
db.set(id++, req.body);
res.status(201).json({
message: `${req.body.name}님 환영합니다.`
});
} else {
res.status(400).json({
message: `입력값을 다시 확인해주세요.`
});
}
});
router
.route('/users/:id')
.get(function (req, res) {
let { id } = req.params;
id = parseInt(id);
const user = db.get(id);
if (user) {
res.status(200).json({
userId: user.userId,
name : user.name
})
} else {
res.status(404).json({
message : '잘못된 아이디 번호입니다'
})
}
})
.delete(function (req, res) {
let { id } = req.params;
id = parseInt(id);
const user = db.get(id);
if (user) {
db.delete(id);
res.status(200).json({
message: `${user.name}님 다음에 또 뵙겠습니다`
})
} else {
res.status(404).json({
message : '잘못된 아이디 번호입니다'
})
}
})
module.exports = router // 모듈화 진행
const express = require('express');
const app = express();
app.listen(7777);
const userRouter = require('./routes/user-demo')// user -demo
// channel -demo 호출해오기
app.use("/",userRouter)
const express = require('express');
const app = express();
app.listen(7777);
const userRouter = require('./routes/users')// user -demo
const channelRouter = require('./routes/channels');
app.use("/", userRouter)
app.use("/channels",channelRouter) // '/channels' 경로로 시작하는 모든 요청에 대해 channelRoutes 사용
‘/channels’ 경로로 시작하는 모든 요청에 대해 channelRouter를 할당해준다.channel.js 에서는 API 설계시, URL을 channels 로 묶어 줬기 때문에 가능한 일이다.const express = require('express');
const router = express.Router();
router.use(express.json());
let db = new Map();
let id = 1;
router
.route('/')
.get((req, res) => {
if (db.size) {
let channels = [];
db.forEach(function (value, key) {
channels.push(value);
})
res.status(200).json(channels);
} else {
res.status(404).json({
message:'조회할 채널이 없습니다'
})
}
}) //채널 전체 조회
.post((req, res) => {
const { channelTitle } = req.body;
if (channelTitle) {
db.set(id++, req.body);
res.status(201).json({
message: `${channelTitle}채널을 응원합니다`
});
} else {
res.status(400).json({
message : "채널명이 없습니다"
})
}
}) //채널 개별 생성
router
.route('/:id')
.put((req, res) => {
let { id } = req.params;
id = parseInt(id);
let channelInfo = db.get(id);
let prevChannelTitle = channelInfo.channelTitle;
if (channelInfo) {
let newTitle = req.body.channelTitle;
channelInfo.channelTitle = newTitle;
db.set(id, channelInfo);
res.json({
message : `채널명이 정상적으로 수정되었습니다. 기존 ${prevChannelTitle} -> 수정 ${newTitle}`
})
} else {
res.status(404).json({
message : '채널 정보를 찾을 수 없습니다'
})
}
}) //채널 개별 수정
.delete((req, res) => {
let { id } = req.params;
id = parseInt(id);
const channelInfo = db.get(id);
if (channelInfo) {
db.delete(id);
res.status(200).json({
message:`${channelInfo.channelTitle}님 채널이 정상적으로 삭제되었습니다`
})
} else {
res.status(404).json({
message : '채널 정보를 찾을 수 없습니다'
})
}
}) //채널 개별 삭제
.get((req, res) => {
let { id } = req.params;
id = parseInt(id);
const channelInfo = db.get(id);
if (channelInfo) {
res.status(200).json(channelInfo);
} else {
res.status(404).json({
message : '채널 정보를 찾을 수 없습니다'
})
}
}) //채널 개별 조회
module.exports = router;
channel.js 파일은, 기존에 설정해준 route 에서 /channels 를 제거해줘야 한다.
${name}님 환영합니다${name}님 환영합니다${name}님 다음에 뵙겠습니다const express = require('express');
const router = express.Router();
router.use(express.json()) // http 외 모듈 'json' 사용
let db = new Map();
let id = 1; //객체 식별 아이디
function isExist(obj) {
if (Object.keys(obj).length) return true;
else return false;
}
// 로그인
router.post('/login', function (req, res) {
console.log(req.body); //id, pwd
//id가 db에 저장된 회원인지 확인
const { userId, password } = req.body;
//let hasUserId = false;
let loginUser = {};
db.forEach(function (user, id) {
//console.log(user.userId);
if (user.userId === userId) {
loginUser = user;
}
})
if (isExist(loginUser)) {
//넘어온 pwd가 id에 맞는 비밀번호인지
if (loginUser.password === password) {
res.status(200).json({
message: `${loginUser.name}님 로그인 되었습니다`
})
} else {
res.status(400).json({
message: `비밀번호가 틀렸습니다`
})
}
} else {
res.status(404).json({
message: '입력하신 아이디는 없는 아이디 입니다.'
})
}
})
// 회원 가입
router.post('/join', function (req, res) {
console.log(req.body);
// 입력된 body 객체가 비어 있지 않은지 확인
if (Object.keys(req.body).length !== 0) {
// 예시로 ID를 부여하는 방식을 간단히 시뮬레이션
const {userId} = req.body
db.set(userId, req.body);
res.status(201).json({
message: `${db.get(userId).name}님 환영합니다.`
});
} else {
res.status(400).json({
message: `입력값을 다시 확인해주세요.`
});
}
});
router
.route('/users')
.get(function (req, res) {
let { userId } = req.body;
const user = db.get(userId);
if (user) {
res.status(200).json({
userId: user.userId,
name : user.name
})
} else {
res.status(404).json({
message : '잘못된 아이디 번호입니다'
})
}
})
.delete(function (req, res) {
let { userId } = req.body;
const user = db.get(userId);
if (user) {
db.delete(id);
res.status(200).json({
message: `${user.name}님 다음에 또 뵙겠습니다`
})
} else {
res.status(404).json({
message : '잘못된 아이디 번호입니다'
})
}
})
module.exports = router // 모듈화 진행
const express = require('express');
const router = express.Router();
router.use(express.json());
let db = new Map();
let id = 1;
function notFoundChannel() {
res.status(404).json({
message:'채널 정보를 찾을수 없습니다'
})
}
router
.route('/')
.get((req, res) => {
const { userId } = req.body;
if (!userId) {
return res.status(404).json({
message: '로그인이 필요한 페이지입니다'
});
}
const channels = Array.from(db.values()).filter(channel => channel.userId === userId);
if (channels.length) {
res.status(200).json(channels);
} else {
res.status(404).json({
message: '조회할 채널이 없습니다'
});
}
}) //채널 전체 조회
.post((req, res) => {
const channelTitle = req.body.channelTitle;
let channel = req.body;
if (channelTitle) {
db.set(id++, channel);
res.status(201).json({
message: `${channelTitle}채널을 응원합니다`
});
} else {
notFoundChannel();
}
}) //채널 개별 생성
router
.route('/:id')
.put((req, res) => {
let { id } = req.params;
id = parseInt(id);
let channelInfo = db.get(id);
let prevChannelTitle = channelInfo.channelTitle;
if (channelInfo) {
let newTitle = req.body.channelTitle;
channelInfo.channelTitle = newTitle;
db.set(id, channelInfo);
res.json({
message : `채널명이 정상적으로 수정되었습니다. 기존 ${prevChannelTitle} -> 수정 ${newTitle}`
})
} else {
notFoundChannel();
}
}) //채널 개별 수정
.delete((req, res) => {
let { id } = req.params;
id = parseInt(id);
const channelInfo = db.get(id);
if (channelInfo) {
db.delete(id);
res.status(200).json({
message:`${channelInfo.channelTitle}님 채널이 정상적으로 삭제되었습니다`
})
} else {
notFoundChannel();
}
}) //채널 개별 삭제
.get((req, res) => {
let { id } = req.params;
id = parseInt(id);
const channelInfo = db.get(id);
if (channelInfo) {
res.status(200).json(channelInfo);
} else {
notFoundChannel();
}
}) //채널 개별 조회
module.exports = router;
1. 라우터 구조 설정
2. 모듈 연결 및 라우팅 리팩토링
3. 회원-채널 관계 ERD 설계
4. 채널 API 설계 및 테스트
5. 회원 채널 조회 및 예외 처리
6. 예외 처리 if문 고도화
7. 백엔드 기초 마무리