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 형태로 이벤트를 달아서 워커스레드와 통신할 수 있다..
도커의 동작원리 컨테이너 내부 ⇒ 리눅스 OS비슷한 무언가 들어있음(커널이 아닌 주변부) OS의 역할 사람이 내린 명령을 하드웨어가 알아먹을 수 있는 언어로 번역하여 전달함 OS의 구조 커널부+ 주변부 로 구성 하드웨어 ↔ 커널 ↔ 주변부분 ↔ 소프트웨어 하드웨어 ↔ 커널 ↔ 도커 엔진 ↔ 주변부분 ↔ 소프트웨어 도커 엔진이 주변 부분의 프로그램 명령을 전달받아서 커널에 전달하는 구조 컨테이너에 리눅스 커널 외의 주변 부가 들어 있기 때문에, 도커는 기본적으로 리눅스 운영체제에서만 동작함 ⇒ Window, mac용 SW가 안돌아감 아니 그러면 윈도우는 못써요? virtual Box나 VM Ware같은 가상환경에 리눅스 환경울 설치하고 도커실행 or 윈도우용 도커 데스크톱처럼 필요한 리눅스 운영체제를 포함..