전체 글 (66) 썸네일형 리스트형 [What To Do] JWT 인가 미들웨어 제작하기 우리 팀은 애플리케이션에 로그인한 사용자만 추가 기능을 사용할 수 있도록 개발하고 싶었습니다.그러기 위해서는 인가 방식을 선택해야 했습니다.팀에서는 세션과 JWT 중 하나로 구현하자고 의견이 좁혀졌고,준비한 서버가 없는만큼 서버의 역할부담을 덜고 싶어, JWT를 최종적으로 채택하게 되었습니다.토큰 발급토큰은 구글의 OAuth 2.0을 통해 얻은 이메일을 데이터베이스에 생성하거나 이미 존재하면 생성합니다.const jwt = require('jsonwebtoken');const payload = { id: user.id};const options = { subject: 'user', expiresIn: '1h', issuer: process.env.JWT_ISSUER};const token = jw.. [서점 프로젝트] SQL Error [1701] 해결하기 주문 API가 배송 정보 입력, 주문 상품 입력 등을 하나의 트랜잭션으로 처리하지 않아,중간에 주문이 실패해도 데이터의 일관성이 유지되지 않았습니다.올바른 테스트를 위해 데이터베이스의 데이터를 수동으로 삭제하던 중 다음과 같은 에러를 만났습니다.❗ 원인메시지에서 외래키 제약 조건에서 참조된 테이블을 TRUCATE 할 수 없다고 안내하고 있습니다. ❗ 해결 방법TRUNCATE를 할 때 외래키 제약 조건을 해제하는 방법으로 문제를 해결할 수 있습니다.-- 외래키 비활성화SET FOREING_KEY_CHECKS = 0;-- 삭제 명령TRUNCATE order_item-- 외래키 활성화SET FOREIGN_KEY_CHECKS = 1;반드시 외래키 제약 조건을 다시 활성화하는 것을 잊지 말아야 합니다.비슷한 문제.. [Javascript] Promise와 async/await의 비동기 처리 저번 글에서 말했듯이 자바스크립트는 비동기 방식으로 동작합니다.비동기 코드에서 작업의 순서를 보장하기 위한 방법 중 하나는 콜백이 있습니다.하지만 순서를 지켜야 할 작업이 여러 개라면 어떨 것 같나요?호출한 콜백은 또다른 콜백을 호출하고 그 콜백은 또 다른 콜백을...이렇게 가독성을 떨어뜨리는 문법을 해결할 또 다른 방법이 있습니다.이번에는 Promise와 async/await의 비동기 처리에 대해서 알아보겠습니다.🐸 PromisePromise라는 객체에는 작업에 대한 상태를 가지고 있습니다.가지고 있는 상태의 종류는 다음과 같습니다.Pending(대기)Fulfilled(이행) Rejected(거부)const promise = new Promise((resolve, reject) => { if (/*.. [SQL] IN 연산자 알아보기 우리는 조건과 일치하는 행을 보고 싶을 때 WHERE 절을 이용합니다.예를 들어 딸기와 메론이 들어가는 아이스크림을 찾고 있다면 이렇게 쿼리를 보낼 것입니다.SELECT *FROM icecreamWHERE ingredient = '딸기' OR ingredient = '메론';그렇다면 추가로 수박이 들어가는 아이스크림을 찾고 싶다면?계속 OR 절을 붙여 늘려가야 하는 것일까요?👆 IN값을 하나만 지정할 수 있는 = 연산자와 다르게 여러 개의 데이터를 지정할 수 있습니다.위 예시에서 IN 절을 넣어 쿼리를 수정해보겠습니다.SELECT *FROM icecreamWHERE ingredient IN ('딸기', '메론');연산자가 줄어서 쿼리가 간단해지고 이해하기 쉬워졌습니다.이번 글은 짧게 마무리 되었네요.글.. [서점 프로젝트] 서브 쿼리를 이용한 평점 업데이트 사용자는 책을 구매하고 그에 대한 별점을 남길 수 있습니다.별점이 남겨질 때마다 책의 평점은 변화합니다.오늘은 별점의 평균을 구해줄 서브 쿼리에 대해서 이야기해보겠습니다.🐸 서브 쿼리간단하게 설명하자면 쿼리 안에 있는 쿼리를 의미합니다.서브 쿼리는 괄호 안에 넣어서 작성하며메인 쿼리의 컬럼을 사용할 수 있습니다. 🐸 서브 쿼리의 위치서브 쿼리는 다양한 위치에서 사용할 수 있습니다.하지만 FROM 절에서 사용할 때는 AS 예약어를 사용해서 별칭을 주어야 합니다.SELECTFROMWHEREHAVINGORDER BYVALUESUPDATE 🐸 적용 예시책의 평점을 수정하는 쿼리는 간단합니다.UPDATE book SET rating = 평점 WHERE id = 1;이 평점을 우리는 서브 쿼리로 만들 수 있습.. [서점 프로젝트] Offset 페이지네이션 서비스가 커질수록 도서 데이터는 엄청 증가할 것입니다.도서 전체를 요청하면 대량의 데이터를 보내느라 서비스가 느려지는 것도 불가피해집니다.데이터의 용량을 나누기 위해서 페이지네이션을 구현하고자 하였습니다.페이지네이션에는 Offset과 Cursor 두 방법이 있습니다.이번에는 원하는 페이지를 바로 볼 수 있고 정렬에 유리한 Offset을 선택했습니다.📃 LIMIT, OFFSET기본적으로 테이블에서 제한된 양의 데이터를 출력하고 싶다면 LIMIT을 사용합니다.SELECT * FROM 테이블명 LIMIT 5; -- 가장 첫 데이터부터 5개를 출력 데이터가 시작하는 위치를 정하고 싶다면 OFFSET을 사용합니다.SELECT * FROM 테이블명 LIMIT 5 OFFSET 0; -- 0(처음)부터 데이터 5개 .. [서점 프로젝트] 줄거리 설명 컬럼의 자료형 고민 도서 정보를 관리하는 테이블을 만들다가 고민이 생겼습니다.책의 줄거리를 설명하는 컬럼은 그 수가 1000자가 넘어가기도 합니다.찾아보니까 표현할 수 있는 방법이 VARCHAR뿐만 아니라 TEXT도 있었습니다."왜 VARCHAR로도 표현이 가능한데 TEXT가 있을까?"최대 열 사이즈공식 문서에서는 MySQL 테이블은 65535 바이트까지 행 크기를 제한한다고 나와있습니다.큰 크기의 varchar 자료형을 남발하다보면 이 제한에 금방 도달하게 됩니다.그렇다면 text 타입으로 선언하면 어떨까요?text 타입을 여러 번 선언해도 에러가 발생하지 않습니다.이 객체는 Large Object라는 별도의 영역에 저장되고 행에는 주소값만 포함되기 때문입니다. 메모리 버퍼MySQL 엔진은 메모리 포인터를 이용해서 데이터.. [서점 프로젝트] ERD 설계 개인적으로 가장 어려웠던 시간인 것 같습니다.프로젝트를 위한 데이터베이스를 생성하기 전에 개체들의 관계를 명확하게 하고 싶었습니다.📋 회원이메일, 아이디, 비밀번호를 속성으로 가지고 있습니다.개발을 하면서 확장이 된다면 회원 별로 주소지를 넣는 것도 고민해보려고 합니다. 📋 카테고리카테고리 이름을 속성으로 가지고 있습니다. 📋 도서도서에 대한 정보(제목, 저자, 요약, 설명 등)을 속성으로 가지고 있습니다.카테고리 입장에서 도서는 하나도 없을 수도, 여러 권일 수도 있습니다.도서는 카테고리를 하나만 포함하도록 설계할 것이기 때문에 둘의 관계는 1:N으로 설계했습니다. 📋 후기같은 도서에 대하여 후기는 한 번만 작성할 수 있습니다.따라서, 회원과 도서의 FK 값을 PK 값으로 하여 각각 1:N 식별.. 이전 1 2 3 4 5 6 7 ··· 9 다음