본문 바로가기

IT

(8)
Node.js의 동작 원리를 알아보자 (+ 이벤트 루프, libuv, 스레드 풀) 앞서 "왜 자바스크립트가 싱글 스레드이고, 어떻게 논블로킹 I/O를 지원하는지" 알아 보았습니다. 오래 걸리는 작업은 웹 브라우저에 위임하는게 핵심 이었는데요, 과연 서버용 JS 환경인 node.js에서는 어떻게 동작할까요? 이번 포스팅에서 좀더 자세하게 알아보도록 하겠습니다. 이벤트 루프(Event Loop)란? 간단하게 이벤트 루프에 대해서 알아보겠습니다. 자바스크립트는 여러 이유 때문에 싱글 스레드 언어로 기획되었습니다. 그래서 하나의 콜 스택만 가지고, 한번에 하나의 작업 밖에 수행하지 못합니다. 그래서 자바스크립트는 웹 브라우저에 긴 I/O 작업(네트워크, 타이머 등)을 위임합니다. 웹 브라우저가 백그라운드에서 작업을 수행하고, 다시 콜 스택에 불러오는 것이죠. 자바스크립트는 이벤트 루프(Eve..
함수형 프로그래밍이란? (Functional Programing) 함수형 프로그래밍은 저번 포스팅에서 설명했던 선언형 프로그래밍에 속하며, 말 그대로 순수 함수를 조합해 프로그램을 만듭니다. 함수형 프로그래밍의 특징을 요약하자면 다음과 같습니다. 부수 효과가 없는 순수 함수를 1급 객체로 간주하여 파라미터나 반환값으로 사용할 수 있으며, 참조 투명성을 지킬 수 있다. 과연 이게 어떤 뜻일까요? 모르는 개념들을 하나씩 짚어 보면서 설명해 보겠습니다. 부수 효과(Side Effect)가 없는 순수 함수(Pure Function)란? 부수 효과를 발생하는 함수 부수 효과의 영단어인 Side Effect의 뜻은 "부작용"입니다. 즉, 부수 효과가 있는 함수는 프로그램에 "부작용"을 일으켜 원래의 목적과 다른 결과를 만듭니다. 간단한 예시를 들어 보겠습니다. let numbe..
명령형 vs 선언형 프로그래밍 학습 도중 "선언형 프로그래밍은 이해하기 쉬운 코드"를 만들어 준다는 이야기를 많이 들었습니다. 객체 지향 프로그래밍(OOP)은 들어본 적 있는데, 대체 어떤 프로그래밍 기법이기에? 라는 관심이 들어 한번 정리해보고자 합니다. 명령형 프로그래밍(Imparative Programming) 명령형 프로그래밍이란? 프로그래머가 무엇을(What)할지 보다, "어떻게(How) 할 것인지를 표현"하는 프로그래밍 패러다임입니다. 개념만 봐서는 그리 와닿지 않지만, 사실 우리가 지금까지 알던 방식이 이 명령형 프로그래밍과 유사합니다. 소위 절차 지향, 객체 지향 기법이 명령형 프로그래밍 패러다임에 속합니다. 절차 지향(PP) 프로그래밍: 수행해야할 작업을 "순차적"으로 작성하는 프로그래밍 패러다임입니다. (C언어 등)..
자바스크립트는 왜 싱글 스레드이고, 어떻게 비동기 처리가 가능할까? (+ Event Loop에 대하여) 이전 글에서 간단하게 I/O 블로킹과 동기, 비동기 개념에 대해 알아 봤습니다. 저번 포스팅을 보고 온 사람은 "비동기와 논블로킹 I/O을 위해서는 당연히 멀티 스레드를 사용해야 하는 것 아니야?" 라는 의문이 들 것입니다. 하지만 자바스크립트는 싱글 스레드 논블로킹 I/O 기반 언어입니다. 오늘은 왜 자바스크립트는 싱글 스레드로 동작하고, 어떻게 논블로킹 I/O를 만족하는지 알아 보겠습니다. 멀티스레드 프로그래밍의 문제 동시성이란? 동시성이란 여러 작업이 동시에 실행되는 것 같이 보이는 것을 말합니다. (동시성 vs 병렬성 참고) 동시성 덕분에 우리가 웹 브라우저에 유튜브를 보면서, 댓글을 달거나 추천 영상을 찾아볼 수 있는 것이죠. 멀티스레드 프로그래밍의 동시성 문제 동시성 방식은 여러 스레드가 각..
nest.js와 PrismaORM 트랜잭션 여행기 #2 Transactional 데코레이터로 횡적 관심사를 분리해보자 들어가기에 앞서 이번 포스팅은 아래 자료를 참고해, 직접 적용해보며 재구성한 글임을 밝힙니다. 좋은 자료 감사합니다! NestJS 환경에 맞는 Custom Decorator 만들기 (toss.tech) Handling Transactions (feat. NestJS, TypeORM) (velog.io) [NestJS 밋업] Shall We NestJS? (youtube.com) 현재의 문제 상황 async writePost(postDto: WritePostDto, userUuid: string) { ... DTO 검증 및 변환 작업들 return this.prisma.beginTransaction(async () => { const summary = await this.summaryService.summ..
I/O 블로킹/논블로킹과 비동기/동기에 대해 정리해보자 개발이나 공부를 하시면서 I/O 블로킹, 비동기(Asynchronous)에 대해서 많이 들어보셨을 겁니다. 특히 자바스크립트 등의 싱글 스레드 언어를 공부하다 보면, "자바스크립트는 싱글 쓰레드 언어이지만, Non-Blocking I/O 비동기 처리가 가능하다"라는 말이 나오는데요. 저 또한 처음 들었을 때 위 짤(...)처럼 전혀 이해하지 못했는데요! 그래서 먼저 I/O 작업이 무엇인지? Blocking I/O와 Non-Blocking이 무엇인지? 동기와 비동기가 무엇인지 톺아보고 가겠습니다. I/O 작업이란? I/O는 하드웨어 기기를 사용해 입출력이 이루어지는 행위를 모두 일컫습니다. 파일을 만들거나 읽는 작업, 네트워크를 따라 정보를 주고받는 작업 등이 될 수 있겠죠. 일반적으로 I/O 작업은 CP..
nest.js와 PrismaORM 트랜잭션 여행기 #1 AsyncLocalStorage로 트랜잭션을 전파해보자 nest.js 프레임워크와 PrismaORM을 사용해 개발하고 있던 중, 트랜잭션 전파 문제를 AsyncLocalStorage를 사용해 해결한 경험을 공유하고자 합니다. 이 글을 이해하기 위해서, 먼저 아래 글을 읽고 와주시면 감사하겠습니다. Layered Architecture에 대해서 Single-Thread Server VS Multi-Thread Server 비동기 리소스 (async resources)와 비동기 훅 (async hooks) 이해하기 트랜잭션을 파라미터로 전달하면 강한 결합도가 생겨 버려요.. 글귀 및 사진 블록으로 이루어진 게시글 서비스를 개발하고 있습니다. 게시글 구조가 복잡해 아래와 같이 Layered Architecture 구조를 사용헸습니다. Repository는 직접 P..
프론트엔드 성능이 중요한 이유와 개선 방법 6월 22일(목) Devocean에서 진행한 "웹 프론트엔드 성능 최적화 방법 및 적용 사례" 세미나의 발표 내용을 기반으로 작성된 글입니다. 오늘 포스팅에서는 크게 두 목차를 다루겠습니다. 왜 프론트엔드 성능이 중요한가? 어떻게 프론트엔드 성능을 개선하는가? 왜 프론트엔드 성능이 중요한가? 속도가 느리면 유저는 이탈하기 마련 누구라도 긴 로딩이 꺼려지는 법 입니다. 실제로 한국의 경우 로딩이 2초만 걸려도 사람들이 이탈하죠. 실제로 Tokopedia라는 서비스가 로딩 시간을 3.78s에서 1.72s로 개선하니, 유저 평균 체류 시간이 15%, 세션 유지 시간은 23%나 늘었습니다. 그래서 서비스 속도를 빠르게 하는 것이, 유저 이탈을 막는 지름길이라 말할 수 있습니다. 그렇다면, 속도의 정의가 무엇이지..