https://nodejs.org/ko/docs/guides/dont-block-the-event-loop 이벤트 루프와 워커 풀을 막지 마세요! | Node.js Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. nodejs.org 이 글이 나오게 된 배경 Express서버를 짜던 중 파일 입출력을 할 일이 생겼는데, 나는 지금까지 그래왔듯 자연스럽게 fs모듈을 import해서 fs.readFileSync를 사용했다. 사실 readFile 메서드도 있지만 이 친구는 비동기로 작동하기 때문에 Promise로 Wrapping하여 사용해야했고, 그게 귀찮다는 이유에서 readFileSync를 지속적으로 남발해왔다. readFil..
Backend/문제해결기
왜 도입하게 되었나 블로그 피드를 만들긴 했으나, 블로그 글이 올라왔을때, 알림이 오게 하고 싶었다. https://0422.tistory.com/300 풀과 푸시 풀 일반적으로 사용되는 HTTP요청의 모습이다 request가 오면 서버가 response를 주는 형태이다. 푸시 푸시는 요청이 없어도 응답을 내려준다. fcm에서는 서비스워커(firebase-messaging-sw.js)가 일을 한다고 한다. FCM이란? Firebase Cloud Messaging의 약자이다. 위 사진처럼 동작한다. 위사진 과정을 이해해보자. 준비과정 1. Get Token 클라이언트는 디바이스 고유의 token을 firebase로부터 발급받는다. 이 token은 기기마다 고유하다! 2. Send and store toke..
https://0422.tistory.com/294 Docker compose로 테스트 코드 환경 구성하기(express + TypeORM) - typeORM, Jest 설정 컨테이너 설정은 다했으니 TypeORM과 Jest의 설정을 해보자. Data-Source.ts 일단 나는 DataSource방식으로DAO코드를 작성했다. https://orkhan.gitbook.io/typeorm/docs/data-source Working with DataSource - typeorm Generally, you ca 0422.tistory.com 위 글에서 이어진다. 문제 현재 유닛 테스트, 통합테스트는 로컬 환경에서만 가능하다. 이걸 배포시에 자동으로 테스트한뒤 배포해보자(배포구성은 이미 되어있음) 유닛테스트,..
이번에야말로 모킹을 통해 유닛테스트를 작성해보자. 왜 필요한가? 솔직히 이걸 제대로 이해하지 못해서 계속 모킹이라는 것을 이해하지 못했던 것 같다. https://0422.tistory.com/294 Docker compose로 테스트 코드 환경 구성하기(express + TypeORM) - typeORM, Jest 설정 컨테이너 설정은 다했으니 TypeORM과 Jest의 설정을 해보자. Data-Source.ts 일단 나는 DataSource방식으로DAO코드를 작성했다. https://orkhan.gitbook.io/typeorm/docs/data-source Working with DataSource - typeorm Generally, you ca 0422.tistory.com 이전에 적었던 글을 ..
이전 게시글에서 이어진다. 처음에 forEach로 비동기 처리를 했어서 뭔지 생각을 하다가 이전 게시글을 적게되었고, 이전 게시글의 정보를 통해 DB에 접근하는 시간을 줄이고자, map와 Promise.all을 사용해서 해결하려고 했다. static async createProfile(profileData: ProfileCreateData) { const profile = await ProfileDAO.createProfile(profileData); //프로필을 생성함 const promises = profileData.hashTags.map((hashTag) => HashTagService.add(hashTag, profile.id) ); //프로필 등록 await Promise.all(promise..
컨테이너 설정은 다했으니 TypeORM과 Jest의 설정을 해보자. Data-Source.ts 일단 나는 DataSource방식으로DAO코드를 작성했다. https://orkhan.gitbook.io/typeorm/docs/data-source Working with DataSource - typeorm Generally, you call initialize method of the DataSource instance on application bootstrap, and destroy it after you completely finished working with the database. In practice, if you are building a backend for your site and you..
드디어 도커 컨테이너를 활용해서 테스트코드를 작성해보자. 로컬에서 db를 비우고, 테스트하고, 다시 비우면 너무 일이 많으므로, test시도시에 컨테이너를 띄우고, 모든 테스트를 완료한 후에 컨테이너를 내리는 식으로 테스트를 진행할 것이다. 일단 docker-compose.yml을 작성해서 mySQL 컨테이너를 하나 띄워주자 version: '3' services: mySQLContainer: image: mysql container_name: mySQLContainer command: - --default-authentication-plugin=mysql_native_password - --character-set-server=utf8 - --collation-server=utf8_general_ci ..
이번에는 Worker를 썼을때와 쓰지않았을때의 성능을 직접 비교해보도록 하겠다. 단순 노가다 작업을 비교해볼 것이다. 1부터 100억까지 더하기 1부터 100억까지 더하면 js Number타입의 안전한 범위인 2^53-1(9007199254740991)을 넘어서므로, 값보다는 시간에 초점을 맞추고 보면된다. https://jinho.dev/posts/JS-Number/ 자바스크립트에서 숫자는 어떻게 동작할까요 - Blog by Jinho Hong Intro 자바스크립트에서 number 를 사용하는 것은 매우 익숙합니다. Javascript 개발자라면 하루에도 수십번, 아니 수백번씩 자연스럽게 number 연산을 사용할 것 입니다. 하지만 과연 number 연산의 내부 jinho.dev 그냥 반복문으로 더..
Worker Nodejs는 하나의 프로세스, 하나의 스레드, 하나의 이벤트루프에 의해 실행된다. 즉, 하나의 코드이고, 하나의 실행이 되는 것이다. Node.js코드는 병렬로 실행되지 않는다. 이 때문에 단점이 있는데, CPU자원을 많이 사용하는 코드가 있으면 이 코드가 다른 프로세스가 실행되는걸 차단할 수도 있다. 이런 경우, Worker가 효과적이다. Worker의 목적은 I/O 작업이 아닌 CPU집약적인 작업 퍼포먼스를 향상시키는 것이다. 아래 그림과 같은 느낌이라고 한다. 메인스레드와 통신 Worker스레드는 메인스레드(멀티스레드를 사용하기전 코드들이 실행되는 곳)에서 new Worker를 통해 만들어진다. 메인스레드에서 만든 Worker에 on 형태로 이벤트를 달아서 워커스레드와 통신할 수 있다..
다들 AWS쓰다가 예상치 못하게 돈을 상납한 경험이 있을 것이다. 일 이천원이면 괜찮은데 이러면 정말 마음이 아프다. 그래서 준비했다. AWS Budgets 설정하기 AWS Budgets 홈으로 가보자 예산 생성을 눌러보자 프리티어 요금제 놀랍게도 제로 지출 예산을 지원한다! 이메일 수신자에 연락받을 메일을 입력하면, 지출이 생기는 경우 바로 메일이 오게된다. 10명까지 되니 관리하기가 좋다. 생성이 완료된 모습 알림 메일 비용이 발생하면 이렇게 알림이 오게 된다. 그래도 이제 우리는 언제, 어디서 내 돈이 삭제되는지는 알게되었다!