[새싹 x 코딩온] 웹 풀스택 영등포 5기 7주차 회고 - 2

용가리🐉·2023년 12월 4일
0
post-thumbnail

📌 JOIN

데이터베이스의 조인은 두 개 이상의 테이블에서 데이터를 결합하여 새로운 결과를 생성

  • 테이블 간의 관계를 통해 의미있는 정보를 얻어내야 할 때 조인을 사용하여 관련된 데이터를 결합하고 원하는 정보를 추출

📣 종류

이전에 SQL 블로깅에서 간단히 다뤘던 JOIN

  • INNER JOIN : 공통된 값만을 가진 행 반환
  • LEFT JOIN : 왼쪽 테이블 모든 행 포함하여, 오른쪽 테이블과 일치하는 경우 함께 반환
    • LEFT OUTER JOIN과 동일
  • RIGHT JOIN : 오른쪽 테이블 모든 행 포함하여, 왼쪽 테이블과 일치하는 경우 함께 반환
    • RIGHT OUTER JOIN과 동일
  • FULL JOIN : 양쪽 테이블 모든 행을 포함하여, 일치하는 경우 함께 반환
    • FULL OUTER JOIN과 동일
  • CROSS JOIN : 두 테이블 모든 가능한 조합 반환
SELECT 조회할 필드 FROM 테이블명 INNER JOIN 조인할 테이블명 ON 일치해야할 필드

// 예시
SELECT orders.order_id, customers.customer_name FROM orders INNER JOIN customers ON orders.customer_id = customers.customer_id;

📌 Relationship

  • 테이블들은 서로 관계를 맺을 수 있음 → 복잡한 데이터 구조를 단순화하고 관리
    • 1:1, 1:다, 다:다

📣 1:1 관계

하나의 레코드(행)가 다른 하나의 레코드(행)와 관련되어 있는 관계

  • 각 레코드는 서로 한 가지 정보만을 공유함
  • ex) 사용자와 프로필, 주문과 송장
// 테이블 정의
CREATE TABLE user (
	id INT PRIMARY KEY AUTO_INCREMENT,
  	username VARCHAR(50) NOT NULL,
  	email VARCHAR(100) NOT NULL,
    password VARCHAR(100) NOT NULL
);

CREATE TABLE profile (
	id INT PRIMARY KEY,
  	user_id INT,
  	introduce VARCHAR(100),
    FOREIGN KEY (user_id) REFERENCES user(id)
);

// 관계 정의
User.hasOne(Profile, { foreignKey: 'user_id', onDelete: 'CASCADE' });
Profile.hasOne(User, { foreignKey: 'user_id', onDelete: 'CASCADE' });
  • hasOne : 한 모델이 다른 모델을 가리키는 1:1 관계를 설정하는데 사용
  • belongsTo : 다른 모델이 한 모델을 가리키는 1:1(1:다) 관계를 설정하는데 사용

📣 1:다 관계

한 쪽 레코드가 다른 쪽 레코드 여러 개와 관련되어 있는 관계

  • 보통 부모 엔티티와 자식 엔티티 사이의 관계를 나타내는데 사용
  • ex) 고객과 주문, 학교와 학생
// 테이블 정의
CREATE TABLE customers (
	customer_id INT PRIMARY KEY AUTO_INCREMENT,
  	customer_name VARCHAR(255),
  	customer_email VARCHAR(255)
);

CREATE TABLE orders (
	order_id INT PRIMARY KEY,
  	order_date DATE,
  	customer_id INT,
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);

// 관계 정의
Customer.hasMany(Order, { foreignKey: 'customer_id' });
Order.belongsTo(Customer, { foreignKey: 'customer_id' });
  • hasMany : 한 개의 모델(테이블)이 다른 모델과 1:n 관계를 가질 때 사용
  • belongsTo : 다른 모델이 한 모델을 가리키는 1:1(1:다) 관계를 설정하는데 사용

📣 다:다 관계

한 쪽 레코드가 다른 쪽 레코드 여러 개와 관련되고, 그 반대 쪽 레코드도 다른 쪽 레코드 여러 개와 관련되어 있는 관계를 의미

  • 중간 테이블을 사용하여 구현
  • ex) 학생과 과목, 주문과 제품, 배우와 영화
// 테이블 정의
CREATE TABLE Students (
	StudentId INT PRIMARY KEY,
  	StudentName VARCHAR(50)
);

CREATE TABLE Teachers (
	TeacherID INT PRIMARY KEY,
  	TecaherName VARCHAR(50)
);

CREATE TABLE StudentTeacherRelation (
	RelationID INT PRIMARY KEY,
  	StudentID INT,
  	TeacherID INT,
  	FOREIGN KEY (StudentID) REFERENCES Students(StudentID),
  	FOREIGN KEY (TeacherID) REFERENCES Students(TeacherID)
);

// 관계 정의
Student.belongsToMany(Teacher, { through: StudentTeacherRelation });
Teacher.belongsToMany(Student, { through: StudentTeacherRelation });
  • belongsToMany: 다:다 관계를 설정할 때 사용되는 메서드

웹 브라우저(클라이언트)에 저장되는 키와 값이 들어있는 작은 데이터 파일

  • 이름, 값, 만료일, 경로 정보로 구성되어 있음

📣 동작 방식

  1. 클라이언트가 페이지 요청
  2. 서버에서 쿠키 생성
  3. HTTP 헤더에 쿠키를 포함시켜 응답
  4. 브라우저가 종료되어도 쿠키 만료 기간이 있다면 클라이언트에서 보관하고 있음
  5. 같은 요청을 할 경우 HTTP 헤더에 쿠키를 함께 보냄
  6. 서버에서 쿠키를 읽어 이전 상태 정보를 변경할 필요가 있을 때 쿠키를 업데이트하여 변경된 쿠키를 HTTP 헤더에 포함시켜 응답

📣 사용 예시

  • 로그인 시, 자동 로그인

  • 오늘은 이 창을 다시 열지 않음

📣 사용

npm install cookie-parser
const cookieParser = require("cookie-parser");
app.use(cookieParser());
...
res.cookie('쿠키 이름', '쿠키 값', '옵션 객체');

// 확인
console.log(req.session);

📌 Session

웹 서버에 저장되는 쿠키

  • 사용자가 웹 브라우저를 통해 접속한 시점부터 연결을 끝내는 시점까지의 시간 동안 일련의 요구를 하나의 상태로 보고 그 상태를 유지시킴
  • ex) 로그인 유지

📣 동작 방식

  1. 클라이언트가 서버에 접속 시 세션 ID를 발급받음
  2. 클라이언트는 세션 ID에 대해 쿠키를 사용해서 저장하고 가지고 있음
  3. 클라이언트는 서버에 요청 시, 해당 쿠키의 세션 ID를 서버에 전달하여 사용
  4. 서버는 세션 ID를 전달받아서 별다른 작업 없이 세션 ID로 세션에 있는 클라이언트 정보를 가져옴
  5. 클라이언트 정보를 가지고 서버 요청을 처리하여 클라이언트에게 응답함

Cookie VS. Session

  • 전체적인 역할과 동작 원리는 비슷 (세션 = 서버 쿠키)
  • 쿠키 - 로컬 & 세션 - 서버
  • 보안 : 쿠키 < 세션
  • 속도 : 쿠키 > 세션

📣 사용

npm install express-session
const session = require('express-session');
app.use(session('옵션 객체'));
...
// req.session.key = value
req.session.id = req.body.id;

// 확인
console.log(req.session);
profile
자아를 찾아 떠나는 중,,,

0개의 댓글

관련 채용 정보