트리거
는A
가 실행되면B
를실행시켜주는 (후처리기)
EX : 로그를 기록하기
Nest.js
에서는Subscriber
를 통해서 사용한다.
이또한Module
에 등록해야 사용 가능.@EventSubscriber() export class ProductSubscriber implements EntitySubscriberInterface<Product> { constructor(connection: Connection) { // TypeOrm Connection객체에 Subscriber로 해당 클래스를 요소로 넣는다. connection.subscribers.push(this); } // Product 객체를 Listen한다. listenTo() { return Product; } // Insert가 완료된다면(Product테이블에) afterInsert(event: InsertEvent<Product>) { console.log(event); } }
이런식으로
Subscriber
에서 특정 메소드를 이용해event
를catch
한다면event
를 확인할수있다.
event
를 처리한 로그같은걸 남기게 된다면db
에 저장하게되거나 다른txt
파일로 처리하게되는데 쌓이면 쌓일수록 비효율적이기때문에
gcp
에있는BigQuery
처럼Log 데이터
를 저장할수있는곳에 기록한다.
GCP
에서 제공하는Log Data Storage
Node.js
기준 설치법
yarn add @google-cloud/bigquery
const bigQuery = new BigQuery({
keyFilename: process.env.BIGQUERY_KEY_FILENAME,
projectId: process.env.PROJECT_ID,
});
bigQuery
.dataset('class_project_camp')
.table('products')
.insert([
{
id: event.entity.id,
name: event.entity.name,
price: event.entity.price,
description: event.entity.description,
isSoldout: event.entity.isSoldOut,
},
]);
프로시저
는DB
에서의 함수(Function)
EX : 더미데이터를 만들기
DBeaver
create procedure mydummydata()
begin
declare i int default 1;
while i <= 5000000 do
insert into board(writer, title, contents) values('철수', rand(), '네용');
set i = i + 1;
end while;
end;
대체적으로 INDEX는 테이블에 데이터 양이 엄청나게 많을 경우 주로 사용한다
지나치게 많은 INDEX를 지정하거나 NULL이 많은 컬럼, 삽입 수정이 자주 이루어지는 테이블에는 INDEX 사용을 지양하는 것이 좋다.
500만개이상의 데이터가 들어있는 테이블에서
그냥 검색을하니 시간이 엄청 오래걸린다
하지만 index Serach를 하게되면
이런식으로 획기적으로 줄게된다
create index idx_title on board(title)
이런식으로 index를 만들어 설정.
메모리 기반 DB
빠른 검색을 위한 ( MySQL보다 빠른 Redis에서 가져온다)
(검색)
Browser <-> Backend <-> Redis
없다면
Browser
에서 검색한다BE
에서 Redis
에 있는지 확인한다.Cache-Hit
BE
에서 Browser
로 결과전달Browser
에서 검색한다BE
에서 Redis
에 있는지 확인한다.Cache-Miss
BE
에서 MySQL
에 검색BE
에서 Redis
로 해당 결과를 저장한다.BE
에서 Browser
로 결과전달임시 저장을 위한 (MySQL보다 빠른 Redis에 임시 저장하자.)
(저장)
Browser -> Backend -> Redis -> MySQL
BE
에서 DB
로 저장할때 디스크 I/O
가 발생하게되는데
더 빠르게
저장하기 위해
BE
-> Redis
로 저장하면 임시저장
하기가 좋다.
Node.js
설치
yarn add cache-manager
yarn add redis
yarn add cache-manager-redis-store
/**
* Redis
*/
import type { RedisClientOptions } from 'redis';
import * as redisStore from 'cache-manager-redis-store';
// in app.module.ts
CacheModule.register<RedisClientOptions>({
store: redisStore,
url: 'redis://my-redis:6379',
isGlobal: true,
}),
도커로 redis들어가기
docker exec containerid /bin/bash
redis-cli
get
,set
,keys
를 통해서 생성 및 조회
ttl
-1
:ttl
이 존재하지않는다.-2
:ttl
이 지났다(삭제됨)