[React/Node.js/Express/MongoDB] 소셜 가계부 프로젝트 구현 일지: 백엔드 구현하기 (입출금 내역 - GET 요청 보내기)

2024. 1. 26. 21:48·웹 프로젝트/👨‍👨‍👧‍👧소셜 가계부
반응형

기본 라우터 추가하기(GET 요청 사용)

app.js

const express = require("express");
const bodyParser = require("body-parser");

const app = express();

const transactionsRouter = require("./routes/transactions-routes");

app.use(transactionsRouter);

app.listen(5000);

 

* app.use()

지정된 경로에 존재하는 미들웨어 함수를 마운트한다. (요청된 경로와 일치하는 미들웨어 함수가 실행된다.)

 

Express 4.x - API 참조

Express 4.x API express() Creates an Express application. The express() function is a top-level function exported by the express module. var express = require('express') var app = express() Methods express.json([options]) This middleware is available in Ex

expressjs.com

 

routes > transactions-routes.js

const express = require("express");

const router = express.Router(); //특수 객체 생성

//라우트에 요청이 도달하면 실행되어야 하는 함수
router.get("/", (req, res, next) => {
  console.log("Ger request");
  res.json({ message: "작동됨" }); //원하는 객체 전달
});

// router 상수를 내보내기
module.exports = router;

 

http://localhost:5000/ 접속 시 아래와 같이 뜨면 정상적으로 GET 요청이 진행되고 있다는 뜻이다.

입출금 내역 id별 라우터 추가하기(GET 요청 사용)

app.js

const express = require("express");
const bodyParser = require("body-parser");

const app = express();

const transactionsRouter = require("./routes/transactions-routes");

// 경로가 "/api/transactions"로 시작된다면 transactionsRouter 실행
app.use("/api/transactions", transactionsRouter);

app.listen(5000);

 

routes > transactions-routes.js

const express = require("express");

const router = express.Router(); //특수 객체 생성

const DUMMY_TRANSACTION = [
  {
    tid: "1",
    date: 1705029633942,
    category: "교통/차량",
    description: "버스비",
    amount: -4000,
    transaction_type: "지출",
    memo: "버스비",
  },
  {
    tid: "2",
    date: 1705129633942,
    category: "용돈",
    description: "용돈",
    amount: 12000,
    transaction_type: "수입",
    memo: "",
  },
  {
    tid: "3",
    date: 1705229633942,
    category: "문화비",
    description: "서적구매",
    amount: -25000,
    transaction_type: "지출",
    memo: "컴퓨터공학입문서 구입",
  },
];

//라우트에 요청이 도달하면 실행되어야 하는 함수
router.get("/:tid", (req, res, next) => {
  const transactionId = req.params.tid; // type: string

  const transaction = DUMMY_TRANSACTION.find((t) => {
    return t.tid === transactionId;
  });
  res.json({ transaction: transaction }); //원하는 객체 전달
});

// router 상수를 내보내기
module.exports = router;

 

http://localhost:5000/api/transactions/3

위 api 주소로 접속 시, 아래와 같이 전송한 api 정보가 뜬다.

에러 핸들링

app.js

const express = require("express");

const app = express();

const transactionsRouter = require("./routes/transactions-routes");

// 경로가 "/api/transactions"로 시작된다면 transactionsRouter 실행
app.use("/api/transactions", transactionsRouter);

//매개변수 4개: 오류 처리 미들웨어 함수
//앞의 미들웨어 함수에서 오류가 발생했을 때만 실행된다.
app.use((error, req, res, next) => {
  //응답이 이미 전송되었는지 확인
  if (res.headerSent) {
    return next(error);
  }

  //응답이 전송되지 않은 경우
  //상태 코드가 정의된 경우에는 코드를, 아닌 경우에는
  //서버에 어떤 문제가 있음을 알려주는 기본 상태코드 500이 반환되도록 함
  res.status(error.code || 500);
  res.json({ message: error.message || "정의되지 않은 에러 발생" });
});

app.listen(5000);

 

routes > transaction-routes.js

const express = require("express");

const router = express.Router(); //특수 객체 생성

const DUMMY_TRANSACTION = [
  ...
];

//라우트에 요청이 도달하면 실행되어야 하는 함수
router.get("/:tid", (req, res, next) => {
  const transactionId = req.params.tid; // type: string

  const transaction = DUMMY_TRANSACTION.find((t) => {
    return t.tid === transactionId;
  });

  // 입출금 내역 id 찾지 못한 경우 에러 핸들링
  // 비동기 코드가 존재하는 경우 next에 오류를 전달하는 방식으로 에러 처리
  if (!transaction) {
    const error = new Error("해당 ID에 대한 입출금내역을 찾지 못했습니다.");
    error.code = 404; //오류 상태
    throw error;
  }

  res.json({ transaction: transaction }); //원하는 객체 전달
});

// router 상수를 내보내기
module.exports = router;

 

http://localhost:5000/api/transactions/39

위 api 주소로 접속 시, 39번 tid를 가진 입출금 내역은 없기 때문에 아래와 같이 에러 정보가 출력된다.

 

 

routes 파일과 controller 파일 분리 (코드 모듈화)

코드의 구조화와 유지보수성을 높이기 위한 코드 모듈화를 진행하였다.

 

`기존 routes 파일`

routes > transactions-routes.js

const express = require("express");

const router = express.Router(); //특수 객체 생성

const DUMMY_TRANSACTION = [
  ...
];

//라우트에 요청이 도달하면 실행되어야 하는 함수
router.get("/:tid", (req, res, next) => {
  const transactionId = req.params.tid; // type: string

  const transaction = DUMMY_TRANSACTION.find((t) => {
    return t.tid === transactionId;
  });

  // 입출금 내역 id 찾지 못한 경우 에러 핸들링
  // 비동기 코드가 존재하는 경우 next에 오류를 전달하는 방식으로 에러 처리
  if (!transaction) {
    const error = new Error("해당 ID에 대한 입출금내역을 찾지 못했습니다.");
    error.code = 404; //오류 상태
    throw error;
  }

  res.json({ transaction: transaction }); //원하는 객체 전달
});

// router 상수를 내보내기
module.exports = router;

routes 파일에서 컨트롤러 코드를 따로 분리해 주었다.

routes는 URL의 경로를, controllers는 해당 경로의 비즈니스 로직을 다룬다.

 

👇

 

`파일 분리를 마친 후 routes 파일`

routes > transactions-routes.js

const express = require("express");

const router = express.Router(); //특수 객체 생성

const transactionsControllers = require("../controllers/transactions-controller");

//라우트에 요청이 도달하면 실행되는 함수
router.get("/:tid", transactionsControllers.getTransactionById);

module.exports = router;

 

`파일 분리를 마친 후 controller 파일`

controllers > transactions-controller.js

const DUMMY_TRANSACTION = [
  {
    tid: "t1",
    uid: "u1",
    date: 1705029633942,
    category: "교통/차량",
    description: "버스비",
    amount: -4000,
    transaction_type: "지출",
    memo: "버스비",
  },
  {
    tid: "t2",
    uid: "u2",
    date: 1705129633942,
    category: "용돈",
    description: "용돈",
    amount: 12000,
    transaction_type: "수입",
    memo: "",
  },
  {
    tid: "t3",
    uid: "u1",
    date: 1705229633942,
    category: "문화비",
    description: "서적구매",
    amount: -25000,
    transaction_type: "지출",
    memo: "컴퓨터공학입문서 구입",
  },
  {
    tid: "t4",
    uid: "u2",
    date: 1709329633942,
    category: "식비",
    description: "외식비",
    amount: -52000,
    transaction_type: "지출",
    memo: "외식",
  },
];

const getTransactionById = (req, res, next) => {
  const transactionId = req.params.tid; // type: string

  const transaction = DUMMY_TRANSACTION.find((t) => {
    return t.tid === transactionId;
  });

  // 에러 핸들링
  if (!transaction) {
    const error = new Error("해당 ID에 대한 입출금내역을 찾지 못했습니다.");
    error.code = 404; //오류 상태
    throw error;
  }

  res.json({ transaction: transaction });
};

exports.getTransactionById = getTransactionById;

 

 

유저 id별 입출금 내역 GET 요청

입출금 id별 입출금을 가져올 때와 동일한 방식으로 유저별 입출금 내역 가져오기를 진행한다.

 

transactions-controllers.js

const getTransactionByUserId = (req, res, next) => {
  const userId = req.params.uid;

  const transactions = DUMMY_TRANSACTION.filter((u) => {
    return u.uid === userId;
  });

  if (!transactions || transactions.length === 0) {
    const error = new Error(
      "해당 유저의 입출금내역을 찾지 못했습니다."
    );
    error.code = 404;
    throw error;
  }

  res.json({ transactions });
};

exports.getTransactionByUserId = getTransactionByUserId;

 

transactions-routes.js

router.get("/user/:uid", transactionsControllers.getTransactionsByUserId);

 

http://localhost:5000/api/transactions/user/u1 주소로 접속 시, u1이라는 id를 가진 유저의 가계부 목록을 배열 형태로 불러온다.

반응형
저작자표시 비영리 변경금지 (새창열림)

'웹 프로젝트 > 👨‍👨‍👧‍👧소셜 가계부' 카테고리의 다른 글

[React/Node.js/Express/MongoDB] 소셜 가계부 프로젝트 구현 일지: 리덕스(Redux)로 가계부 데이터 상태 관리 1(리덕스 선택이유, 리덕스 정의 및 스토어, 액션, 리듀서 정의, 덕스패턴 적용까지)  (0) 2024.03.07
[React/Node.js/Express/MongoDB] 소셜 가계부 프로젝트 구현 일지: 몽고DB 연동 후 데이터 전송하기 (입출금 내역 POST, GET, PATCH, DELETE 요청)  (0) 2024.01.28
[React/Node.js/Express/MongoDB] 소셜 가계부 프로젝트 구현 일지: 백엔드 구현하기 (입출금 내역 - POST, PATCH, DELETE 요청)  (0) 2024.01.27
[React/Node.js/Express/MongoDB] 소셜 가계부 프로젝트 구현 일지: 백엔드 구현하기 (사전 작업 - express, nodemon, body-parser 설치 및 테스트 작성)  (1) 2024.01.25
[React/Node.js/Express/MongoDB] 소셜 가계부 프로젝트 구현 일지: 프론트엔드 초안 작성하기(라우터 설정, 가계부 월별 이동하기 구현)  (1) 2024.01.16
[React/Node.js/Express/MongoDB] 소셜 가계부 프로젝트 구현 일지: 기존 React + Spring Boot 소셜 로그인 코드 삭제하기  (0) 2024.01.13
'웹 프로젝트/👨‍👨‍👧‍👧소셜 가계부' 카테고리의 다른 글
  • [React/Node.js/Express/MongoDB] 소셜 가계부 프로젝트 구현 일지: 몽고DB 연동 후 데이터 전송하기 (입출금 내역 POST, GET, PATCH, DELETE 요청)
  • [React/Node.js/Express/MongoDB] 소셜 가계부 프로젝트 구현 일지: 백엔드 구현하기 (입출금 내역 - POST, PATCH, DELETE 요청)
  • [React/Node.js/Express/MongoDB] 소셜 가계부 프로젝트 구현 일지: 백엔드 구현하기 (사전 작업 - express, nodemon, body-parser 설치 및 테스트 작성)
  • [React/Node.js/Express/MongoDB] 소셜 가계부 프로젝트 구현 일지: 프론트엔드 초안 작성하기(라우터 설정, 가계부 월별 이동하기 구현)
청량리 물냉면
청량리 물냉면
프로그래밍 공부를 하고 있습니다. 공부 내용 정리 겸 정보 공유를 목적으로 합니다.
    반응형
  • 청량리 물냉면
    노력중인 블로그
    청량리 물냉면
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • 프로그래밍 N
        • Programming
        • C | C++
        • Java N
        • Python
      • 웹 프로그래밍
        • HTML | CSS
        • JavaScript | TypeScript
        • React
        • Vue.js
        • Next.js
        • Spring & Spring Boot
        • JSP & Servlet
        • DB
      • 웹 프로젝트
        • 웹 프로젝트
        • 🥨스낵몰
        • 👨‍👨‍👧‍👧소셜 가계부
        • 🌜꿈 일기장
        • 🔮포트폴리오 사이트
        • 🏃‍♂️팀 프로젝트: 일정관리 프로그램
        • 📈팀 프로젝트: AI기반 주식 분석 플랫폼
        • 😺Just Meow It: 고양이의 조언
      • 앱 프로그래밍
        • Flutter
        • Kotlin
      • Problem Solving
        • 백준
        • 프로그래머스
        • SWEA
      • Computer Science
        • 알고리즘
        • 컴퓨터 네트워크
        • 이산수학
      • Developer
        • 후기
        • 자료정리
        • 취업 | 취준
        • 웹개발 교육 프로그램
        • TIL
  • 블로그 메뉴

    • 홈
    • Github
  • 공지사항

    • 프로그래밍 공부 중😊
  • 인기 글

  • 태그

    포트폴리오
    백준
    알고리즘
    Next.js
    공식문서
    프로젝트
    Til
    플러터
    자바
    React
    자바스크립트
    뉴렉처
    리액트
    Jiraynor Programming
    타입스크립트
    구현
    SWEA
    웹사이트
    컴퓨터네트워크
    ZeroCho
    mysql
    프로그래머스
    파이썬
    클론 프로젝트
    AWS
    블로그 제작
    강의내용정리
    bfs
    spring boot
    d3
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
청량리 물냉면
[React/Node.js/Express/MongoDB] 소셜 가계부 프로젝트 구현 일지: 백엔드 구현하기 (입출금 내역 - GET 요청 보내기)
상단으로

티스토리툴바