REST API란
REST 아키텍쳐를 따라 구현된 API
REST는 “Representational State Transfer”의 줄임 말
Validation
어떤것을 검증하기 위한 코드
Schema.virtual
JSON 타입으로 Schema를 변환할 때 가상값(virtual)을 반환하도록 설정하는 것
쿠키와 세션
쿠키
브라우저가 서버로부터 응답으로 Set-Cookie 헤더를 받은 경우 해당 데이터를 저장한 뒤 모든 요청에 포함하여 보냄
데이터를 여러 사이트에 공유할 수 있기 때문에 보안에 취약할 수 있음
쿠키는 userId=user-1321;userName=sparta 와 같이 문자열 형식으로 존재하며 쿠키 간에는 세미콜론(;) 으로 구분됨
cookie-parser 미들웨어
요청에 추가된 쿠키를 req.cookies 객체로 만들어 줌
편리하게 쿠키를 관리
JWT
JSON 형태의 데이터를 안전하게 교환하여 사용할 수 있게 해줌
header.payload.signature 의 형식으로 3가지의 데이터를 포함
Stateless(무상태)와 Stateful(상태 보존)
Node.js 서버가 언제든 죽었다 살아나도 똑같은 동작을 하면 Stateless
서버가 죽었다 살아났을때 조금이라도 동작이 다른 경우 Stateful
미들웨어 (Middleware)
웹 서버의 요청/응답에 대해 공통적으로 관리
승인된 사용자만 API를 접근 허용
next: 다음 스택으로 정의된 미들웨어를 호출
Authorization: Bearer JWT토큰내용
HTTP 인증 유형중, Bearer 타입을 사용하여 토큰을 전달
(Authorization ?? "").split(" ");
??: 널 병합 연산자
attributes
migration 작성 시 테이블간의 관계
1:N 관계
references: {
model: 'Users', // Users 모델을 참조합니다.
key: 'userId', // Users 모델의 userId를 참조합니다.
},
1:1 관계
references: {
model: 'Users', // Users 모델을 참조합니다.
key: 'userId', // Users 모델의 userId를 참조합니다.
},
Sequelize model 작성시 관계설정
1:1 관계
// 1. Users 모델에서
this.hasOne(models.UserInfos, { // 2. UserInfos 모델에게 1:1 관계 설정을 합니다.
sourceKey: 'userId', // 3. Users 모델의 userId 컬럼을
foreignKey: 'UserId', // 4. UserInfos 모델의 UserId 컬럼과 연결합니다.
});
// 1. UserInfos 모델에서
this.belongsTo(models.Users, { // 2. Users 모델에게 1:1 관계 설정을 합니다.
targetKey: 'userId', // 3. Users 모델의 userId 컬럼을
foreignKey: 'UserId', // 4. UserInfos 모델의 UserId 컬럼과 연결합니다.
});
1:N 관계
// 1. Users 모델에서
this.hasMany(models.Posts, { // 2. Posts 모델에게 1:N 관계 설정을 합니다.
sourceKey: 'userId', // 3. Users 모델의 userId 컬럼을
foreignKey: 'UserId', // 4. Posts 모델의 UserId 컬럼과 연결합니다.
});
// 1. Posts 모델에서
this.belongsTo(models.Users, { // 2. Users 모델에게 N:1 관계 설정을 합니다.
targetKey: 'userId', // 3. Users 모델의 userId 컬럼을
foreignKey: 'UserId', // 4. Posts 모델의 UserId 컬럼과 연결합니다.
});
Sequelize의 include
include 문법을 사용하기 위해서는 model에서 hasMany, hasOne, BelongsTo와 같이 관계 설정이 되어야 현재 모델에서 참조하는 외래 키를 인식하고, SQL을 생성
// 라이브러리 설치
npm install express sequelize mysql2 cookie-parser jsonwebtoken
// sequelize-cli, nodemon 라이브러리를 DevDependency로 설치
npm install -D sequelize-cli nodemon
// 설치한 sequelize를 초기화 하여 sequelize 사용 초기 구조 생성
npx sequelize init
nodemon 실행
"scripts":{
"start":"nodemon app.js"
-$ npm start
// db:migrate 명령어
npx sequelize db:migrate:status
npx sequelize db:migrate:undo
npx sequelize db:migrate
// updatedAt
// schemas
updatedAt: {
type: Date,
default: Date.now,
},
// routes
post.updatedAt = Date.now();
// sql 데이터베이스에서 삭제
post.destroy()