Node.js 주특기 심화 [8일차]
오늘 한 일
오늘은 어제 prisma로 만든 기본 API 뼈대에서 게시글 API 구현 및 게시글에 해당하는 댓글 API를 구현했다.
(게시글, 댓글 CRUD)
거기에 더해 트랜잭션(Transaction)에 대해 배우고 트랜잭션을 이용하여 리팩토링,
express-session 패키지를 이용해 jwt대신 session으로 리팩토링하는 작업을 했다.
배운 부분
1. 트랜잭션(Transaction)
: 트랜잭션이란 작업의 완전성을 보장해주기 위해 사용되는 개념이다. 특정한 작업을 전부 처리하거나, 전부 실패하게 만
들어 데이터의 일관성을 보장해주는 기능이다.
트랜잭션의 특징으로 ACID가 있는데, Atomicity(원자성), Consistency(일관성), Isolation(격리성), Durability(지속성)
등이 있다.
예시를 들어 설명을 해보자면 두 개의 테이블 Users, UserInfos를 생성, 수정할 때 Users 테이블만 생성되고 Users
테이블을 참조하는 UserInfos 테이블은 생성되지 않는 경우가 있을 수 있다. 이렇게 되면 테이블의 연관관계에서
일관성이 깨지게 되고 신뢰할 수 없는 데이터로 남게된다. 이런 경우 트랜잭션을 사용하여 일관성을 유지시켜줄 수 있
다.
이러한 통일성을 지켜주기 위해 락(lock)과 격리 수준(Isolation level)등을 쓸 수 있다.
이를 통해 이미 사용하고 있는 테이블은 읽기, 쓰기 등을 못한다던지 테이블에 순서를 걸어놓는 등의 작업을 할 수 있다.
(하지만 '교착상태'와 '팬텀읽기'를 주의해야 한다)
1-1. interactive transaction
Prisma의 트랜잭션은 Sequential 트랜잭션과 Interactive 트랜잭션이 존재하는데 앞으로 Interactive 트랜잭션을 이용해
문제들을 해결해보려고한다.
interactive 트랜잭션은 다음과 같이 사용할 수 있다.
여기서 tx는 프리즈마 클라이언트를 대체하는 것으로 알면 될 것 같다.( 여기서의 prisma === tx )
import { prisma } from "@prisma/client"
2. prisma model 설정에서의 default값
보통 primary key같은 경우 autoincrement() 옵션을 주거나 createdAt, updatedAt 같은 경우에는 now()값을 많이 준다.
그런데 default값으로 uuid()라는 옵션도 줄 수 있는데 이는 Mongo DB의 Object id와 비슷한 개념이라고 볼 수 있다.
하지만 Object id보다 가지고 있는 내용이 많다.
UUID에 대해 조금 간략히 설명하자면 UUID는 범용 고유 식별자라고 하는데 총 4개의 정보를 하이픈으로 구분하여
순차적으로 저장한 데이터 타입이다. 시간 정보를 포함하고 있어 생성된 순서대로 정렬되는 특징을 가진다.
3. express-session 패키지
express-session 패키지를 이용하여 세션을 관리하다보면 서버가 한 번 꺼질 때마다 세션의 내용이 날아가는 문제가
발생한다. 이러한 이유는 세션을 인메모리 방식으로 관리하고 있기 때문에 발생하는 문제이다.
이를 해결하기 위해서는 db에 별도로 session을 저장해주는 작업이 필요한데 이는 express-mysql-session 패키지를
통해 db에 저장해줌으로써 해결할 수 있다.
3-1. express-mysql-session
session을 db와 연결해주기 위한 기본적인 설정은 다음과 같다.
sessionStore - express session에 외부 session storage를 설정하기 위한 값을 정의하는 부분.
(mysql설정값을 부여해주면 된다)
expiration: 세션의 만료기간을 설정해주는 옵션 (1초 * 60 * 60 * 24 === '하루')
createDatabaseTable: true - 자동으로 세션이 저장되는 테이블을 생성한다는 옵션.
'TIL' 카테고리의 다른 글
2023_12_07 TIL (1) | 2023.12.08 |
---|---|
2023_12_06 TIL (0) | 2023.12.07 |
2023_12_04 TIL (2) | 2023.12.05 |
2023_12_01 TIl (1) | 2023.12.01 |
2023-11-30 TIL (2) | 2023.12.01 |