백엔드 (12) 썸네일형 리스트형 [NestJS] NestJS 초보자의 입문기 이번 국비교육의 최종 프로젝트를 NestJS로 진행하게 되었습니다.NodeJS 환경에서 동작하는 프레임워크 중 Express만 사용해보았기에, 프로젝트 시작에 앞서 NestJS를 익혀보려고 합니다.1. NestJS란?NestJS는 NodeJS 환경에서 적용가능한 웹 프레임워크로 다음과 같은 특징을 가지고 있습니다.타입스크립트 지원: 코드의 안정성을 높여주고 유지보수성을 올려줍니다.모듈 아키텍처: 모듈 기반의 구조를 통하여 코드의 재사용성을 높여줍니다.유연성: Express나 Fastify를 내부적으로 사용할 수 있습니다.강력한 CLI: 프로젝트 생성과 설정 자동화를 지원합니다. 2. NestJS 설치공식 문서에 나와있는 단계를 따라하면 쉽게 애플리케이션을 생성할 수 있습니다.2-1. NestJS CLI .. [CORS] 내 요청은 왜 차단될까? 이번 달에 진행한 프로젝트를 Glitch를 이용해서 배포했습니다.한 번에 프론트와 API 연동이 되면 좋았겠지만 혼란스럽게도 CORS 에러가 발생했습니다.오늘은 CORS가 무엇이고 왜 중요한지, 그리고 이것을 어떻게 해결했는지 알아보겠습니다.1. Origin이란 무엇인가?CORS를 이해하려면 먼저 Origin의 개념부터 알아야 합니다.웹에서 Origin은 세 가지 요소로 구성됩니다.프로토콜(http, https)호스트(도메인 이름)포트 번호같은 Origin인지 판단하려면 이 세 가지가 모두 같아야 합니다.예를 들어:https://example.com:3000http://example.com:3000위 두 URL은 프로토콜이 다르기 때문에 서로 다른 Origin으로 간주됩니다. 2. CORS는 왜 사용하는.. [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.. [서점 프로젝트] 서브 쿼리를 이용한 평점 업데이트 사용자는 책을 구매하고 그에 대한 별점을 남길 수 있습니다.별점이 남겨질 때마다 책의 평점은 변화합니다.오늘은 별점의 평균을 구해줄 서브 쿼리에 대해서 이야기해보겠습니다.🐸 서브 쿼리간단하게 설명하자면 쿼리 안에 있는 쿼리를 의미합니다.서브 쿼리는 괄호 안에 넣어서 작성하며메인 쿼리의 컬럼을 사용할 수 있습니다. 🐸 서브 쿼리의 위치서브 쿼리는 다양한 위치에서 사용할 수 있습니다.하지만 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 식별.. [서점 프로젝트] API 설계 이번에는 구성한 화면을 바탕으로 필요한 API를 설계하기 위해 포스팅을 하였습니다.리소스를 명확하게 분리하고 HTTP 메소드를 규칙에 맞게 사용하는 것에 중점을 두고 설계하고자 했습니다.📗 회원회원 가입과 탈퇴는 사용자 자원을 생성하고 삭제하는 작업이므로,각 메소드 규칙에 맞춰서 다음과 같이 생성했습니다.# 회원 가입POST /users# 회원 탈퇴DELETE /users 📗 인증처음에는 로그인과 로그아웃도 회원 가입과 같은 URL을 사용하려고 했습니다.하지만, 사용자 자원을 직접적으로 생성하고 삭제하지 않기 때문에별도의 인증이라는 자원을 만들어 사용하는 것이 적합하다고 생각했습니다.# 사용자 인증을 처리하는 요청POST /auth/login# 사용자 세션을 종료하는 요청DELETE /auth/log.. 이전 1 2 다음