-
[Node.js] blogger-demo파일 리팩토링 | RefactoringJavaScript 2024. 1. 9. 15:07반응형
https://github.com/heeheehoho/DevCourse
GitHub - heeheehoho/DevCourse: Programmers Web Full-Stack
Programmers Web Full-Stack. Contribute to heeheehoho/DevCourse development by creating an account on GitHub.
github.com
✍🏻리팩토링(Refactoring)
- 작성한 소스코드에서 소프트웨어의 외부 동작을 변경하지 않으면서 내부 구조를 개선하는 프로세스.
- 이는 코드의 가독성을 높이고, 유지보수를 용이하게 하며, 오류를 찾고 성능을 개선하는 데 도움이 됨.
- 리팩토링은 주로 코드의 명확성, 효율성, 간결성을 향상시키는데 목적을 둠.
리팩토링의 중요성
- 가독성 향상: 깔끔하고 잘 구조화된 코드는 이해하기 쉽고, 다른 개발자들이 더 빠르게 코드에 익숙해짐
- 유지보수 용이성: 잘 정리된 코드는 버그 수정, 기능 추가 또는 업데이트를 쉬움
- 성능 개선: 불필요한 코드 제거나 더 효율적인 알고리즘으로의 변경을 통해 프로그램의 실행 성능을 향상
- 재사용성 증가: 모듈화 및 재사용 가능한 코드 작성은 전체 소프트웨어 시스템의 유연성을 증가
리팩토링을 할 때
- 코드 중복 감지: 동일하거나 매우 유사한 코드가 여러 곳에 존재하는 경우 중복을 제거
- 긴 메소드 또는 클래스: 너무 길거나 복잡한 메소드나 클래스는 이해하기 어렵기 때문에 작은 단위로 나눔
- 코드 냄새(Code Smell): 나쁜 설계 또는 프로그래밍 관행이 코드에 존재하는 것을 감지했을 때 리팩토링을 고려
- 성능 문제: 프로그램의 특정 부분에서 성능 문제가 발생하는 경우, 리팩토링을 통해 최적화
- 새 기능 추가 전: 새로운 기능을 추가하기 전에 기존 코드를 정리하여 통합을 용이
- 버그 수정 후: 버그를 수정한 후 코드를 리팩토링하여 미래의 유사한 오류를 방지
리팩토링 절차
- 테스트: 리팩토링 전에 충분한 자동화된 테스트를 준비하여 코드 변경으로 인한 기능상의 변화를 감지할 수 있도록 함
- 작은 단계로 리팩토링: 큰 변경보다는 작은 단위로 리팩토링을 진행하며, 각 단계마다 테스트를 실행하여 문제가 없는지 확인
- 지속적인 리팩토링: 코드베이스에 지속적으로 리팩토링을 적용하여 코드의 질을 유지
주의 사항
- 리팩토링은 기능을 추가하거나 버그를 수정하는 것이 아니라, 코드의 내부 구조를 개선하는 것
- 배포, 운영 직전 코드 수정 금지
- 리팩토링 과정에서 기능상의 변경이나 버그 추가를 피해야 함
- 충분한 테스팅 없이 리팩토링을 진행하는 것은 위험
해당 내용을 바탕으로 <blogger-demo.js> 파일 리팩토링 진행
- 함수 분리: 각 API 엔드포인트의 로직을 별도의 함수로 분리하여 코드의 가독성을 향상
- 에러 처리 개선: 404 Not Found 에러 처리를 더욱 명확하게 하고, 일관된 에러 응답 포맷을 사용
- 변수 이름 명확화
- 중복 코드 최소화: 공통 로직을 함수로 분리하여 중복을 줄임
- 기존 코드-
/* object-api-demo.js 파일 참고 */ //express 모듈 세팅 const express = require('express') const app = express() // JSON 형식의 요청 본문을 파싱하기 위한 미들웨어 app.use(express.json()) // 데이터 세팅 let blogger1 = { blogName: "jungheeho", view: "1104명", descrpition: "열공티비" } let blogger2 = { blogName: "suddiyo", view: "4946명", descrpition: "꾸준히 기록하고 성장하는 백엔드 개발자" } let blogger3 = { blogName: "third", view: "3333명", descrpition: "hello" } let db = new Map() //map 객체인 db로 데이터 저장라는 데이터베이스 역할(id를 키로) / key-value형식 var id = 1 db.set(id++, blogger1) db.set(id++, blogger2) db.set(id++, blogger3) // REST API 설계 app.get("/bloggers", function (req, res) { const bloggers = Array.from(db.values()); res.json(bloggers); }); app.get('/bloggers/:id', function (req, res) { let { id } = req.params; //ES6 구조분해 할당 id = parseInt(id); const blogger = db.get(id); if (blogger == undefined) { res.status(404).json({ message: "블로거를 찾을 수 없음" }); } else { res.json(blogger); } }); app.post('/bloggers', function (req, res) { const newBlogger = req.body; db.set(id++, newBlogger); res.json({ message: `${newBlogger.blogName} 블로거 생활을 환영합니다!` }); }); app.delete('/bloggers/:id', function (req, res) { let { id } = req.params; //ES6 구조분해 할당 id = parseInt(id); var blogger = db.get(id) if (blogger == undefined) { res.json({ message: `요청하신 ${id}는 존재하지 않습니다` }) } else { const name = blogger.blogName db.delete(id) res.json({ message: `${name}는 삭제되었습니다.` }) } } ) app.listen(3000, () => { console.log("서버가 3000번 포트에서 시작되었습니다."); });
- 리팩토링 한 코드-
const express = require('express'); const app = express(); app.use(express.json()); let db = new Map(); let nextId = 1; // 블로거 데이터 초기화 initializeBloggers(); // REST API 라우트 app.get("/bloggers", getAllBloggers); app.get('/bloggers/:id', getBloggerById); app.post('/bloggers', createBlogger); app.delete('/bloggers/:id', deleteBlogger); app.listen(3000, () => { console.log("서버가 3000번 포트에서 시작되었습니다."); }); function initializeBloggers() { addBlogger({ blogName: "jungheeho", view: "1104명", description: "열공티비" }); addBlogger({ blogName: "suddiyo", view: "4946명", description: "꾸준히 기록하고 성장하는 백엔드 개발자" }); addBlogger({ blogName: "third", view: "3333명", description: "hello" }); } function addBlogger(blogger) { db.set(nextId++, blogger); } function getAllBloggers(req, res) { const bloggers = Array.from(db.values()); res.json(bloggers); } function getBloggerById(req, res) { const id = parseInt(req.params.id); const blogger = db.get(id); if (!blogger) { return res.status(404).json({ message: "블로거를 찾을 수 없음" }); } res.json(blogger); } function createBlogger(req, res) { const newBlogger = req.body; addBlogger(newBlogger); res.json({ message: `${newBlogger.blogName} 블로거 생활을 환영합니다!` }); } function deleteBlogger(req, res) { const id = parseInt(req.params.id); const blogger = db.get(id); if (!blogger) { return res.status(404).json({ message: `블로거 ${id}를 찾을 수 없음` }); } db.delete(id); res.json({ message: `${blogger.blogName} 블로거가 삭제되었습니다.` }); }
반응형'JavaScript' 카테고리의 다른 글
[Node.js] JSON 직렬화와 Map 객체 (2) 2024.01.08 [Node.js]Express.js 기반 웹 서버 구축 연습 | REST API (0) 2023.12.25 [TIL] 2023.12.16 | 웹 풀사이클 데브코스 (30) 2023.12.17 [Node.js] Url에 따라 프론트엔드에 다른 response 보내기 | new URL (2) 2023.12.17 [Node.js] URL parsing | TypeError: handle[pathname] is not a function | favicon.ico에러 (0) 2023.12.17