Tips

javascript 내장함수는 C++로 구현

nodejs v8 엔진을 사용

v8엔진은 C++로 구현된 자바스크립트 엔진(구글이 개발)

* 그냥 javascript로 구현하는 것보다 내장함수는 훨씬 빠르다.


import {exec} from "child_process";
exec("chcp 65001");

* 한글 깨지는거 계속해서 터미널에 치기 힘들면 파일에 위와같이 넣을 수 있다.



Access Token, Refresh Token

Access Token

Access Token은 사용자 인증(ex: 로그인)이 완료된 후 해당 사용자를 인증하는 용도로 발급하는 토큰

  • Access Token은 Stateless(무상태) 즉, Node.js 서버가 재시작되더라도 동일하게 작동

  • 문제점: 사용자 인증에 필요한 모든 정보를 가지고 있다. 토큰을 가지고 있는 시간이 늘어날 수록, 탈취 피해 규모가 더욱 커진다.


Refresh Token

Refresh Token은 사용자의 모든 인증 정보를 가진 Access Token과 달리 특정 사용자가 Access Token을 발급받기 위한 목적으로만 사용

  • Refresh Token은 사용자의 인증 정보를 검증하는데 사용, 이를 서버에서 관리

  • Access Token의 주기를 짧게하고 Refresh Token을 통해 사용자의 이전 발급 상태와 현재 상태를 비교해 Access Token을 재발급 해줌

    • 기기 종류, IP 등등으로 검증
  • OTP처럼 Access Token 주기를 짧게하는게 좋다!



로그 미들웨어

로그 미들웨어(Log Middleware)는 클라이언트의 모든 요청 사항을 기록하여 서버의 상태를 모니터링하기 위한 미들웨어

  • 큰 규모의 프로젝트의 경우 모든 로그를 일일이 확인하는 것은 불가능에 가까움. 이런 경우 morgan, winston과 같은 라이브러리를 사용하거나 AWS CloudWatch, Grafana, Datadog와 같은 외부 모니터링 솔루션 서비스를 이용해 로그를 수집,관리할 수 있습니다.



트랜잭션(Transaction)

트랜잭션(Transaction)은 작업의 완전성을 보장해주기 위해 사용되는 개념

특정한 작업을 전부 처리하거나, 전부 실패하게 만들어 데이터의 일관성을 보장해주는 기능

  • 여러개의 작업(쿼리)을 하나의 작업 단위로 그룹화하여 처리하는 것

  • 부분 업데이트와 같은 상황을 방지하기 위한 것


트랜젝션의 특징(ACID)

트랜잭션의 특징(ACID)은 데이터베이스 트랜잭션이 안전하게 수행된다는 것을 보장하기 위한 특징의 나열

  • 원자성(Atomicity)

  • 일관성(Consistency)

  • 격리성(Isolation)

  • 지속성(Durability)


원자성(Atomicity)

원자성(Atomicity)은 트랙잭션 내에서 실행되는 명령들을 하나의 묶음으로 처리 (전부 성공 or 전부 실패)

  • 여기서, 원자성은 나눠질 수 없는 단일 작업을 의미

  • 여러개의 작업들을 묶어 하나의 작업단위로 보게함

  • 동시에 실행해야 하는 여러개의 쿼리를 묶어서 관리할 수 있게 함


일관성(Consistency)

일관성(Consistency)은 트랜잭션 내부에서 처리되는 데이터의 일관성을 유지해야하는 특징

  • 작업이 성공할 경우엔 아무런 문제가 발생하지 않고, 실패하더라도 실패한 상태로 데이터를 방치하지 않는 특징

  • 실패시 ROLLBACK되는 것


격리성(Isolation)

격리성(Isolation)은 트랜잭션이 실행 중 다른 트랜잭션에 의해 데이터가 변경되는 것을 방지하는 특징

  • 트랜잭션이 완전히 수행되거나 완전히 수행되지 않은 상태를 외부에서 참조할 수는 있지만, 트랜잭션 중간 과정이나 중간 결과는 볼 수 없도록 하는 특징

  • 격리성이란 특징에서 동시성(Concurrency)과 격리 수준(Isolation Level)라는 중요한 개념이 나타나게 되었습니다.

    • 동시성(Concurrency): 여러 클라이언트가 동시에 하나의 데이터를 사용 및 공유 하는 것을 뜻함 (동시 접근 문제를 해결해야 함) 동시에 여러 트랜잭션이 동일한 데이터에 접근할 때는 데이터의 일관성을 유지하기 어렵다.

    • 이러한 문제를 해결하기 위해, 자원을 사용하는 하나의 클라이언트만 해당 자원을 점유할 수 있도록 하여, 다른 사용자가 접근할 수 없도록 만들어 자원을 공유하는 원인을 제거하면 된다. 이것을 자원 잠금(Resource Locking)이라 하고, 락(Lock) 개념이 나오게 되었다.

    • 락(Lock)은 사용 중인 데이터를 잠그는 방식으로, 어떤 트랜잭션도 다른 트랜잭션의 중간 상태를 볼 수 없게 되어 데이터 일관성을 유지할 수 있다.


지속성(Durability)

지속성(Durability)은 트랜잭션이 성공적으로 커밋된 후, 데이터가 어떠한 상황에서도 보존되는 특징

  • 트랜잭션이 완료되면 결과는 데이터베이스에 영구적으로 저장, 이후 시스템에 어떠한 문제가 생기더라도 데이터는 손상되지 않음

  • 트랜잭션이 성공적으로 완료되면 COMMIT 명령을 통해 영구적으로 저장 됨, 하지만, 트랜잭션 수행 도중 시스템이 비정상적으로 종료되더라도, 시스템은 트랜잭션 로그를 통해 아직 커밋되지 않은 트랜잭션을 복구할 수 있다.



Prisma의 Transaction

Prisma의 트랜잭션은 여러개의 쿼리를 하나의 트랜잭션으로 수행할 수 있는 Sequential 트랜잭션과 Prisma가 자체적으로 성공과 실패를 관리하는 Interactive 트랜잭션이 존재한다.

  • Sequential 트랜잭션은 Prisma의 여러쿼리를 배열로 전달받아 순서대로 실행함

  • Interactive 트랜잭션은 모든 비지니스 로직이 성공적으로 완료되거나 에러가 발생한 경우 Prisma 자체적으로 COMMIT 또는 ROLLBACK을 실행하여 트랜잭션을 관리하는 장점을 가진다.

태그:

카테고리:

업데이트: