ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Node.js] blogger-demo파일 리팩토링 | Refactoring
    JavaScript 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)

    - 작성한 소스코드에서 소프트웨어의 외부 동작을 변경하지 않으면서 내부 구조를 개선하는 프로세스.

    - 이는 코드의 가독성을 높이고, 유지보수를 용이하게 하며, 오류를 찾고 성능을 개선하는 데 도움이 됨.

    - 리팩토링은 주로 코드의 명확성, 효율성, 간결성을 향상시키는데 목적을 둠.

    리팩토링의 중요성

    1. 가독성 향상: 깔끔하고 잘 구조화된 코드는 이해하기 쉽고, 다른 개발자들이 더 빠르게 코드에 익숙해짐
    2. 유지보수 용이성: 잘 정리된 코드는 버그 수정, 기능 추가 또는 업데이트를 쉬움
    3. 성능 개선: 불필요한 코드 제거나 더 효율적인 알고리즘으로의 변경을 통해 프로그램의 실행 성능을 향상
    4. 재사용성 증가: 모듈화 및 재사용 가능한 코드 작성은 전체 소프트웨어 시스템의 유연성을 증가

    리팩토링을 할 때

    • 코드 중복 감지: 동일하거나 매우 유사한 코드가 여러 곳에 존재하는 경우 중복을 제거
    • 긴 메소드 또는 클래스: 너무 길거나 복잡한 메소드나 클래스는 이해하기 어렵기 때문에 작은 단위로 나눔
    • 코드 냄새(Code Smell): 나쁜 설계 또는 프로그래밍 관행이 코드에 존재하는 것을 감지했을 때 리팩토링을 고려
    • 성능 문제: 프로그램의 특정 부분에서 성능 문제가 발생하는 경우, 리팩토링을 통해 최적화
    • 새 기능 추가 전: 새로운 기능을 추가하기 전에 기존 코드를 정리하여 통합을 용이
    • 버그 수정 후: 버그를 수정한 후 코드를 리팩토링하여 미래의 유사한 오류를 방지

    리팩토링 절차

    1. 테스트: 리팩토링 전에 충분한 자동화된 테스트를 준비하여 코드 변경으로 인한 기능상의 변화를 감지할 수 있도록 함
    2. 작은 단계로 리팩토링: 큰 변경보다는 작은 단위로 리팩토링을 진행하며, 각 단계마다 테스트를 실행하여 문제가 없는지 확인
    3. 지속적인 리팩토링: 코드베이스에 지속적으로 리팩토링을 적용하여 코드의 질을 유지

    주의 사항

    • 리팩토링은 기능을 추가하거나 버그를 수정하는 것이 아니라, 코드의 내부 구조를 개선하는 것
    • 배포, 운영 직전 코드 수정 금지
    • 리팩토링 과정에서 기능상의 변경이나 버그 추가를 피해야 함
    • 충분한 테스팅 없이 리팩토링을 진행하는 것은 위험

     

     


     

     

    해당 내용을 바탕으로 <blogger-demo.js> 파일 리팩토링 진행

     

    1. 함수 분리: 각 API 엔드포인트의 로직을 별도의 함수로 분리하여 코드의 가독성을 향상
    2. 에러 처리 개선: 404 Not Found 에러 처리를 더욱 명확하게 하고, 일관된 에러 응답 포맷을 사용
    3. 변수 이름 명확화
    4. 중복 코드 최소화: 공통 로직을 함수로 분리하여 중복을 줄임

     

    - 기존 코드- 

    /*
    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} 블로거가 삭제되었습니다.` });
    }
    반응형
Designed by Tistory.