프로그래머스 풀스택 37
posted on 17 Oct 2024 under category programmers in series programmers
프로젝트: Node.js 기반의 REST API 구현(14)
💫 옥의 티 잡아내기 2 : 회원 인증 모듈화
let authorization = ensureAuthorization(req, res);
if(authorization instanceof jwt.TokenExpiredError) {
res.status(StatusCodes.UNAUTHORIZED).json({
"message" : "로그인 세션이 만료되었습니다. 다시 로그인 해주세요."
});
} else if (authorization instanceof jwt.JsonWebTokenError) {
res.status(StatusCodes.BAD_REQUEST).json({
"message" : "잘못된 토큰입니다."
});
}
💫 옥의 티 잡아내기 3 : 내 장바구니 조회
}else{
let sql = `SELECT cartItems.id, book_id, title, summary, quantity, price
FROM cartItems LEFT JOIN books
ON cartItems.book_id = books.id
WHERE user_id=?`;
let values = [authorization.id];
if (selected) { // 주문서 작성 시 '선택한 장바구니 목록 조회'
sql += ` AND cartItems.id IN (?)`;
values.push(selected);
}
💫 장바구니 API 설계 정리, 코드 정리
💫 결제(주문) API 회원 인증 추가
let authorization = ensureAuthorization(req, res);
if(authorization instanceof jwt.TokenExpiredError) {
res.status(StatusCodes.UNAUTHORIZED).json({
"message" : "로그인 세션이 만료되었습니다. 다시 로그인 해주세요."
});
} else if (authorization instanceof jwt.JsonWebTokenError) {
res.status(StatusCodes.BAD_REQUEST).json({
"message" : "잘못된 토큰입니다."
});
}else{
<POSTMAN 결과>
<Workbench 결과>
💫 개별 도서 조회 좋아요 여부에 jwt 확인
💫 로그인 상태가 아니라면 liked 제외
<코드 고도화>
💫 좋아요 추가, 삭제 로직 response 좋아요 수
💫 로그인 상태여야 하는 기능들 : 장바구니 도서 삭제, 주문 (상세) 내역 조회
각각 컨트롤러에 똑같이 인증 모듈 넣어주고 주문 상세 상품 조회 API도 req header를 통해 Authorization 값을 받기로 수정해줌
💫 전체 도서 조회 pagination 추가
💫 전체 도서 조회 pagination 구현
SELECT * FROM Bookshop.books LIMIT 4 OFFSET 0;
SELECT count(*) FROM Bookshop.books;
SELECT sql_calc_found_rows * FROM Bookshop.books LIMIT 4 OFFSET 0;
SELECT found_rows();
<POSTMAN 결과>
💫 전체 도서 조회 response body 구성 맞추기
let allBooksRes = {};
// ... 생략
sql = "SELECT found_rows()";
values.push(parseInt(limit), offset);
conn.query(sql,
(err, results) => {
if (err) {
console.error(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
let pagination = {};
pagination.currentPage = parseInt(currentPage);
pagination.totalCount =results[0]["found_rows()"];
allBooksRes.pagination = pagination;
return res.status(StatusCodes.OK).json(allBooksRes);
})
// ... 생략
💫 response 포맷 확인하기 (카멜?! 스네이크?!)
💫 response format 바꿔보기 : snake > camel
컬럼 수정 X 👉 JSON 키값 수정
if(results.length){
results.map(function(result) {
result.pubDate = result.pub_date;
delete result.pub_date;
});
💫 끝날때 까지 끝난 게 아님!!! (feat. 코드 퀄리티)
response 포맷 통일(snake 👉 camel), status code …
데이터베이스 중복 코드 👉 모듈화
ex. User.Controller 👉 User(데이터 모듈=Model) - CRUD
cf. DB 모듈 : mysql 👉 몽구스, 시퀄라이즈
패키지 구조
1) Router : 경로(URI, URL)와 HTTP method로 요청에 따른 경로를 찾아주는 역할
2) Controller : 길 매니저- 요청을 환영!! 직접 일을 하진 않음.
3) Service : 직접 일을 하고 ex. 어떤 쿼리를 부를지,
“비즈니스 로직”
4) Model : 데이터베이스와 소통 👉 query 집합
jwt(심화) : access token이 만료되면, ‘로그인 연장?’
로그인 시 access token(30m) refresh token(24h)
1) access token : 로그인한 사람이야 인증(만들어본 것)
2) refresh token: 로그인 연장하는 용도
Y 일을 통해 명확히 알게 되었거나 이해한 부분(한 일)에 대해 정리 :
코드의 고도화!
W 배운 점과 시사점 :
T 응용하여 배운 것을 어디에 어떻게 적용할지:
API와 코드를 일치하는 작업과 고도화를 통해 백엔드와 프론트엔드 사이의 작업이 원할하게 가능함!