[프로그래머스] Node기반 REST API 구현(2)

Lina Hongbi Ko·2024년 10월 1일
0

Programmers_BootCamp

목록 보기
27/76
post-thumbnail

2024년 10월 1일

✏️ API, 테이블 점검

  • users 테이블 관련 데이터는 email, password가 있으면 됨
  • books 테이블 관련 데이터는 id, title, summary, author, price, likes, pubDate, category, format, isbn, likes
    • liked는 likeses 테이블에서 liked_book_id로 지정할 예정.

    • 카테고리별 도서 목록 조회에서는 category_id를 url로 요청할 것이니까 카테고리별 도서를 보여주기 위해 category 테이블을 만들어야 한다

    • 신간 조회는 sql로 범위를 걸 예정

  • likes 테이블은 좋아요를 하면 insert, 취소하면 delete
  • cartItems 테이블 → 장바구니 담기 : bookId, count, 장바구니 조회: id, bookId(도서 정보들 이 친구를 통해 가져올 예정), 장바구니 도서 삭제 : bookId를 url로 요청해서 삭제, 주문 예상 상품 목록 조회 : cartsItems 테이블의 id값을 받아와서, 어떤걸 선택했는지 얘로 요청(request)함 & bookId로 도서 정보 보여줄 예정
  • orders 테이블 → 주문하기 : (데이터베이스에 insert) items, delivery, totalprice 요청(request) 여기서 bookId가 필요한 이유는 주문하면 cartItemId가 사라지기 때문, 주문 목록 조회 : 주문하기 했던 것들 response로 보여줌 주문 상세 상품 조회 : orderedBook 테이블의 order_id를 url로 검색하면 book_id로 도서 정보 보여줌

✏️ express-generator

  • express-generator 구조
    • bin/www : 포트 번호 등과 같은 웹서버를 구축하는데 필요한 설정 데이터가 정의 되어 있는 파일 → .env파일과 같이 설정 값을 가지고 에러 처리, 기타 추가 설정을 해주는 파일
    • node_modues : Node.js, Express에 필요한 모듈들이 설치되는 폴더
    • public : images, javascripts, stylesheets → 정적 파일
      *동적 : 사람마다 다른 데이터 / 정적 : 모두가 같은 데이터 ex) 로고, 회사 소개 페이지 파일 → 프론트에서 신경쓰는 폴더
    • routes : 각 경로를 담당하는 모듈들이 들어있는 폴더 = 라우팅 로직을 구현하는 모듈들 : 클라이언트에서 어떤 요청을 주냐에 따라서 어떤 로직을 수행할지 파일별로 분할해서 관리하는 정도
      cf) 자바의 controller 역할
      app.js : express 서버 시작점 ⇒ url에 따라 라우팅을 함
    • views : 클라이언트에게 htm코드로 ‘화면을 보내는 파일’ → 프론트에서 신경쓰는 폴더
    • package.json : 이 프로젝트에 설치된 모듈 이름, 버전 등등 정보들이 작성되어있는 파일
  • public, view 제외하고는 우리가 직접 생성한 프로젝트와 비슷함

✏️ 프로젝트 셋팅

  • 새로운 프로젝트 생성 : bookshop

  • 이전에 받았던 dependencies 이용할 예정

    • 프로젝트 기본 구성을 위해 dependencies 설치해보자

      • npm install express → node moudle 폴더, package-lock.json, pacakge.json 파일 생김
      • npm install dotenv express-validator jsonwebtoken mysql2 (한꺼번에 설치)
      • package.json 가서 확인하면 정상적으로 설치되어 있는 것 볼 수 있음
  • 최상위 루트에 app.js 파일 생성
// app.js

// express 모듈
const express = require('express');
const app = express();

// dotenv 모듈
const dotenv = require('dotenv');
dotenv.config();

app.listen(process.env.PORT);
// .env

PORT = 9999

localhost:9999 → Cannot GET / 보임 → 서버 잘 작동함

✏️ users 기본 모듈화

routes 폴더 만들고, users.js 생성

// users.js

const express = require('express');
const router = express.Router();
router.use(express.json());

// 회원가입
router.post('/join', (req, res) => {
	res.json('회원가입');
});
// 로그인
router.post('/login', (req, res) => {
	res.json('로그인');
});
// 비밀번호 초기화 요청
router.post('/reset', (req, res) => {
	res.json('비밀번호 초기화 요청');
});
// 비밀번호 초기화
router.put('/reset', (req, res) => {
	res.json('비밀번호 초기화');
});

module.exports = router;
// app.js

// express 모듈
const express = require('express');
const app = express();

// dotenv 모듈
const dotenv = require('dotenv');
dotenv.config();

app.listen(process.env.PORT);

const userRouter = require('./routes/users');

app.use('/users', userRouter);

POSTMAN) POST + localhost:9999/users/join

✏️ books, likes, carts, orders 기본 모듈화

  • 다양한 분기가 필요해보임

    • routes / books.js
    • routes / carts.js
    • routes / likes.js
    • routes / oreders.js
    • routes / users.js
  • 나머지도 연결해주기

// books.js

const express = require('express');
const router = express.Router();

router.use(express.json());

// 전체 도서 조회
router.get('/', (req, res) => {
	res.json('전체 도서 조회');
});

// 개별 도서 조회
router.get('/:id', (req, res) => {
	res.json('개별 도서 조회');
});

// 카테고리별 도서 목록 조회
router.get('/', (req, res) => {
	res.json('카테고리별 도서 조회');
});
// 쿼리 스트링은 res.query.categoryId를 이용할 예정

module.exports = router;
// likes.js

const express = require('express');
const router = express.Router();

router.use(express.json());

// 좋아요 추가
router.post('/:id', (req, res) => {
	res.json('좋아요 추가');
});

// 좋아요 삭제
router.delete('/:id', (req, res) => {
	res.json('좋아요 삭제'};
});

module.exports = router;
// carts.js

const express = require('express');
const router = express.Router();

router.use(express.json());

// 장바구니 담기
router.post('/', (req, res) => {
	res.json({'장바구니 담기'});
});

// 장바구니 조회
router.get('/', (req, res) => {
	res.json({장바구니 조회');
});

// 장바구니 도서 삭제
router.delete('/:id', (req, res) => {
	res.json('장바구니 도서 삭제');
});

// 장바구니에서 선택한 주문 예상 상품 목록 조회
// router.get('/', (req, res) => {
	// res.json('장바구니에서 선택한 주문 예상 상품 목록 조회');
// });

module.exports = router;
// orders.js

const express = require('express');
const router = express.Router();

router.use(express.json());

// 주문 하기
router.post('/', (req, res) => {
	res.json({'주문 하기'});
});

// 주문 목록(내역) 조회
router.get('/', (req, res) => {
	res.json({'주문 목록(내역) 조회'});
});

// 주문 상세 상품 조회
router.get('/:id', (req, res) => {
	res.json({'주문 상세 상품 조회'});
});

module.exports = router;
// app.js

// express 모듈
const express = require('express');
const app = express();

// dotenv 모듈
const dotenv = require('dotenv');
dotenv.config();

app.listen(process.env.PORT);

const userRouter = require('./routes/users');
const bookRouter = require('./routes/books');
const likeRouter = require('./routes/likes');
const cartRouter = require('./routes/carts');
const orderRouter = require('./routes/orders');

app.use('/users', userRouter);
app.use('/books', bookRouter);
app.use('/likes', likeRouter);
app.use('/carts', cartRouter);
app.use('/orders', orderRouter);

✏️ dbdiagram users, workbench로 db만들기

  • dbdiagram 만들기
  • wrokbench로 db 만들기
  1. 스키마 생성 : schemas 창 오른쪽클릭 -> Create Schema... → 스키마 이름: Bookshop, utf8 : 세계에서 사용하는 유니코드(한국어 셋팅 위해서) → apply

  1. 테이블 생성
    *더블 클릭해서 진하게 만들어야 그 스키마에서 활동할 수 있음
    create table -> 필요한 데이터들 넣고 -> apply

❗️ users 테이블에 null이 되는 값은 주소값, 연락처는 가능하지만 로그인할 때 필요한 정보는 not null이 기본적임

🍎🍏 오늘의 느낀점 : API 설계 마무리부터 프로젝트 기본 셋팅, db만들기까지,, 그동안 배웠던 것들을 주욱 기억해보면서 따라하는 실습시간을 가졌다. API 설계는 역시 로직들을 생각하면서 짜야하니 머리가 아팠다,, 강사님과 같이 해서 그나마 수월했지만 API 설계를 하는 것은 많이 해보아야지 감이 올 것 같다. 다른 플젝들을 보면서 다른 사람들은 어떻게 구성했는지 이런것들도 좀 찾아보면서 익혀야겠다.!

profile
프론트엔드개발자가 되고 싶어서 열심히 땅굴 파는 자

0개의 댓글