[23.11.07] TIL

yy·2023년 11월 6일

개발일지

목록 보기
26/122

오늘 할 일

(완..료)1. node 숙련주차 강의 다 듣기
(->)2. lv4 과제 만들어보기 (+ error handler, joi, prettier...)
(->)3. queryraw 사용해보기
(->)4. soft delete join으로 구현해보는 방법 찾기


- Access Token

사용자의 모든 인증 정보를 가지고 있음.
사용자의 인증(로그인)이 완료된 후 해당 사용자를 인증하는 용도로 발급하는 토큰
jwt 이용해 사용자의 인증 여부 확인 X but, 처음 발급한 사용자인지 확인 불가.

Accesss Token은 그 자체로도 사용자 인증에 필요한 정보를 가지고 있어 탈취 시 큰일남.

- Refresh Token

사용자가 서버에 첫 로그인 완료 시 Access Token과 동시발급.
Access Token보다 긴 유효기간을 가지며, Access Token 만료 시 Access Token를 새로 발급해주는 열쇠.

예시)
<Access Token 10분 유효기간, Refresh Token 1시간 유효기간을 가짐.>
1. (로그인시) 사용자 -> 서버 : ID / PW 보냄.
2. (로그인시) 서버 -> 사용자: Access Token과 Refresh Token을 응답.
3. (사용자 서버 이용 중) 사용자 -> 서버 : Access Token과 함께 요청을 보냄.
4. 서버 -> 사용자 : 잠깐..Access Token 좀 확인하고..5. (확인완료) ㅇㅋ서버 이용하쇼! 응답보냄
5. (10분 < 사용자 서버시간 < 1시간 ) 사용자 -> 서버 : 만료된 Access Token과 함께 요청을 보냄.
6. 서버 -> 사용자 : 잠깐..Access Token 좀 확인하고..당신은 인증된 사용자가 아님. 로그인 다시하쇼! 응답보냄
7. 사용자 -> 서버 : 아놔. 여기 Refresh Token 있어 Access Token 갱신해줘
8. 서버 -> 사용자 : 잠깐...확인 좀 하고...아 아직 Refresh Token이 유효하네! ㅇㅋ Access Token 갱신했수! 응답보냄.
9. 사용자 서버 이용 (~ Refresh Token 만료될 때까지..)

  • 사용자의 인증 정보를 검정하는데 사용. 서버에서 관리
  • 서버 : refresh token을 디코딩 -> 사용자의 정보 확인.
  • 필요 시 강제로 토큰 만료 가능. 사용자의 인증 상태를 서버에서 제어 가능 (like OTP)




💬트랜잭션 Transaction

- 의미

  • 여러 개의 작업을 묶어 하나의 작업 단위로 그룹화하여 처리하는 작업.
  • what for? 작업의 완전성을 보장하기 위함.
    전부 처리하거나 전부 실패하거나 => 일관성 보장

- 특징 (ACID)

1. Atomicity (원자성)
: 모 아니면 도. All or Nothing. 명령들이 전부 성공하거나 전부 실패하거나.
ex) A->B 계좌이체 : 1. A계좌 금액 차감. 1. B계좌의 금액 증가.

2. Consistency (일관성)
: 트랜잭션 내의 데이터는 일관되어야함. 에러가 발생해도 데이터의 상태가 일관성을 유지해야한다는 특징.
: 작업 성공할 경우 아무런 문제 발생 X, 실패해도 작업을 진행하던 도중 실패한 상태로 데이터를 방치하지 않음.

3. Isolation (격리성, 고립성)
: 동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않아야한다는 성질
: 완전 수행되거나 완전 수행 전 상태는 외부에서 참조 가능. but 중간과정, 중간 결과 참조 불가!
: 사용중인 DB오브젝트에 락을 걸어 격리성 구현.
락(Locking): 하나의 클라이언트만 해당 자원을 점유하도록 하는 기능 => 동시성과 일관성 유지

4. Durability (지속성, 동시성, 영속성)
: 성공적으로 커밋된 후, 해당 트랜잭션에 의해 생성 또는 수정된 데이터가 어떠한 상황에서도 보존되는 특징
: 이후 시스템에 문제생겨도 데이터는 손상X => 트랜잭션의 안전성 보장
: 혹은 트랜잭션 수행 도중 시스템이 비정상적으로 종료되더라도 트랜잭션 로그를 통해 아직 커밋되지 않은 트랜잭션 복구 가능

- Isolation level (고립성, 격리성 수준)

일관성과 동시성은 반비례의 관계로 둘의 적절한 균형을 조정하는게 중요하다. 조정방법 중 하나가 Isolation level이다.

  1. Read Uncommitted
    : 커밋되지 않은 것을 읽기.
    : 연산 중(아직 커밋X)데이터를 다른 트랜잭션이 읽는 것 허용.
    : 연산 중 데이터에 대한 연산은 불허

  2. Read Committed
    : 커밋된 것을 읽기
    : 연산을 수행할 때,
    연산이 완료될 때까지 연산 대상 데이터에 대한 읽기 제한하는 수준
    : 연산이 완료되어 커밋된 데이터는 다른 트랜잭션이 읽는 것 허용

  3. Repeatable Read
    : 반복적으로 읽기.
    : 선행 트랜잭션이 특정 데이터를 읽을 때 ,
    트랜잭션 종료 시까지 해당 데이터에 대한 갱신, 삭제 제한

  4. Serializable
    : 직렬화 가능.
    : 선행 트랜잭션이 특정 데이터 영역을 순착적으로 읽을 때,
    해당 데이터 영역 전체에 대한 접근 제한

락(lock, locking)

동시성을 제어하기 위한 기능. 데이터를 점유하여 다른 트랜잭션의 접근을 막아 동시성과 일관성의 균형을 맞추기 위함.

락의 종류

  1. 공유락 shared Locks, 읽기 락 READ locks
    : 다른 트랜잭션이 데이터 읽기 허용O, 수정 허용X
# 트랜잭션을 시작합니다.
START TRANSACTION;

# SPARTA 테이블을 조회할 때, 해당 데이터들에 공유 락을 설정합니다.
SELECT * FROM SPARTA LOCK IN SHARE MODE;
  1. 배타 락 Exclusive Locks, 쓰기 락 WRITE locks
    : 다른 트랜잭션이 데이터 읽기, 수정 허용X
# 트랜잭션을 시작합니다.
START TRANSACTION;

# SPARTA 테이블을 조회할 때, 해당 데이터들에 배타 락을 설정합니다.
SELECT * FROM SPARTA FOR UPDATE;

락킹의 수준(level)

락킹을 어느정도 수준까지 걸건지에 대한 내용

  1. 글로벌 락(Global Locks) | 데이터베이스 락(Database Locks)
    : DB 모든 테이블에 락걸기 (가장 높은 수준의 락)
# 글로벌 락을 획득합니다.
# MySQL 서버에 존재하는 모든 테이블에 락을 겁니다.
FLUSH TABLES WITH READ LOCK;
  1. 테이블 락(Table Locks)
    : 다른 사용자가 작업중인 테이블 동시 수정 불가
# SPARTA 테이블에 테이블 락을 설정합니다.
LOCK TABLES SPARTA READ;
  1. 네임드 락(Named Locks)
    : 테이블이나 테이블의 행과 같은 DB오브젝트가 아닌 특정한 문자열을 점유
# sparta_name 문자열을 획득합니다.
# 만약, 10초 동안 획득 하지 못한다면, NULL을 반환합니다.
SELECT GET_LOCK('sparta_name', 10);
  1. 메타데이터 락(Metadata Locks)
    : 다른 사용자가 작업중인 테이블의 동일한 행 및 동일한 데이터베이스의 객체 동시 수정 불가
# 테이블 구조를 변경할 때, MySQL은 내부적으로 메타데이터 락을 설정합니다.
ALTER TABLE SPARTA ADD COLUMN Age Int;

- MySQL의 트랜잭션

기본 명령어

-- 트랜잭션을 시작합니다.
START TRANSACTION;

-- 성공시 작업 내역을 DB에 반영합니다.
COMMIT;

-- 실패시 START TRANSACTION이 실행되기 전 상태로 작업 내역을 취소합니다.
ROLLBACK;

예시

-- SPARTA 테이블을 생성합니다.
CREATE TABLE IF NOT EXISTS SPARTA
(
    spartaId      INT(11)      NOT NULL PRIMARY KEY AUTO_INCREMENT,
    spartaName    VARCHAR(255) NOT NULL,
    spartaAddress VARCHAR(255) NOT NULL
);

-- 1번째 트랜잭션을 실행합니다.
START TRANSACTION;

-- SPARTA 테이블에 더미 데이터 3개를 삽입합니다.
INSERT INTO SPARTA (spartaName, spartaAddress)
VALUES ('SPARTA1', 'SEOUL'),
       ('SPARTA2', 'BUSAN'),
       ('SPARTA3', 'DAEGU');

-- 1번째 트랜잭션을 DB에 적용합니다.
COMMIT;

-- 2번째 트랜잭션을 실행합니다.
START TRANSACTION;

-- SPARTA 테이블에 더미 데이터 3개를 삽입합니다.
INSERT INTO SPARTA (spartaName, spartaAddress)
VALUES ('SPARTA4', 'SEOUL'),
       ('SPARTA5', 'BUSAN'),
       ('SPARTA6', 'DAEGU');

-- 2번째 트랜잭션을 롤백합니다.
ROLLBACK;

-- 테이블의 상태를 확인합니다.
SELECT * FROM SPARTA;

[참고자료]
https://jordy-torvalds.tistory.com/entry/%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98%EA%B3%BC-%EA%B2%A9%EB%A6%AC-%EB%A0%88%EB%B2%A8-%EA%B7%B8%EB%A6%AC%EA%B3%A0-Lock%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC

profile
시간이 걸릴 뿐 내가 못할 건 없다.

0개의 댓글