HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
📯
부스트캠프 7기 BE 멤버쉽 설계
/
🗞️
4주차 - 비동기
🗞️

4주차 - 비동기

스프린트
[W2] Airbnb
강의날짜
Sep 28, 2022
키워드
Blocking vs Non-Blocking

무엇이든 궁금한점

🧐
마스터클래스 질의응답 모음
제목
요약
확인
Sublime text를 애용하시나요
많이 애용합니다.
확인
부스트코스에는 Non-blocking + Sync의 예시를 node js + mysql이라고 설명하고 있는데, 다른 블로그의 글을 찾아보면 blocking-Async의 대표적 예시가 node js 와 mysql이라는 글이 보여서 혼동됩니다.
blocking + async 방식이 맞습니다.
확인
ORM이 여러종류가 있던데 협업할때 다른사람이 내가 모르는 ORM 쓰면 새로 공부해야하는일이 많을까요?
보통 JPA를 많이 씀,js에서는 TypeORM을 쓰지만 유지보수를 하지 않고 있음
확인
테스트 코드는 무엇들을 테스트해야할까요?
비지니스 로직,복잡한 연산을 수행하는 경우
확인
실무에서도 ORM을 자주 사용하나요
무척 자주 쓰지만 정말 복잡한 데이터를 다루는 경우에는 QueryBuilder를 씁니다.
확인
마스터님께서는 이번 백엔드 구조설계로 나온 여러가지 구조 중, 어떤 백엔드 구조를 선호하시나요?
다 골고루 섞어 쓰는 편입니다.,Layered는 항상 쓰는 편
확인
오류 처리는 각 로직별로 하는 것이 좋나요 아니면 최상단 로직에 던져주고 거기서 하는 것이 더 좋나요?
에러를 어떻게 관리할 것인가로 접근하면 좋습니다.
확인
웹 관련한 보안들은 직접 다 해결하나요? 관련 전문가 분이 계신가요?
스타트업 빼고 보통 전문가가 있습니다
확인
TDD 하시나요..?
Test는 필요한데 TDD까지는 잘 모르겠다.
확인
시간관리 어떻게 하시나요?
큰 덩어리의 계획을 세우고 환경을 만드는 편
확인
 

들어가기전 (그냥 설명하고 싶었음)

Javascript 개발 파이프라인

  • Code → Transpiler → Packaging → CI → Deploy
  • Code: ES3.1, 5, 6, TypeScript, Kotlin, …
  • Transpiler: tsc, kotlinc, babel, …
  • Packaging(bundle): webpack, rollup, vite
 

Java 개발 파이프라인

  • Code → Compile → JAR/WAR → JVM
  • Java도 client-side에서 사용됨
    • 안드로이드
 

Kotlin

  • server-side
  • client-side
    • 안드로이드
    • 웹(kotlin-js)
  • 어떤 차이가 있을까?
    • 참고포스트
    • JVM(Java Virtual Machine)
      • notion image
    • DVM(Dalvik Virtual Machine)
      • notion image
    • ART(Andriod Runtime)
      • notion image
 

program & timing

Language code → Machine(가상머신일 가능성이 높음) language → File → Load → Run → Terminate
  • 프로그램은 보통 Load → Run → Terminate → Load … 의 과정의 반복
  • 유지보수란?
    • Language code → File 까지 가는 과정
  • 개발의 목표
    • 시간(비용)을 줄이는 것 = 만들어진 코드를 얼마나 안건드리고 더 많은 기능이나 수정에 대응할 수 있을까?
    • 변화에 대응하는 여파를 최소화시켜서 수정할 파일을 적게 만드는 것!
  • 코드의 설계가 잘 됐는지 따져보기
    • 수정사항을 반영하는 과정에서 몇 개의 파일이 수정 되었는가
    • 자동화를 얼마나 많이 해놨는가
    • 코드의 격리를 얼마나 잘 해놨는가
      • Layered Architecture
 

 
 
 
 
 

병렬성(Parallelism) vs 동시성(Concurrency)

  • 어떤 차이가 있을까요? 일단 고민해보기
    • 정답
      동시성은 “동시에 일어나는 것 처럼” 보이게 하는 것
      병렬성은 “동시에 일어나는 것”
  • 싱글 스레드 → 동시성
  • 멀티 스레드 → 병렬성
    • 정확히는 멀티코어
 

병렬성

  • 병렬 처리의 문제
    • 메모리를 공유한다.
    • 공유하는 메모리에 대해 한번에 하나의 프로세서만 사용할 수 있도록 blocking을 유발한다.
  • blocking된 대상 프로세서는 어떤 행동을 할까?
    • 좌절(그대로 접근을 포기)
    • 탈취(메모리 점유하는 프로세서부터 권한을 강제로 넘겨받음)
    • 대기 (자바의 Object.wait() 등)
  • 화장실이라는 공유 공간 (메모리)
    • 얼만큼의 영역을 통제할 것 인가
    • 화장실이라는 영역 자체에 Lock을 걸 것인가
    • 화장실의 각각의 칸에 Lock을 걸 것인가
 

자바스크립트

  • 병렬성 처리: 백그라운드에서 발생하는 작업은 멀티 쓰레드로 해결
    • GPU를 사용하는 DOM event
    • timer(setTmeout, setInterval)
    • postmessage API
    • 네트워크 통신 작업
    • 파일 I/O
    • 주로 메모리 영향이 없는 작업들
  • 동시성 처리: 이벤트 루프는 메인 쓰레드(싱글 쓰레드)로 해결
    • 위에서 언급한 것들(GPU 사용 작업, Timer, Networking 등)은 멀티 쓰레드로 실행되지만, 결국 이들을 실행하는 코드는 이벤트 루프에 올라감 → 싱글스레드로 처리됨
 

sync와 async

  • 3개를 요청했는데
    • 응답에서 그 순서가 지켜진다면 Sync
    • 어떤 게 먼저 올지 모른다면 Async
  • async + blocking
    • 세 번째에 보낸 요청이 먼저 올 수도 있는데, 첫 번째 요청을 보낸 다음에 block을 해버린다?
  • Promise.all
  • Promise.allSettled
 

재밌는 비유

  • https://musma.github.io/2019/04/17/blocking-and-synchronous.html
  • 가정을 추가해보자
    • 대표님이 1명, 직원이 10명
    • 대표님이 2명, 직원이 20명
    • 대표님이 10명, 직원이 100명
    • 대표님이 1명, 직원이 100명
 

NodeJS와 Database

  • NodeJS가 MySQL에게 요청을 보내면 MySQL이 제어권을 넘겨주지 않음
    • 정확히는 MySQL Client (Driver) 가 Blocking 방식으로 동작함
  • Java + MySQL로 된 (Blocking + Sync) API를 NodeJS에서 호출한다면?
    • Non-Blocking + Async 로 동작 가능
  • 브라우저는 Client이다.
  • NodeJS도 쓰기에 따라선 Client가 되기도 하고, Server가 되기도 한다.
    • 호출하는 입장이면 Client
    • 호출에 대한 응답을 보내주는 입장이면 Server
  • NodeJS가 사용하는 Client 프로그램이 Non-Blocking으로 동작해야 효율적
    • DB의 경우 보통 NoSQL 계열이 Non-Blocking Client를 제공
 

sync

 
  • 100의 성능을 낼 수 있는 듀얼코어 vs 70의 성능을 낼 수 있는 멀티코어
    • 어떤 환경이 더 쾌적할까?
    • 우리가 만드는 프로그램에서는 어떤 환경이 더 쾌적할까?
  • 병렬처리에 대한 고민도 해보면 좋음
    • 70 + 70 + 70 + 70 인 환경에서 더 좋은 성능을 낼 수 있는 프로그램을 만들기 위해선?
 
  • 2017년도(아이폰6 vs LG G5)
  • 아이폰 vs 안드로이드
    • 아이폰
      • 메모리 1G
      • CPU 듀얼코어
      • 배터리 용량도 적었음
    • 안드로이드
      • 메모리 2G
      • CPU 멀티코어
      • 배터리 용량도 많았음
 
 

async 방식으로 만들어보기

  • 루프를 쪼갠다
  • 쪼갠 루프를 원하는 시점에 실행한다.
  • 쪼개진 루프의 다음 시작 지점을 알고 있어야 한다.
  • 루프를 실행할 때 얼만큼 실행할지 정할 수도 있지 않을까?
 

스트림

 
Promise.all([ new Promise(resolve => setTimeout(()=>{console.log(1500); resolve();}, 1500)), new Promise(resolve => setTimeout(()=>{console.log(500); resolve();}, 500)), new Promise(resolve => setTimeout(()=>{console.log(2500); resolve();}, 2500)), ]).then(() => console.log('test'))
// 연속성, 코어 100개여도 1000개여도, 1개만 쓰이지 않을까? const a = 1; const b = 2; const c = a + b; console.log(c);
// 오래 걸리는 작업, 코어 100개여도 1000개여도, 1개만 쓰이지 않을까? console.log('start'); for(i = 1; i < 1000000000; i++); console.log('end');
// 반복문을 쪼개보기 console.log('start'); for(i = 1; i < 1000000000; i++); console.log('end');
go( make(infinity), // 블록킹이 걸릴 수도 있지 않을까? map(() => i * 2), take(5) ) const list = new ArrayList()// 1000000000개의 데이터를 가진 List list.map(i => i * 2) // js라면 1000000000 번 실행 .limit(5) list.stream().map(i => i * 2) // java의 stream은 5번 실행 .limit(5) // 렌더링을 할 때 // 10만개의 데이터가 있는데 => for, map, filter, forEach를 쓰면 10만벌 실행이 됨. blocking 이 됨 // 만개의 데이터만 가져오고 싶어