사건의 발단 전체 도서 조회할 때 쿼리로 뭘 기준으로 정렬할 건지 입력받아서 정렬하려고 했다. 입력 가능한 기준은 최근 출판일 순, 좋아요 순, 판매량 순이다. 사건 워크벤치에서 아래 코드 실행하면 잘만 굴러간다. SELECT *, (SELECT COUNT(*) FROM likes WHERE liked_book_id = books.id) AS likes, (SELECT COUNT(*) FROM orderedBook WHERE orderedBook.book_id = books.id) AS orders FROM books ORDER BY pub_date DESC LIMIT 4 OFFSET 0; 근데 포스트맨으로 요청 날리고 응답으로 날아오는 결과 보면 정렬이 정말 전혀 안되어있다. 그냥 책 id 순서대로 보..
예외 처리 try...catch 예상하지 못한 수많은 에러를 처리하는 문법이다. try 구문의 코드를 실행하다가 에러가 발생하면 try 코드를 멈추고 catch로 빠져나간다. try 구문에서 발생하는 모든 에러는 catch에 잡힌다. try { // 코드 실행 } catch (error) { // 에러 처리 } finally { // 항상 실행되어야 하는 코드 } catch의 error 파라미터가 내장 에러 객체인 경우 name과 message 속성을 가지고 있다. name은 에러의 이름이고, message는 에러의 내용을 보여준다. try { // 코드 실행 } catch (error) { console.log(error.name); console.log(error.message); } throw 에러..
DELETE, TRUNCATE 차이 DELETE FROM 테이블명 WHERE 조건; 데이터는 지워지지만 테이블 용량은 줄어들지 않는다. 조건을 통해 원하는 데이터만 삭제할 수 있으며, 롤백이 가능하다. TRUNCATE 테이블명; 모든 행이 삭제되며 테이블이 생성되었던 최초의 상태로 되돌린다. 롤백이 불가능하다. 주문 API 구현 주문하기 items가 객체 배열에서 배열로 수정되었다. 따라서 items에 있는 id들에 대해 SELECT를 하는 코드가 추가되었고, 장바구니에서 주문된 도서를 삭제하는 코드도 추가되었다. Method POST URI /orders HTTP Status Code 성공(201) Request Body // 로그인 할 때 받은 token > header “Authorization” ..
Promise 지금까지는 콜백 함수를 통해 비동기 상황을 해결했다. 하지만 콜백 함수들이 여러 번 중첩되면 코드가 복잡해지고 가독성이 떨어지는 콜백 지옥 현상이 발생하기 때문에 Promise를 사용한다. new Promise로 프로미스 객체를 생성하고, resolve와 reject를 파라미터로 갖는 콜백 함수를 넣는다. 이 프로미스 변수에는 then과 catch 메서드가 있다. resolve가 호출되면 then이 실행되고, reject가 호출되면 catch가 실행된다. resolve와 reject에 넣어준 인수가 각각 then과 catch로 전해진다. finally 메서드는 끝나면 무조건 실행된다. const condition = true; const promise = new Promise((resolv..
Promise 지금까지는 콜백 함수를 통해 비동기 상황을 해결했다. 하지만 콜백 함수들이 여러 번 중첩되면 코드가 복잡해지고 가독성이 떨어지는 콜백 지옥 현상이 발생한다. 이 현상을 해결하기 위해 Promise를 사용한다. new Promise로 프로미스 객체를 생성하고, resolve와 reject를 파라미터로 갖는 콜백 함수를 넣는다. 이 프로미스 변수에는 then과 catch 메서드가 있다. resolve가 호출되면 then이 실행되고, reject가 호출되면 catch가 실행된다. resolve와 reject에 넣어준 인수가 각각 then과 catch로 전해진다. then이나 catch에서 다시 다른 then이나 catch를 붙일 수 있다. 이것을 promise chaining이라고 하며, 이전 ..
주문 DB ERD delivery 테이블 생성 orders 테이블 생성 orderedBook 테이블 생성 주문하기 API 구현 orders 테이블의 delivery_id 컬럼이 delivery 테이블을 참고하고 있고, orderedBook 테이블의 order_id 컬럼이 orders 테이블을 참조하고 있으므로 데이터 삽입 순서는 아래와 같다. delivery 테이블 orders 테이블 orderedBook 테이블 설계 수정 Method POST URI /orders HTTP Status Code 성공(201) Request Body { items: [ { cartId: 장바구니 도서 id, bookId: 도서 id, quantity: 수량 }, … ], delivery: { address: “주소”, r..
난이도: Lv. 2 정답률: 49% 문제: https://school.programmers.co.kr/learn/courses/30/lessons/72411 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 알고리즘 해당 단품 메뉴들의 개수가 될 수 있는 모든 경우의 수가 몇 개 나올 수 있는지 위와 같은 형태로 객체에 담는다. 첫 번째 키는 단품 메뉴들의 개수, 두 번째 키는 가능한 메뉴 조합이다. 파라미터로 주어진 각 사람의 주문 내역을 오름차순으로 정렬해서 DFS에 돌리며 객체를 채운다.. 'AB'와 'BA'는 같기 코스이기 때문에 정렬을 한다.. 1로..
DB 외래키 제약 조건 books 테이블의 category_id는 category 테이블의 기본키인 id를 참조한다. DB에 외래키 제약 조건을 추가해 보자. 제약 조건의 이름은 category_id로 설정했다. SQL 카테고리 조인 도서 목록을 응답으로 보내줄 때 카테고리 아이디가 아니라 카테고리 이름이 들어가야 한다. 따라서 books 테이블과 category 테이블을 카테고리 아이디를 기준으로 조인해줘야 한다. SELECT * FROM books LEFT JOIN category ON books.category_id = category.id; 신간 목록 조회 DATE_SUB(기준 날짜, INTERVAL) 함수를 이용하여 특정 시간에서 지정된 값만큼 뺄 수 있다. 참고로 더하는 함수는 DATE_ADD..