공부하기
-
NestJs, Redis 캐싱 기록공부하기/node.js 2023. 3. 12. 13:46
과거 프로젝트를 진행할 때 조인이 많이 걸린 테이블 행의 상세 정보(findOne)를 데이터베이스에서 select할 경우 쿼리 속도가 굉장히 느렸던 경험이 있습니다. 테이블간의 관계가 많고 테이블 행의 갯수가 많을 수록 select 하는 시간은 오래걸리기 때문에 요청한 클라이언트에 대한 응답은 느릴 수 밖에 없었던 것입니다. 이 포스팅은 ' 이러한 문제를 어떻게 해결해야할까? '에서 출발하였습니다. 물론 데이터베이스 쿼리 실행계획을 고려한 쿼리 최적화 및 테이블 인덱스 설정이 우선이지만 이 포스팅에서는 다루지 않겠습니다. 테스트는 실제 데이터베이스에 연결하지는 않지만 sleep 함수를 통해 쿼리에 1초 딜레이를 발생시켜 쿼리를 수행한다고 가정합니다. - 레디스 전략 중 Look Aside (Lazy Lo..
-
NestJs Cache 탐색 및 기록공부하기/node.js 2023. 3. 9. 19:09
그림으로 이해하기 1. in-memory에 캐싱 데이터가 존재할 경우 엔드포인트를 거치지 않고 곧바로 캐싱 데이터를 리턴 2. 캐싱 데이터가 존재하지 않을 경우 DB 탐색 후 데이터를 캐싱 후 리턴 @nestjs/common 모듈의 cache-module 캐시 탐색 및 기록 예제 코드 import { CacheModule, Module } from '@nestjs/common'; import { UserController } from './user.controller'; import { UserService } from './user.service'; @Module({ imports: [ CacheModule.register({ ttl: 5, // 캐싱 만료 시간 max: 10, // 캐싱 데이터 수 }..
-
Redis Data Types 요약공부하기/데이터베이스 2023. 3. 3. 21:00
Keys 레디스 key는 binary safe하며 "tscalm" 같은 문자열에서 JPEG 파일까지 모든 바이너리 시퀀스를 키로 사용할 수 있고 빈 문자열도 유효한 키이다. 키에 대한 몇 가지 다른 규칙: 긴 키 네임은 조회 비용이 많이 들기 때문에 권장되지 않는다. 키 네임이 짧은 것 또한 무조건 좋은게 아니다. 예를 들어 (1)user:1000, (2)u1000 두개의 키가 존재할 때 (1번)이 더 가독성이 좋고 키를 저장하거나 조회하는데 사용되는 메모리의 차이는 신경쓸 정도가 아니다. object-type:id 같은 스키마를 정의해서 사용하며 여러 단어로 이뤄진 필드는 . 또는 - 로 구분한다. 예를 들어 "comment:4321:reply.to" or "comment:4321:reply-to". ..
-
Mac m1 Redis 설치 기록공부하기/데이터베이스 2023. 3. 3. 19:56
1. 홈브루 버전 체크 명령으로 홈브루가 컴퓨터에 설치되어 있는지 체크한다. brew --version // 응답 Homebrew 4.0.4 Homebrew/homebrew-core (~~~어쩌구저쩌구) 2. 홈브루를 통해 레디스를 설치한다. brew install redis 3. 포그라운드 실행 명령으로 레디스가 정상적으로 동작하는지 확인한다. redis-server -> 정상적으로 실행될 경우 종료 명령은 ctrl + c 입니다. 4. 백그라운드로 레디스를 시작합니다. brew services start redis // 응답 ==> Successfully started `redis` (label: homebrew.mxcl.redis) 5. 백그라운드 레디스를 상태를 확인합니다. brew service..
-
NestJs Swagger 문서 만들기공부하기/node.js 2023. 3. 2. 22:02
Swagger가 뭐야? API 문서화 툴로서, API의 요청/응답 데이터, 파라미터, 경로, 헤더 등 API를 이용하는 데 필요한 모든 정보를 제공합니다. 또 API를 이용하는 클라이언트가 API를 쉽게 이해하고, 테스트할 수 있으며, 개발자는 API의 사용 방법을 명확하게 이해할 수 있습니다. 저희는 NestJs에서 소개하는 @nestjs/swagger 모듈을 사용하여 스웨거 문서를 만들도록 하겠습니다. @nestjs/swagger를 사용하여 swagger 문서 만들기 1. 모듈 install npm install --save @nestjs/swagger 2. main.ts에서 swagger setup main.ts async function bootstrap() { ... const config = ..
-
MySql 오브젝트 스캔 유형공부하기/데이터베이스 2023. 2. 28. 07:02
오브젝트 스캔 유형 1.테이블 스캔 (Table Scan) : 인덱스를 거치지 않고 바로 디스크에 위치한 테이블 데이터에 접근 (1) 테이블 풀 스캔 (Table Full Scan) 테이블의 처음부터 끝까지 데이터를 훑어보는 방식으로 인덱스를 사용하지 않는 유일한 방식 사용 where 접의 조건문을 기준으로 활용할 인덱스가 없는 경우 전체 데이터 대비 대량의 데이터가 필요할 경우 (보통 20%~25%) 2.인덱스 스캔 : 인덱스로 테이블 데이터를 찾아가는 유형 (1) 인덱스 범위 스캔 (Index Range Scan) 인덱스를 범위 기준으로 스캔한 뒤 스캔 결과를 토대로 테이블 데이터를 찾는 방식 사용 BETWEEN ~ AND 구문이나 , LIKE 구문 등 비교 연산 및 구문에 포함될 경우 특징 좁은 범..
-
[용어] MySql 드라이빙 테이블, 드리븐 테이블공부하기/데이터베이스 2023. 2. 28. 06:23
예제 코드 select 유저.등록번호, 유저.이름, 유저상세.전화번호, 유저상세.주소 from 유저 join 유저상세 on 유저.등록번호 = 유저상세.등록번호 where 유저.등록번호 IN (1,100); 위 예제 코드를 보면 두개의 테이블을 조인하여 쿼리를 수행하고 있습니다. 두 테이블에 동시에 접근할 수 없기 때문에 선후 관계를 갖고 먼저 접근하는 테이블을 드라이빙 테이블(유저), 후에 접근하는 테이블을 드리븐 테이블(유저상세)이라고 합니다. 드라이빙 테이블에서 많은 건수가 반환되면 해당 결과를 가지고 드리븐 테이블에 접근하기 때문에 드라이빙 테이블을 선정하는 과정은 매우 중요합니다. 가능하면 적은 결과가 반환되는 테이블을 드라이빙 테이블로 선정하고 조인 조건절의 컬럼이 인덱스로 설정되도록 구성해야합..
-
헥사고날 NestJs, TypeOrm dto type 리펙토링공부하기/node.js 2023. 2. 26. 19:18
간단한 설문조사 프로젝트를 만들던 중 문득 의문이 들었다. 의문 인바운드 포트와 아웃 바운드 포트의 인풋, 아웃풋이 같은 경우가 상당히 많은데 구지 똑같은 타입을 여러개 선언할 필요가 있을까?? TypeOrm을 사용하기 때문에 엔티티의 클래스와 TypeScript의 유틸리티 타입을 사용하면 유지보수 측면에서 더 좋지 않을까? 리펙토링 도전 before survey/out-port/survey-findone.op.ts 인바운드 포트, 아웃바운드 포트의 output 타입은 같습니다. export type SurveyFindOneOutPortOutputDto = { id: number; name: string; description: string; question: Array; }; after survey/t..