-
REST API 서버 구축하기Project/트윗 클론코딩 2023. 9. 22. 20:59반응형
const express = require('express') const fs = require('fs') const app = express() app.get('/tweets', (req, res) => { const data = JSON.parse(fs.readFileSync('./tweet.json','utf-8')) res.json(data) }) app.post('/tweets', (req,res) => { const newTweet = req.body.newTweet fs.appendFileSync('./tweet.json',newTweet,'utf-8') res.end() }) app.get('/tweets?username=:username', (req,res) => { const data = JSON.parse(fs.readFileSync('./tweet.json','utf-8')).tweet.filter((tweet) => tweet.username == req.query.username) res.json(data) }) app.get('/tweets/:id', (req,res) => { const data = JSON.parse(fs.readFileSync('./tweet.json','utf-8')).tweet.filter((tweet) => tweet.id == req.params.id) res.json(data) }) app.put('/tweets/:id', (req,res) => { const data = JSON.parse(fs.readFileSync('./tweet.json','utf-8')).tweet.map((tweet) => { if(tweet.id = req.params.id) { tweet.text = req.body.text } return tweet }) fs.writeFileSync('./tweet.json', data,'utf-8') res.end() }) app.delete('/tweets/:id' , (req, res) => { const data = JSON.parse(fs.readFileSync('./tweet.json','utf-8')).filter((tweet) => tweet.id != req.params.id) fs.writeFileSync('./tweet.json', data,'utf-8') res.end() }) app.listen(8080)
이전 게시글에서 작성한 REST API를 서버에서 실제로 구현해봤다.
작성하면서 같은 코드를 여러번 작성해야 하는 불편함을 겪었다..아마 강의 진행하면서 수정하겠지..?
내가 생각하는 문제점은 이렇다..
1. 매 요청마다 fs.readfile로 파일을 읽는데 이게 만약 db에서 불러오는거라면 계속 비용이 발생한다는 점..
2. 트윗 업데이트 시 데이터 전부를 읽어와서 덮어씌우는 점..
3. 삭제할 때도 마찬가지로 필터링 후에 덮어씌우는 점..
아직 강의 초반 단계이니 진행하면서 개선이 되지 않으면 내가 개선해보아야겠다..
그리고 내가 작성한 코드와 강의에서 제공하는 코드가 어떻게 다른지 비교해봐야겠다..!
----------------------------------------------
강의에서 내가 만든 것처럼 json파일을 먼저 만들지 않고
메모리 상에 트윗을 변수로 두어 API가 잘 동작하는지 우선 테스트했다.
그럼 1번에 관한 내용은 나중에 확인해야 할 것 같고
2번에 관한 내용은 내부 메모리에서 다뤘으므로 읽어오고 덮어씌우는 일은 없었다.
3번도 필터링으로 걸러냈기에 크게 문제가 있다고 생각이 들지 않았다..
그리고 코드를 작성할 때 라우터로 따로 관리하여 메인js에서 가독성을 높였고
라우터에서 해당 주소에 해당하는 일만 딱 처리해서 훨씬 보기 좋았다
import express from "express"; import cors from 'cors'; import morgan from "morgan"; import helmet from "helmet"; import tweetsRouter from './router/tweets.js' const app = express() app.use(express.json()) app.use(cors()) app.use(morgan('tiny')) app.use(helmet()) app.use('/tweets', tweetsRouter) app.use((req,res, next) => { res.sendStatus(404) }) app.use((error, req,res,next) => { console.error(error); res.sendStatus(500); }) app.listen(8080)
이건 메인인 app.js이고
아래는 tweet라우터이다
import express from "express"; const router = express.Router() let tweets = [ { id : '1', text : 'Hello World', createdAt : Date.now().toString(), username : 'bob', name : 'Bob' }, { id : '2', text : 'Hello World!!!', createdAt : Date.now().toString(), username : 'doyun', name : 'Doyun' } ] //GET /tweets //GET /tweets?username=:username router.get('/',(req,res,next) => { const username = req.query.username; const data = username ? tweets.filter(tweet => tweet.username === username) : tweets; res.status(200).json(data) }) //GET /tweets/:id router.get('/:id', (req,res,next) => { const id = req.params.id const data = tweets.find((tweet) => tweet.id === id) if(data) { res.status(200).json(data) } else { res.statusCode(404) } }) //POST /tweets router.post('/', (req,res,next) => { const {name, username, text} = req.body const tweet = { id : Date.now().toString(), name, username, text, createdAt :new Date().toString() } tweets = [tweet, ...tweets] res.status(201).json(tweet) }) //PUT /tweets/:id router.put('/:id',(req,res,next) => { const id = req.params.id; const text = req.body.text const tweet = tweets.find((tweet) => tweet.id === id); if(tweet) { tweet.text = text; res.status(200).json(tweet) }else { res.statusCode(404) } }) //DELETE /tweets/:id router.delete('/:id',(req,res,next) => { const id = req.params.id; tweets = tweets.filter((tweet)=> tweet.id !== id); res.sendStatus(204); }) export default router
이렇게 작성한 내용을 바탕으로
POSTMAN에서 API테스트를 진행했는데 수월하게 끝났다!
반응형'Project > 트윗 클론코딩' 카테고리의 다른 글
Authentication 구축하기 (0) 2023.09.30 서버에서 Validation & Sanitization 수행하기 (0) 2023.09.24 서버 아키텍쳐 구축하기 (0) 2023.09.23 REST API 디자인하기 (0) 2023.09.19 프로젝트 개요 (0) 2023.09.19