Backend

    NodeJS서버에선 절대 이벤트 루프를 막지마. (feat. readFileSync)

    NodeJS서버에선 절대 이벤트 루프를 막지마. (feat. readFileSync)

    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..

    FCM으로 푸시알림 전송하기 (Next)

    FCM으로 푸시알림 전송하기 (Next)

    왜 도입하게 되었나 블로그 피드를 만들긴 했으나, 블로그 글이 올라왔을때, 알림이 오게 하고 싶었다. 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..

    github actions로 배포시 단위, 통합테스트 자동화 환경 구성하기

    github actions로 배포시 단위, 통합테스트 자동화 환경 구성하기

    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 위 글에서 이어진다. 문제 현재 유닛 테스트, 통합테스트는 로컬 환경에서만 가능하다. 이걸 배포시에 자동으로 테스트한뒤 배포해보자(배포구성은 이미 되어있음) 유닛테스트,..

    이번에야말로 Mocking을 해보자

    이번에야말로 Mocking을 해보자

    이번에야말로 모킹을 통해 유닛테스트를 작성해보자. 왜 필요한가? 솔직히 이걸 제대로 이해하지 못해서 계속 모킹이라는 것을 이해하지 못했던 것 같다. 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..

    Docker compose로 테스트 코드 환경 구성하기(express + TypeORM) - typeORM, Jest 설정

    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 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..

    Docker compose로 테스트 코드 환경 구성하기(express + TypeORM) - dockerCompose 설정

    Docker compose로 테스트 코드 환경 구성하기(express + TypeORM) - dockerCompose 설정

    드디어 도커 컨테이너를 활용해서 테스트코드를 작성해보자. 로컬에서 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 ..

    NodeJS : Worker - 1부터 100억까지 더하기로 성능 비교해보기

    NodeJS : Worker - 1부터 100억까지 더하기로 성능 비교해보기

    이번에는 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 그냥 반복문으로 더..