
최종적으로 diagrma이 완성됐다!이렇게보니 정말.. 사용해야할 데이터가 많아 보인다 🙄처음에 API 설계할 때와는 좀 다른 듯 하다.. 역시 하면서 점점 바뀐다는 게 사실이었다 😥 이번엔 결제(주문)하기 API 구현할 예정이다!사용할 테이블은 orders / orderedBook / delivery 테이블이다.Foreign key도 diagram 처럼 워크벤치로 미리 작업을 해놓은 상태다.결제 API 설계는 이렇게 했었다.REQ에서 items(상품목록)의 데이터들은 orderedBook 테이블에 insert를 할 것이고,delivery(배송정보) 데이터들은 delivery 테이블에 insert를 할 예정이다.totalQuantity, totalPrice, user_id, firstBookTitle..

우선, 장바구니 API를 구현하면서 문제가 있었다.워크벤치에서 cartItems(장바구니) 테이블을 만들면서 Foreign Key 설정 중 문제였다.Foreign Key Name과 Index Name이 중복이 되어서 그런 거였다..그래서 간단하게 fk 제약조건 이름을 지었다. [ fk_기준 테이블명_참조테이블명_참조키 ]ex) cartItems.user_id > users.id => fk_cartItems_users_idex) likes.user_id > users.id => fk_likes_users_id 이렇게 만들기로 규칙을 만들었다. 이전에 만든 테이블들은 지나가고, cartItems 테이블부터 사용할 것이다.cartItems 테이블을 생성했으니, 이제 본격적으로 API 구현을 해보려한다👍 ..

2024.12.16 - [웹 개발 공부하기] - [12.16] 좋아요 API 구현해보기😍 자, 이제 좋아요 기능을 구현해봤으니 좋아요 수를 나타내고 좋아요 여부도 나타내보고자 한다. 💥 좋아요 수 구하기liked_book_id 가 1인 데이터를 보여줘. 라는 뜻이다.그럼 총 3개의 행이 나오는 걸 볼 수 있는데, 이 갯수만 보고싶을 땐 어떡해야할까?바로, count라는 함수를 붙여주면된다. 조건에 만족하는 행의 갯수를 알아서 계산해주는 걸 볼 수 있다. 굿👍 그럼 좋아요 갯수를 세고 books 테이블에 컬럼 추가해서 출력을 해보겠다!SELECT *, (SELECT count(*) FROM likes WHERE liked_book_id=books.id) AS likes FROM books; * 뒤에..

다이어그램에서 likes 테이블을 생성해, user_id와 liked_book_id의 Foreign Key 설정을 해준다.1명의 유저가 다양하게 좋아요 를 누를 수 있기 때문에 1:N 의 관계를 가질 것이다.그럼 이제, 워크벤치에서도 똑같이 테이블을 생성한 뒤, Foreign Key 설정을 해주겠다.워크벤치에서 likes 테이블을 생성한 뒤, user_id와 liked_book_id에 Foreign Key를 설정해준다. 다른 API와 동일하게 LikeController.js 를 만든 후, 그 안에 로직을 짜려고 한다.likes.js에는 말 그대로 router가 경로만 알려주게끔 만들었다. 💥 좋아요 추가 API 구현const addLike = (req,res) => { const {id} = re..

우선, 카테고리를 나타내는 페이지가 있는 만큼 카테고리 이름이 잘 뽑아지도록 JOIN을 해줘야한다.category 테이블과 books 테이블을 조인해서, category_id에 맞는 category_name이 뽑아지도록 해주었다.( category 테이블의 name => category_name 으로 변경 )foreign Key 설정하기JOIN 해주기diagram 수정category 테이블의 id 1개 당 books 테이블의 category_id는 다수가 존재하므로 다대일 로 설정해주었다. let sql = 'SELECT * FROM books LEFT JOIN category ON books.category_id = category.id WHERE books.id=?;';개별 도서 조회에서 카테고리를 ..

우선, 도서 API를 구현해보기 전에 바꿔야할 것이 있다.API 설계 당시 books의 컬럼명에 문제가 있었다. format과 description 그리고 index 이다.해당 단어들로 컬럼으로 만들어서 사용하려하면 파란색으로 바뀐다.즉, 예약어이니 웬만하면 사용하지말지? 라는 뜻이다.그래서 format 은 form 으로, description은 detail로, index는 contents로 바꿔서 사용하였다. 이번 도서 API도 이전에 했던 회원가입 API와 동일하게 routes 폴더안에 books 라는 경로 파일을 만들어주고,controller 폴더 안에 BookController 라는 파일을 만들어 로직을 짰다. 도서 API는 총 3가지로 설계했었다.1. 전체 도서 조회2. 개별 도서 조회3. 카테..

2024.12.11 - [웹 개발 공부하기] - [12.11] 설계한 API를 구현해보자(회원가입,로그인)😀 회원가입과 로그인은 잘 되었으니, 이번엔 비밀번호 초기화 요청을 해보고 초기화까지 해보도록 하겠다. 💥 비밀번호 초기화 요청사실상 비밀번호 초기화 요청은 API 설계할 때도 그랬지만 어려울 것은 없었다.입력받은 email이 가입된 email 이 맞는 지 확인하는 정도이다.그래서 sql 은 SELECT 문을 사용하였다.const user = results[0];if(user){ return res.status(StatusCodes.OK).json({ email : email });} else { return res.status(StatusCodes.UNAUTHORIZ..

node.js 패키지(파일) 구조는 아래와 같다.app.js : 프로젝트의 메인 라우터 역할/user.js : 하위 라우터 역할....... 이런 식으로 라우터는 경로를 찾아주는 역할을 한다.근데 지금까지 프로젝트는 router와 연결하여 로직을 짰었다. 그렇게 되면 라우터가 로직까지 다~ 수행을 하기 때문에 코드가 복잡해지고 가독성이 떨어져서 유지보수에 어려움이 있다.그래서 오늘부턴 좀 다르게 해보려고 한다! UserController 라는 js 파일을 새로 생성하고 controller 라는 폴더안에 넣어서 사용할 것이다.UserController 파일에 실질적인 로직이 들어가는 것이다. 이렇게 되면 지난 번의 프로젝트와는 다르게라우터가 로직까지 수행하지 않아도 되고 경로만 찾아주기 때문에 관리에도 굉..

2024.12.10 - [웹 개발 공부하기] - [12.10] express-generator 구조 오늘은 새로운 프로젝트 들어가기 전에, 가장 기본적인 app.js 구현과 users.js 파일 기본 모듈화를 하였다.const express = require('express');const app = express();const dotenv = require('dotenv');dotenv.config();app.listen(process.env.PORT);const userRouter = require('./routes/users');const bookRouter = require('./routes/books');const cartRouter = require('./routes/carts');const l..

bin/www : 포트 번호 등과 같은 웹 서버를 구축하는데 필요한 설정 데이터가 정의되어 있는 파일 => .env 파일과 같이 설정 값을 가지고 에러 처리, 기타 추가 설정을 해주는 파일 node_modules : Node.js, Express에 필요한 모듈들이 설치되는 폴더 public : images, javascripts, stylesheets -> 정적 파일(ex. 로고, 회사 소개 페이지, ...)(cf. 동적 : 사람마다 다른 데이터) routes : 각 경로를 담당하는 모듈들이 들어있는 폴더 = 라우팅 로직을 구현하는 모듈들 : 클라이언트에서 어떤 요청을 주냐에 따라서 어떤 로직을 수행할 지 파일별로 분할해서 관리하는 정도(cf. 자바의 controller 역할) vie..