(완..료)1. node 숙련주차 강의 다 듣기
(->)2. lv4 과제 만들어보기 (+ error handler, joi, prettier...)
(->)3. queryraw 사용해보기
(->)4. soft delete join으로 구현해보는 방법 찾기
사용자의 모든 인증 정보를 가지고 있음.
사용자의 인증(로그인)이 완료된 후 해당 사용자를 인증하는 용도로 발급하는 토큰
jwt 이용해 사용자의 인증 여부 확인 X but, 처음 발급한 사용자인지 확인 불가.
Accesss 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 만료될 때까지..)
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이다.
Read Uncommitted
: 커밋되지 않은 것을 읽기.
: 연산 중(아직 커밋X)데이터를 다른 트랜잭션이 읽는 것 허용.
: 연산 중 데이터에 대한 연산은 불허
Read Committed
: 커밋된 것을 읽기
: 연산을 수행할 때,
연산이 완료될 때까지 연산 대상 데이터에 대한 읽기 제한하는 수준
: 연산이 완료되어 커밋된 데이터는 다른 트랜잭션이 읽는 것 허용
Repeatable Read
: 반복적으로 읽기.
: 선행 트랜잭션이 특정 데이터를 읽을 때 ,
트랜잭션 종료 시까지 해당 데이터에 대한 갱신, 삭제 제한
Serializable
: 직렬화 가능.
: 선행 트랜잭션이 특정 데이터 영역을 순착적으로 읽을 때,
해당 데이터 영역 전체에 대한 접근 제한
동시성을 제어하기 위한 기능. 데이터를 점유하여 다른 트랜잭션의 접근을 막아 동시성과 일관성의 균형을 맞추기 위함.
# 트랜잭션을 시작합니다. START TRANSACTION; # SPARTA 테이블을 조회할 때, 해당 데이터들에 공유 락을 설정합니다. SELECT * FROM SPARTA LOCK IN SHARE MODE;
# 트랜잭션을 시작합니다. START TRANSACTION; # SPARTA 테이블을 조회할 때, 해당 데이터들에 배타 락을 설정합니다. SELECT * FROM SPARTA FOR UPDATE;
락킹을 어느정도 수준까지 걸건지에 대한 내용
# 글로벌 락을 획득합니다. # MySQL 서버에 존재하는 모든 테이블에 락을 겁니다. FLUSH TABLES WITH READ LOCK;
# SPARTA 테이블에 테이블 락을 설정합니다. LOCK TABLES SPARTA READ;
# sparta_name 문자열을 획득합니다. # 만약, 10초 동안 획득 하지 못한다면, NULL을 반환합니다. SELECT GET_LOCK('sparta_name', 10);
# 테이블 구조를 변경할 때, MySQL은 내부적으로 메타데이터 락을 설정합니다. ALTER TABLE SPARTA ADD COLUMN Age Int;
기본 명령어
-- 트랜잭션을 시작합니다. 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;