
트리거는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-HitBE에서 Browser로 결과전달Browser에서 검색한다BE에서 Redis에 있는지 확인한다.Cache-MissBE에서 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이 지났다(삭제됨)