Day29(4.21)

ShinJuYong·2022년 4월 21일
0

camp

목록 보기
28/44
post-thumbnail

Trigger & Procedure

Trigger

트리거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에서 특정 메소드를 이용해 eventcatch한다면 event를 확인할수있다.

event를 처리한 로그같은걸 남기게 된다면 db에 저장하게되거나 다른 txt파일로 처리하게되는데 쌓이면 쌓일수록 비효율적이기때문에

gcp에있는 BigQuery처럼 Log 데이터를 저장할수있는곳에 기록한다.

BigQuery

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,
        },
      ]);

Procedure

프로시저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를 만들어 설정.


Redis

메모리 기반 DB

Cache-Aside 패턴

빠른 검색을 위한 ( MySQL보다 빠른 Redis에서 가져온다)
(검색)
Browser <-> Backend <-> Redis
없다면

Redis에 데이터가 존재할때

    1. Browser에서 검색한다
    1. BE에서 Redis에 있는지 확인한다.
    1. 있다면 Cache-Hit
    1. BE에서 Browser로 결과전달

Redis에 데이터가 존재할때

    1. Browser에서 검색한다
    1. BE에서 Redis에 있는지 확인한다.
    1. 없다면 Cache-Miss
    1. BE에서 MySQL에 검색
    1. 확인
    1. BE에서 Redis로 해당 결과를 저장한다.
    1. BE에서 Browser로 결과전달

Write-Back 패턴

임시 저장을 위한 (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이 지났다(삭제됨)

메인프로젝트 - Redis를 통한 로그아웃

0개의 댓글