백엔드 복습-Day29

이예음·2023년 1월 26일
0

백엔드 복습하기

목록 보기
23/23
post-thumbnail
post-custom-banner

Trigger

특정 테이블에 INSERT, DELETE, UPDATE같은 DML문이 수행되었을 때, 데이터베이스에서 자동으로 동작하도록 작성된 프로그램

특징

사용자의 직접 호출이 아닌, 데이터베이스에서 자동적으로 호출

Big Query

엄청나게 큰 데이터에 대한 SQL 쿼리를 빠르게 수행해주는 플랫폼의 서비스 중 하나

특징

  • 페타바이트에 달하는 데이터도 빠르게 분석 가능
  • DB 설계처럼 복잡하지 않다
  • 따로 관리가 필요하지 않고 검색 속도가 빠르다
  • 필요한 정보만 찾아서 사용 가능

설치 명령어

yarn add @google-cloud/bigquery

Setting

BigQuery를 사용하기 위한 서비스 계정 생성

29-01-trigger

product.subscriber.ts

데이터가 BigQuery에 저장될 수 있도록 추가 로직 작성

product.module.ts

.env

결과

발생한 event 내의 entity에 대한 내용 확인 가능

Procedure

요즘은 프로시저를 DB에서 직접 적용하기보다는 가급적이면 Js단에서 적용하는 편임

하지만 복습은 기능 이해를 하기위해 DB단에서 프로시저를 이용해서 많은 양의 DUMMY DATA를 직접 생성

dbeaver

생성된 프로시저를 삭제하고 싶다면 drop procedure [프로시저명]

결과

Index

: 테이블을 빨리 조회하기 위해 테이블 데이터에 포인터를 주는 검색 방법

인덱스를 적용하는 과정

같은 테이블 내에서 검색을 하는데 왜 속도 차이가 나는가?

Explain 명령어로 보는 옵티마이저의 실행계획

  • 옵티마이저 : 검색을 효율적으로 해주는 DB 내장기능
  • 실행계획 : 효율적인 검색 계획
  • Explain 명령어 : 옵티마이저가 결정한 실행결과를 볼 수 있는 명령어

type은 데이터를 찾을 방식(ALL - Full Scan, const - index), rows는 검색할 양

같은 테이블 내에서 검색을 하는데 왜 실행계획이 다른가?

PK, FK, UNIQUE가 자동으로 인덱스를 생성하기 때문이다.

결론
인덱스( = 책갈피)가 걸려있는 컬럼으로 데이터를 찾으면 빠르게 검색 가능

PK, FK, UNIQUE말고 다른 컬럼에도 index를 직접 생성할 수 있는가?

💡 참고 - type의 대표적인 유형

  • ALL : 인덱스 안찾고 모든 테이블 풀스캔
  • const : 인덱스 찾아볼 예정(PK, FK, UNIQUE 중에서)
  • ref : 인덱스 찾아볼 예정(직접 만든 인덱스 중에서)
  • range : 인덱스 찾아볼 예정(크다: "<", 작다: ">" 등 범위 검색 중에서)

📍 주의할 점

  • 실행계획은 예측이기 때문에, 실제와 차이가 있을 수 있음
  • 빠른 검색을 위해 모든 컬럼에 인덱스를 적용하게 되면
    데이터를 등록, 수정할 때 마다 정렬을 시도하기 때문에 속도가 느려지게 됨
    그렇기 때문에, 검색에 자주 사용되는 컬럼에 인덱스를 적용하는 것이 좋음

Redis(Remote Dictionary Server)

: NoSQL로서 Key-Value 타입의 저장소 모든 데이터를 메모리에 저장하고 조회한다.(= 인메모리 데이터베이스)

다른 인메모리 DB와의 차이점

  • 다양한 자료구조

redis 출처

장점

  • 개발의 편의성이 좋아짐
  • 난이도가 낮아짐

특징

  • 영속성을 지원하는 인메모리 데이터 저장소
  • 읽기 성능 증대를 위한 서버 측 복제를 지원
  • 쓰기 성능 증대를 위한 클라이언트 측 샤딩(Sharding) 지원
  • 다양한 서비스에서 사용되며 검증된 기술
  • String, list, hash, set, sorted set과 같은 다양한 데이터형을 지원.
    메모리 저장소임에도 불구하고 많은 데이터형을 지원하므로 다양한 기능을 구현

Redis VS Memcached(Redis의 이전 버전)

공통점

  1. 1ms 이하의 응답 대기시간
    데이터를 메모리에 저장하기 때문에, 디스크 기반의 데이터 베이스보다 빠르게 데이터를 읽을 수 있다.
  2. 개발의 용이성
    문법적으로 사용하기 쉽고, 개발코드 양도 적음
  3. 데이터 파티셔닝
    데이터를 여러 노드에 분산하여 저장할 수 있음
    따라서 수요가 증가할 때 더 많은 데이터를 효과적으로 처리하기 위하여 스케일 아웃이 가능함
  4. 다양한 프로그래밍 언어 지원
    여러 개발언어를 지원함(자바, 파이썬, C, C++, C#, JavaScript, Node.Js, Ruby, Go 등)

차이점

  1. Memcached는 멀티스레드를 지원하기 때문에, 멀티프로세스코어를 사용할 수 있다.
    따라서, 스케일업을 통하여 더욱 많은 작업처리를 할 수 있다.
  2. Redis는 더욱 다양한 데이터 구조를 사용할 수 있다.
  3. Snapshots
    특정시점에 데이터를 디스크에 저장하여 파일 보관이 가능하다. 또한 장애 상황시 복구에 사용할 수 있다.
  4. 복제
    Master - Salves 구조로, 여러개의 복제본을 만들 수 있다.
    따라서, 데이터베이스 읽기를 확장할 수 있기 때문에 높은 가용성(오랜 시간동안 고장나지 않음) 클러스터를 제공
  5. 트랜잭션
    트렌젝션이란 데이터베이스 상태를 변경시키는 작업 단위. 원자성, 일관성, 독립성, 지속성의 특징을 가지고 있다.
    Redis는 이러한 특징을 지원
  6. Pub(발행) / Sub(구독) messaging
    높은 성능을 요구하는 채팅, 실시간 스트리밍, SNS피드 그리고 서버 상호통신에 사용 가능
  7. 루아 스크립트 지원
    매우 경량화된 절차스크립트 언어인 루아 지원. eval 명령어를 사용하여 루아스크립트를 실행시킬 수 있다.
    따라서, 프로그램을 명료하게하고 성능을 높일 수 있다.
  8. 위치기반 데이터 타입 지원
    두 위치의 거리를 찾거나, 사이에 있는 요소 찾기등의 작업을 수행
    이를 활용하여 맛집, 길찾기 그리고 지도기반의 고성능 서비스를 제공할 수 있다.

Cache-Aside 패턴 VS Write-Back 패턴

출처

Cache-Aside 패턴(빠른 검색용)

  • 검색할 때 redis에서 먼저 찾아보고 redis에 저장된 내용이 있다면 저장된 정보를 바로 보여주고,
    없다면 MySQL에서 정보를 보여준 다음 검색된 내용을 redis에 저장하는 방식

Write-Back 패턴(임시저장용)

  • redis에 먼저 임시 저장해놓은 뒤 Database에 저장하는 방식
  • 디스크 기반의 Database에 저장해야할 데이터 양이 많은 경우 디스크I/O(속도가 느린 현상)가
    발생하게 되는데 이를 해결하기 위해 Write-Back 패턴을 사용

29-02-redis

파일 구조

docker-compose.yaml

Dockerfile

app.module.ts, .env

결과

  • brew services stop mysql 명령어를 통해 로컬 mysql을 중단시킨 후(Dbeaver까지 종료)
    도커를 키고 docker-compose build 명령어로 빌드 후 docker-compose up 명령어로 실행한다.

터미널에서 Redis 실습

createBoard에 Redis 연결

설치 명령어 : yarn add redis, yarn add cache-manager-redis-store@2.0.0, yarn add @types/cache-manager-redis-store --dev, yarn add cache-manager
app.module.ts

board.resolver.ts

📌 에러 해결 노트

모듈 설치 버전 문제

redis를 사용하기 위해 yarn add cache-manager-redis-store 설치 명령어로 설치를 하는데 밑에 에러가 떴다.
대충 읽어보니 node가 저 버전이랑 호환이 안된다는 내용이었다.

그래서 npm을 들어가서 확인한 결과 2.0.0버전이 제일 많이 다운로드된걸 알 수 있었다.

2.0.0버전을 사용하기 위해 기존 설치명령어 뒤에 @2.0.0을 붙여줬다.
yarn add cache-manager-redis-store@2.0.0

✨ 설 치 완 료 ✨

로직에 Redis를 연결하는데 생긴 오류

캐시에 등록하는 연습을 하기 위해 set 로직을 작성하는데 ttl에서 에러 문구가 나왔다.

뭐가 문제인가 진짜 로직 하나하나 읽어보고 검색하고 해보니 아무래도 cache-manager 버전도 확인해봐야할거같아서 버전을 다르게 해서 yarn install을 다시 했다.
기존 설치되어있던 버전

변경한 버전

제일 많은 다운로드가 된 4.1.0버전을 사용했다.

✨ 에 러 해 결 ✨

profile
응애
post-custom-banner

0개의 댓글