프로젝트 진행 전에 준비해야하는 내용들에 대해 정리해보자.
백엔드 구현 준비
기술 스택
- 프론트: React
- 백엔드: Express, crypto, jsonwebtoken, dotenv, sequelize
사용되는 라이브러리에 대해서
-
crypto
Node.js에 내장되어 있는 모듈 중 하나로, 문자열을 암호화, 복호화, 해싱할 수 있도록 도와주는 모듈이다.
-
sequelize
Oracle, Postgres, MySQL, MariaDB, SQLite 및 SQL Server등을 위한 Node.js의 ORM이다.
- ORM이란?
Object Relation Mapping의 약어로 데이터베이스의 테이블 구조를 객체로 표현하여 SQL쿼리문을 직접 작성하지 않고도 데이터베이스 작업을 수행할 수 있게 해주는 것이다.
- 그럼 SQL쿼리 사용 안하게 해주는거 뿐인가요?
SQL쿼리를 작성할때, 테이블에 들어가는 제약조건과 데이터 타입, 컬럼등을 객체로 정의하여 보다 쉽고 직관적으로 작성할 수 있게해준다.
- 모델 클래스랑 무슨 연관인가요?
모델 클래스는 말 그대로 데이터베이스 테이블(모델)과 연관된 클래스로, 데이터의 구조오 ㅏ관련된 로직을 정의하는데, 이때 Sequlize를 사용하면 모델 클래스 정의가 쉬워진다.
-
jsonwebtoken
JWT를 사용하기 쉽게 만들어주는 라이브러리이다.
- Access Token
사용자가 인증되었다는 증거로, 보통 헤더에 들어가는 친구다. 특징으로는 유효기간이 짧아서 만료되면 재발급 받아야 한다.
- Refresh Token
Access Token이 만료되었을 때, 사용자가 다시 로그인하지 않고 새로운 Access Token을 발급받을 수 있도록 해당 토큰을 보내 Access Token을 요청한다. 그래서 상대적으로 유효 기간이 길어 보안상의 이유로 서버에 저장된다.
프로젝트 주제
도서관 웹사이트 제작
변수 명명법
와이어프레임의 주요기능을 참고하여 API 작성
와이어프레임이 있기에 간단정리만
메인
- 메인 => GET "/products" 로그인 여부 상관없음
- req: X
- res: 아이템 목록(id, 대표이미지, 제목, 작가, 요약정보, 가격, 좋아요수, 출간일)
=> GET "/products?categoryId=(categoryId)&new=(boolean)" 로그인 여부 상관없음
- req: X
- res: 아이템 목록(id, 대표이미지, 제목, 작가, 요약정보, 가격, 좋아요수, 출간일)
상세
- 상세 불러오기 => GET "/products/:id" 로그인 여부 상관없음
- req: X
- res
- 성공(200)
- 아이템 정보(id, 제목, 카테고리, 포맷, 작가명, ISBN, 요약설명, 상세설명, 목차, 가격, 출간일)
- 아이템 리뷰(작성자, 날짜, 내용)
- 좋아요 클릭 => PUT "/likes/:id" 로그인 여부 필요함
- req:JWT토큰
- res
- 유저의 좋아요 리스트에 없을때: 추가
- 유저의 좋아요 리스트에 있을떄: 삭제
- 카테고리 베스트 셀러
- 상세 -> 장바구니 => POST "/carts" 로그인 필요함
- req: 헤더에 JWT토큰, 아이템 id 및 수량
- res
- 로그인X: 로그인페이지로 이동시키기
- 로그인O: "${id}가 추가되었습니다."
장바구니
- 장바구니에서 불러오기 => GET "/carts" 로그인 필요
- req: JWT 토큰
- res: 유저 카트에 담긴 아이템 목록들(대표이미지, 제목, 금액, 수량)
- 장바구니에서 제거 => DELETE "/carts/:id" 로그인 필요
- req: JWT 토큰
- res: "성공적으로 제거하였습니다."
- 장바구니에 담긴거 주문하기 => POST "/orders/:carts_id" 로그인 필요
- req: JWT 토큰, 장바구니 아이디를 넘겨줌
- res
- 성공: "/orders"페이지로 이동
- 실패: "${item_name}를 주문할 수 없습니다" or "주문에 실패하였습니다."
주문서 작성
- 주문서 작성창 불러오기 => GET "/orders" 로그인 필요
- req: JWT토큰
- res:
- 장바구니에서 넘어온 아이템 목록(제목, 요약정보, 가격)
- 주문자 정보(주소, 수령인, 전화번호)
- 결제정보
- 주문서 확정 => PUT "/orders" 로그인 필요
- req: JWT토큰
- res: "주문을 수정했습니다" or "주문을 확정했습니다."
주문목록
- 주문목록: GET "/orders" 로그인 필요
- req: JWT토큰
- res
- 주문 일자
- 주문 아이템 리스트(제목, 요약정보, 가격)
- 배송정보(주소, 수령인, 전화번호)
- 결제정보
- 배송추적
회원
- 로그인 => POST "/auth/login" 로그인 했다면 메인
- req: email, pw
- res
- 성공(200): JWT토큰 발급 => 메인페이지로 보내주기
- 회원가입 => POST "/auth/join" 로그인 했다면 메인
- 비밀번호 초기화 이메일 링크 => POST "/auth/reset" 로그인 했다면 메인
- req: email
- res:
- 성공(200): 링크를 보내주거나 비밀번호 초기화칸 띄우기
- 비밀번호 초기화 => PUT "/auth/reset" 로그인 했다면 메인
- req: pw
- res
- 성공(200): "비밀번호를 재설정 하였습니다" => 로그인 페이지
목록
- 전체 책 조회 => GET "/product" 로그인 불필요
- req: X
- res
- 성공(200): 아이템 목록(id, 대표이미지, 제목, 작가, 요약정보, 가격, 좋아요수, 출간일)
패키지 구조 정돈
router: API로 작성한 엔드포인트의 라우트를 관리하는 파일들이 들어감
controller: 클라이언트 요청에 대한 각각의 Service를 호출하는 파일들이 들어감
Service: 비즈니스 로직을 담고 있는 파일들이 들어감
model: 데이터베이스에 대한게 들어감
🗂️/source
⎪ 📂 /router
⎪ ├── 📄 auth.js
⎪ ├── 📄 carts.js
⎪ ├── 📄 orders.js
⎪ ├── 📄 products.js
⎪ └── 📄 main.js
⎪ 📂 /controller
⎪ ├── 📄 authContorller.js
⎪ ├── 📄 cartsContorller.js
⎪ ├── 📄 ordersContorller.js
⎪ ├── 📄 productsContorller.js
⎪ └── 📄 mainContorller.js
⎪ 📂 /service
⎪ ├── 📄 authService.js
⎪ ├── 📄 cartsService.js
⎪ ├── 📄 ordersService.js
⎪ ├── 📄 productsService.js
⎪ └── 📄 mainService.js
⎪ 📂 /model
⎪ ├── 📄 index.js
⎪ └── 📄 mariadb.js
├──📄 app.js
└──⚙️ .env