전체 글 410

엘라스틱 스택

엘라스틱 서치의 탄생 엘라스틱 서치가 처음 등장했을때는 빅데이터 파이프라인을 구성하는 플랫폼 형태로 될것이라고 예상하기 어려웠을것이다. 엘라스틱 서치가 등장했을무렵 사이트내에서 전문 검색기능을 제공하는 강력한 소프트 웨어의 필요성이 있었고 검색솔루션 서비스는 대부분 구현체를 공개하지 않아서 접근하기가 쉽지 않았었다. 엘라스틱 서치는 자바 루씬에서 시작됐다. 루씬은 라이브러리 형태로 되어있기때문에 제대로 사용하기 위해선 너무나 많은 공부와 준비를 해야했다. 그이후 많은 과정을 거처서 자바외에도 다양한 프로그램언어를 지원하는 솔루션을 가진 검색엔진인 엘라스틱 서치가 나왔다. 엘라스틱 스택 엘라스틱 서치가 나올무렵 사용자가 선택한 보관함으로 로그를 보내는 오픈소스 데이터 수집도구인 로그 스태시를 개발하고 있었..

ELK 2023.11.06

NestJs+Sequelize 조합에서 jest로 mock함수 사용하기

NestJs+Sequelize 조합을 사용한 이유 기본적으로 제가 알기론 TypeOrm은 아직 1점대 버전이 아니고 토이프로젝트에서 사용해 본 결과 관계가 복잡해 질수록 orm함수들을 가져오지못하고 쿼리빌더로 직접 쿼리를 짜서 데이터를 가져와야했습니다. 그래서 그때 토이프로젝트에서 느낀바론 '이럴꺼면 orm을 왜쓰지?'라는 의문이 생겼습니다. 제일처음 배운 orm이 Spring의 JPA여서 그런지 typeOrm은 너무 불편한 orm기술이였습니다. 그래서 js진영에서 탄탄하고 안정적인 orm을 제공해주는 sequelize의 조합으로 프로젝트를 진행 해 봤습니다. Nestjs+Sequelize 단점 해당 조합으로 진행된 프로젝트나 레퍼런스자료가 너무 없어서 진짜 이해도가 떨어진 상태에서 작업을..

NestJS 2023.11.06

ORM에 의존해선 안되는 이유

ORM ORM (Object-relational mapping)은 객체와 데이터베이스 시스템을 연결(맵핑)해주는 라이브러리다. 세상엔 다양한 데이터 베이스 시스템이 있고 이를 다양한 방식으로 연결해야 하는데, ORM은 이렇게 둘 사이 (소스와 애플리케이션)의 연결을 도와주는 가교 역할을 한다. 따라서 많은 개발자들이 ORM과 데이터베이스의 마이그레이션을 편리하게 하기 위해 사용한다. 왜 쓰지 말아야 하는지에 대해 논의하기전에, 먼저 ORM의 장점을 살펴보자. 중복 코드 방지 다른 데이터베이스로 쉽게 교체 가능 여러 테이블에 쉽게 쿼리를 날릴 수 있음 인터페이스를 작성하는 시간을 아껴 비즈니스 로직에 집중할 수 있음 ORM에 의존해선 안된다. ORM보다 SQL을 더 중요하게.... 기존에 나와있는 ORM만..

NestJS 2023.11.06

Node.js 이벤트루프

이벤트루프 이벤트 루프는 시스템 커널에서 가능한 작업이 있다면 그 작업을 커널에 이관합니다. 자바스크립트가 단일 쓰레드 기반임에도 불구하고 Node.js가 non-blocking I/O 작업을 수행할 수 있도록 해주는 핵심 기능입니다 이벤트루프의 6단계 이벤트루프에는 6개의 단계가 있습니다. 각단계는 단계마다 처리해야하는 콜백함수를 담기위한 큐를 가지고 있습니다. node main.js 명령어로 Node.js 애플리케이션을 콘솔에서 실행하면 Node.js는 먼저 이벤트 루프를 생성한 다음 메인 모듈인 main.js를 실행합니다. 이 과정에서 생성된 콜백들이 각 단계에 존재하는 큐에 들어가게 되는데 메인 모듈의 실행을 완료한 다음 이벤트 루프를 계속 실행할 지 결정합니다. 만약 큐가 모두 비어서 더 이상 ..

NestJS 2023.11.06

Nestjs/TypeOrm/ 트랜젝션 처리 queryRunner

TypeOrm 트렌잭션 처리 ** TypeOrm에서 제공해주는 트랜잭션 처리는 크게 4가지 정도의 방법을 사용한다. ** queryRunner queryRunner의 장점은 수동으로 트렌젝션 제어를 하기때문에 좀 더 유연하게 트랜젝션 처리를 할 수 있다는 장점이있습니다. 하지만 문서에서처럼 new해서 들고오는 방법은 nest에서 권장하는 방식이 아니기때문에 di해서 커넥션 을 들고옵니다. 그리고 공식 문서에서는 queryRunner를 사용하라고 하는 이유는 데코레이터를 사용하면 서비스에 di하기도 힘들고 트랜젝션 처리가 제대로 이루어지지않습니다. queryRunner 사용시 유의할점 try할때 db로직이 이루어진후 마지막에 꼭 await queryRunner.commitTransaction(); 를 해줘..

NestJS 2023.11.06

TypeOrm/ Transaction

Transaction 기본적으로 백엔드에서 db관련 로직을 실행해 줄때에는 웬만하면 트렌젝션처리를 해주는것이 기본이다. 예를들어 회원정보를 수정하는 로직이 있다고하고, 해당 작업이 진행중에 어떠한 오류로 인해서 작업이 중단됐을때 Transaction을 걸어줬다면 해당 작업을 하기전으로 데이터가 롤백돼서 데이터가 꼬이거나 유실되는것을 막을 수 있기 때문에 모든 백엔드에서 DB관련 로직을 수행할때는 트렌젝션처리를 잘 해줘야합니다. ACID Atomicity: transaction의 작업이 부분적으로 성공하는 일이 없도록 보장하는 성질이다. 송금하는 사람의 계좌에서 돈은 빠져나갔는데 받는 사람의 계좌에 돈이 들어오지 않는 일은 없어야 한다. Consistency: transaction이 끝날 때 DB의 여러 ..

NestJS 2023.11.06

서버사이드 렌더링 (CSR/SSR)

서버사이드 렌더링(SSR) 서버에서 html을 렌더링해서 브라우져에 전달해 주는것 서버에서 완성된 페이지를 한번에 브라우저에게 전달해서 사용자가 원하는 페이지를 보여주는 것이다. 완성된 페이지를 보여준다는 장점이 있지만 그렇기때문에 서버사이드에서 렌더링이 늦어지면 그만큼 페이지를 리턴하는 속도가 느려지고 사용자가 멍때리고 기다리는 시간이 늘어난다는 뜻이기도 하다.클라이언트 사이드 렌더링(CSR) 브라우저가 html을 렌더링해서 사용자에게 보여주는것 서버에서 자바스크립트와 Css만 받아와서 자바스크립트를 사용해서 렌더링을 해주는 것이다. 클라이언트 사이드는 사이트가 커질 수 록 혹은 자바스크립트 렌더링 속도가 늦을수록 사용자가 빈 화면을 보게 되는 단점이 있다. SSR vs CSR 사실 뭐가 더 좋다라는 ..

NestJS 2023.11.06

NestJs swagger문서 보안

Swagger 문서 보안을 해야하는 이유 이미 서비스가 진행중인 웹사이트에서 swagger에 아무런 인증이나 권한없이 들어갈 수 있게 된다면 그 프로젝트의 구조를 다 알려주는 꼴이 돼 버리니 보안상에 아주 치명적인 손해를 받을 수 있다. Swagger 문서 보안 모듈 npm install express-basic-auth 기본적으로 위 라이브러리는 express위에서 동작하고 nest또한 express위에서 동작하기때문에 사용 할 수 있다. doc https://www.npmjs.com/package/express-basic-auth사용예시main.ts에 다음 미들웨어를 추가했다. id/pw는 유출되면 안되니 환경변수로 설정. app.use( ['/docs', '/docs-json'], expressBa..

NestJS 2023.11.06

NestJS/Swagger 사용

Swagger? 간단하게 생각하면 api문서를 자동으로 만들어주는 라이브러리이다. Swagger 모듈 설치 npm install --save @nestjs/swagger swagger-ui-express Swagger모듈을 설치할때 주의할점 nestjs버전이 7버전이라면 swagger버전을 4버전으로 다운그레이드 해야합니다. npm i --save @nestjs/swagger@4 사용예시 main.ts에서 설정을 해준다. const config = new DocumentBuilder() .setTitle('C.I.C') .setDescription('cat') .setVersion('1.0.0') .build(); const document: OpenAPIObject = SwaggerModule.cre..

NestJS 2023.11.06

NestJs/MongoDB visual Field(가상필드)

visual Field 예를들어 회원가입을 진행할때 프론트단에서 백엔드 api로 통신하는 중에 password같은 중요한정보는 중간에 누군가가 낚아 체갈 수 있기때문에 숨겨주는것이 보안상 더 좋은데 이때 사용하면 유용한것이 몽고디비에서 제공해주는 visual Field라는 기능을 사용하면 좋다. 사용예시 //밑에서 정의한 가상필드를 스키마에 필드로 명시 readonly readOnlyData: { id: string; email: string; name: string }; } //virtual 메소드를 사용해서 하면된다. CatSchema.virtual('readOnlyData').get(function (this: Cat) { return { id: this.id, email: this.email, n..

NestJS 2023.11.06