JS 공부 11

[NestJS] 쿼리 헤치우기(2. 트랜잭션화 하기, 그리고 이걸로 테스트하기 === 왜이래이거;;)

https://jangsarchive.tistory.com/147 [NestJS] 쿼리 헤치우기(1. 인덱스 넣기 & 쓸데없는 쿼리 줄이기) 부스트캠프에서 프로젝트를 진행하면서, 전체 테스트를 실행할 때 항상 13~16초의 시간이 걸렸다. 테스트가 약 260개정도였을 때 이 정도가 나온다고 했을 때, 초당 20개의 테스트가 돌아간다고 생 jangsarchive.tistory.com 기존 쿼리 최적화를 보고 오는 것도 추천한다. 이걸 하고 나서 그 다음에 처리한 과정이기 때문이다. 트랜잭션이란? 그리고 트랜잭션화의 필요성 데이터베이스를 사용할 때 트랜잭션이란 무엇일까? 정말 간단하게, 트랜잭션은 DB에 보내는 쿼리를 묶음이라고 생각하면 된다. 쿼리를 하나씩 계속 보내는 것이 아닌, 하나를 통째로 보내서 성..

JS 공부/NestJS 2023.12.13

[NestJS] 헬스체크?? 라잇웨잇베이베!!!(Cron, HealthCheck로 주기적으로 서버 확인하기, 로깅하기)

부스트캠프 팀 프로젝트를 진행하면서, 서버의 상태를 확인하는 플로우를 만들어야 했다. 쉘스크립트를 crontab을 이용해서 slack에 서버 상태 메시지를 보내는 방법을 만들었지만, 이걸로는 부족했다. 내가 원하는 것은 일종의 서버실이었다. 서버 하나에서 DB, Main서버를 계속해서 확인하는 로직을 원했다. 로컬에서도 실행시켜 서버 상태를 계속 확인하고, 다른 서버에서 주기적으로 시그널링을 처리했으면 좋겠다는 생각을 했다. 그래서 어떻게 처리했을까? 크게 라이브러리 추가, 모듈 구현, 프로바이더 구현으로 나누어보았다. 라이브러리 추가 이 동작을 구현하기 위해서, 3가지 라이브러리를 추가했다. npm install @nestjs/terminus npm install @nestjs/schedule npm ..

JS 공부/NestJS 2023.12.13

[NestJS] Team NDD. 영상 인코딩~클라우드 업로딩까지의 험난한 여정(그리고 쓰지 못한 이유...)

간단하게 팀 NDD에 대해서 설명을 해...주진 않겠다. 궁금하면 팀 블로그를 보는 것도 방법이지!!! 왜 우리는 인코딩을 해서 클라우드 스토리지에 올리려는 계획을 세웠을까? 기존에는 클라이언트에서 녹화한 webm파일을 바로 클라우드 스토리지에 전송시키는 방식을 이용했다. 이 방식은 클라이언트가 백엔드에게 녹화한 면접 영상의 이름을 만들기 위한 데이터를 준다(우리는 질문 이름과 jwt토큰을 주었다) 백엔드에서는 해당 정보로 영상 이름(key : 회원이름_질문내용_uuidv4()을 url에 받을 수 있게 파싱했다)와, presigned-url(영상을 저장할 권한을 미리 담아둔 url)을 보내주었다. 클라이언트에서 presigned url로 영상 저장을 요청하면 저장한 영상의 주소가 나온다. 영상의 주소와 ..

JS 공부/NestJS 2023.12.10

[NestJS] 쿼리 헤치우기(1. 인덱스 넣기 & 쓸데없는 쿼리 줄이기)

부스트캠프에서 프로젝트를 진행하면서, 전체 테스트를 실행할 때 항상 13~16초의 시간이 걸렸다. 테스트가 약 260개정도였을 때 이 정도가 나온다고 했을 때, 초당 20개의 테스트가 돌아간다고 생각했다. 하지만 나는 더, 더 빨라지길 원했다... 그래서 모든 API의 쿼리 로그를 분석해보기 시작했다. 이렇게 모든 로깅을 true로 설정하고, 로그를 분석하면서 조금씩 메모를 진행했다. 쓰다보니, 필요한 부분과, 이게 꼭 있어야 할까 싶은 부분들이 있었다. 이에 대한 간단한 정리들과, 내가 처리한 방법을 공유해보려고 한다. SAVE repository.save라는 로직을 정말 흔하게 사용했다. 이유는? 겁나게 편했다. 진짜 다른 뭔가를 생각할 필요가 없었다. 하지만 편하다는건? 라이브러리처럼 그 속에서 겁..

JS 공부/NestJS 2023.12.05

[NestJS] Spring을 공부하다 왔을 때 처음 낯설던 것(DTO)

SpringBoot에서 @RequestBody를 통해 dto 객체를 받을 수 있었다. 똑같은 로직을 생각하고, RegisterRequest객체를 js에서 아래와 같이 만들었다. const EMAIL_REGEX = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/; export class RegisterRequest{ username:string; nickname:string; email:string; password:string; passwordCheck:string; constructor(username:string, nickname:string, email:string, password:string, passwordCheck:string) { this.usern..

JS 공부/NestJS 2023.11.03

[JS] 타입스크립트를 내맘대로 써보고 느낀점(함수형에 객체지향 한컵 넣기)

부스트캠프가 끝난지 딱 일주일째 되는 날이다. 기존의 과제들을 타입스크립트로 하나씩 수정해보면서, 정말 좋다고 느낀 장점들과, 귀찮았던 점이 있다. 좋은 점 런타임에서만 알던, 변수의 타입을컴파일단에서 바로 알 수 있다. 자바만 하던 나라면, 그거 당연한거아님?ㅋㅋㅋㅋㅋㅋㅋㅋㅋ 변수 타입도 모르는 프로그래밍 언어가 있나?? 싶었을 것이다. 자바스크립트를 공부해보며, 이게 참 좋은 기능이었다는 것을 느꼈다. (자멘....꽃이 지고 나서야 봄인줄 알았습니다..) 이러한 부분은 내가 함수에서 파라미터를 받을 때, 파라미터를 활용할 때 특히 득을 봤다. 심지어 함수의 반환타입도 설정해줄 수 있어 아주 편했다. 인터페이스를 사용할 수 있다. 사실 이 부분은 내가 자바스크립트에 있는데 써보지 못한 것일 수 있다. ..

[JS] fs? 이런 기능은 처음이야...

자바에서는 한번도 써본 적 없는 파일 시스템 기능이었다. 이를 위해서 파일 시스템을 먼저 알아야겠지? 이 파일 시스템을 알아야 하는 이유가 몇 가지 있다. 이 fs모듈은 파일의 경로로 접근한다. 해당 경로의 데이터가 파일인지, 디렉토리인지 알고 써야한다. (혹은 이를 검증하기 위한 로직이다) fs모듈도 사실 파일 시스템에 대해서 공부하기 전에 사용해봤다. 알고쓰니 이런 의미였나 싶기도 했다. fs모듈은 쓰는 법은 간단하다. 외부 라이브러리도 아니고, 기본적으로 주어진 모듈이다. const fs = require("fs") 일단 외부 모듈을 담아준다. 그러면 fs에서 지원되는 기능이 되게 많다. readFile writeFile appendFile unlink mkdir rmdir readdir renam..

[JS] JS에서 비동기처리가 왜 그렇게 중요할까?

heap : 메모리 할당이 일어난다. call stack : 스택프레임이 생성되어 호출된 함수들이 쌓인다. setTimeOut, DOM, HTTP같은건 V8소스에 없다. V8 런타임과 브라우저가 제공하는 웹 API가 존재한다. 브라우저는 DOM, AJAX, timeout, callback queue, event loop를 가지고 있다. JS : 기본적으로 싱글스레드 런타임을 가지고 있다. 즉, 하나의 콜 스택을 가지고 있다. ex : 제곱을 출력하는 기능을 만든다. 구성함수들 곱하기 (a, b) => a * b; 제곱 (n) = > 곱하기 (n, n); 제곱출력기 (n) => console.log(제곱(n)); 콜스택에서 일어나는 일 main 함수 push 제곱출력기 push 제곱 push 곱하기 pus..

[JS] axios? 아씨오?

axios는 자바스크립트에서 비동기 통신방식이다. http의 요청과 응답을 처리할 수 있다. Promise 기반 : 비동기적으로 작업을 처리한다. 요청을 보내고 응답을 기다리기도 하며, then을 이용한 후처리, catch를 이용한 실패시 처리 까지 수행시킬 수 있다. http 요청 메서드 지원 : get, post, patch, delete, put등을 이용해 restful api를 만들 수 있다. 또한 여기서 get, delete과 같은 경우에는 body의 값을 요청에 넣어줄 수 없다는 경험으로 배운 특징이 있다. (대신 헤더, 세팅등은 넣을 수 있다) 요청과 응답 인터셉터 : 요청의 헤더를 json화 시키거나, body에 넣을 객체를 미리 선언한 후 넣어서 처리할 수 있다. 자동 데이터 변환 : 모..

[JS] 호이스팅이 그래서 도대체 뭔데?

이전에 변수들에 대해서 공부하는데, 호이스팅이라는 개념을 몰라서 따로 공부해야했다. 호이스팅이 뭘까? 우리가 쓴 코드를 생각해보아야 한다. 자바스크립트의 모듈에서 함수를 생성했을 때, 그 함수는 실제로 작성된 부분에서 생성된게 아니다. 생성단을 모두 위로 올려두고, 그 이후에 아래쪽에서 해당 부분을 만드는 것이다. 이런 방식의 호이스팅에는 몇가지 문제점이 존재한다. 선언된 변수와 함수가 먼저 선언되었기 때문에, 할당되기 전에 사용될 수 있다는 문제점(?)이 존재한다. 이게 왜 문제일까? 어떻게 보면 이점아닐까? 사용이 원할하잖아!!! 호이스팅은 선언만 끌어올리고 할당은 끌어올리지 않기 때문에 변수에 실제 값을 할당하기 전에는 undefined로 초기화되어 예기치 못하게 오류가 발생하게 할 수 있다 이렇게..