Mission #3: racing car 시작하며

이현정·2022년 7월 21일
0

이번 Mission #3 에서는...

https://edu.nextstep.camp/s/M4ILAt8c/lt/FXBmba3y

본격적인 E2E 테스트가 시작되는 듯하다.

앞서 e2e 테스트가 무엇인지에 대해 공부했었다. (1차 회고에서 정리한 테스트의 종류 복습하기)

그외 테스트에 관해 개념을 좀 더 다질 수 있는 질문들이 있었다.

TEST 더 파기

비용 대비 효과가 충분한가?

라는 새로운 질문이 등장했다.

  • 테스트를 작성하는 비용에 비해 얻을 수 있는 효과가 더 큰가가 중요
  • 로직이 거의 없는(trivial) 코드는 따로 테스트하지 않아도 됨
    • 동어 반복적인 테스트를 피하자
  • 테스트 범위에 대한 조절이 필요 (단위 테스트 vs 통합 테스트 vs E2E 테스트)
    - 모든 모듈에 대해 단위 테스트를 작성하는 것은 비효율적
    • 모든 테스트 케이스를 E2E 테스트로만 검증하는 것도

커버리지

라는 개념이 등장했다.

  • 커버리지 100%를 목표로 하는 것은 비효율적
  • 라이브러리 등은 100% 커버리지 가능
  • 복잡한 어플리케이션의 경우 적절한 선을 잘 찾는 것이 중요

TDD

🟩 학습 목표: 클린코드로 나아가기 위한 리팩터링 기준점을 스스로 만들어 나갈 수 있다.

3대 원칙 - 로버트 C. 마틴 (밥 아저씨, 클린 코더)

  • 실패할 테스트를 작성하기 전에는 아무런 프로덕션 코드도 작성하지 않는다.
  • 실패할 테스트 말고는 작성하지 않는다.
  • 현재 실패한 테스트를 만족시키는 코드 외에는 작성하지 않는다.

좋은 테스트의 조건

  • 실행 속도가 빨라야 함.
  • 내부 구현(테스트하지 않는 부분)을 변경했다고 해서 테스트가 실패하면 안된다. 인터페이스(입출력 위주)를 중심으로 작성.
  • 버그를 찾을 수 있어야 한다. 만들었다고 끝이 아님 테스트 시나리오를 잘 설정해야 함.
  • 테스트 결과에 일관성이 있어야 한다. 코드가 변하지 않았다면 테스트 결과는 항상 동일 해야 한다.
  • 의도가 명확히 드러나야 한다.

BDD

https://edu.nextstep.camp/s/M4ILAt8c/ls/wWvplDXz

글을 읽고 느낀 점
=> 지금 내가 작성하는 테스트는 BDD에 가깝지 않나.
=> 진짜 그냥 TDD 는 어떤 형태일지 궁금.

여기서부터는 자동차 게임경주를 위한 자스 기본 개념들이다.

자바스크립트 더 파기

Closure

🟩❌ 학습 목표:
클로저에 대해 설명할 수 있다.

이라는 새로운 개념이 등장했다.
이 글을 읽고 나서

  • what is Closure?
  • 클로저는 어떤 함수에서 선언한 변수를 참조하는 내부함수에서만 발생하는 현상
  • what is Lexical Scope?
    • 자바스크립트는 함수를 어디서 호출했는 지가 아니라 어디서 정의했는지에 따라 스코프를 결정한다. 이를 정적 스코프(Lexical Scope) 라고 한다. (그럼 반대로 어디서 호출했는지로 정의되는 건 동적 스코프 라고 하겠네? 확인해보자.)
  • when closure is needed/used? Can you explain with an example?

에 대답할 수 있게 되었다.

  • 궁금점:
    const increase = (function () {
    let counter = 0
    return function () {
    return ++counter
    }
    })()

console.log(increase()) // 1
console.log(increase()) // 2
console.log(increase()) // 3

=> 왜 즉시 실행함수...? increase 를 함수가 아니라 함수를 할당받는 변수로 만듬. 즉시실행함수 개념에 대한 이해가 부족한 듯하다. 잠깐 복습하고 오자 (👉)

Event Loop 🔄

🟩 학습 목표:
자바스크립트 엔진에서 이벤트가 어떤 순서로 동작하는지 알 수 있다.

  • 싱글 스레드란?
    : 한 번에 하나의 업무(task)만 처리하는 것

  • 이벤트 루프가 존재하는 이유 = 동시성:
    자바스크립트는 싱글 스레드로 작동한다. 이런 자바스크립트가 동시에 여러 태스크를 처리할 수 있도록 동시성을 부여해주는 역할.

  • 비동기 처리:
    자바스크립트의 비동기 처리란 특정 코드의 연산이 끝날 때까지 코드의 실행을 멈추지 않고 다음 코드를 먼저 실행하는 자바스크립트의 특성을 의미합니다. 동시에 여러가지 작업을 처리할 수 있고 기다리는 과정에서 다른 함수를 호출할수도 있습니다.
    비동기처리는 동시에 작업을 시작하여 먼저 완료되는 작업부터 노출.

    • javascript 가 비동기 함수를 실행하는 과정
      => 스크린샷 3~4개 찍어둔 거
    • setTimeOut(cb, 0): 0초를 찍어두고 기다리는 이유는 '스택이 비기를 기다리기 위해서' 이다.

대부분의 자바스크립트 엔진은 크게 2가지 영역으로 구분할 수 있다.
1) Memroy Heap
2) Call Stack

  • what is Memory Heap?
    객체가 저장되는 메모리 공간(memory allocation).
  • what is Call Stack?
    실행 컨텍스트가 저장되는 공간. 선입 선출. 하나에 하나씩 처리.

시간을 다루는 방법 - setTimeout, setInterval, Request Animation Frame ⏰

데모 영상을 보면
값을 입력 후 자동차가 뜨기까지 시간이 좀 걸린다. 그 후 설정한 양의 자동차들이 설정한 수 만큼의 경기를 진행하는 결과창을 보여준다. 그 후 "축하합니다" 라는 알럿이 뜬다.

핵심은 이 결과를 보여주는 함수를 '시간이 좀 걸리게' 만드는 것이다.
1) 1경기를 할 때 2경기가 싱크되고 있어야 하고,
2) 2경기를 할 때 3경기가 싱크되고 있어야 한다.
3) 알럿은 모든 경기가 끝난 후 약 2초후에 뜨도록 해야한다.

모두 시간을 다루는 비동기 함수와 관련이 있다.

🟩 학습 목표 :

  • 자바스크립트 특정 코드를 일정 시간 이후에 실행할 수 있다.
  • 자바스크립트에서 특정 코드를 일정 시간 마다 반복적으로 실행할 수 있다.
  • 시간은 다루는 api를 테스트할 수 있다.

일정 시간이 지난 후에 원하는 함수를 예약 실행(호출)할 수 있게 하는 것을 '호출 스케줄링(scheduling a call)'이라고 합니다. 호출 스케줄링을 구현하는 방법은 세 가지가 있습니다.

setTimeout을 이용해 일정 시간이 지난 후에 함수를 실행하는 방법
setInterval을 이용해 일정 시간 간격을 두고 함수를 실행하는 방법
requestAnimationFrame을 이용해 브라우저에 최적화된 방법으로 함수를 실행하는 방법

setTimeout
setInterval
Request Animation Frame

Reference

JavaScript 동기, 비동기처리와 콜백 함수 | kkhcode

What the heck is the event loop anyway? | Philip Roberts | JSConf EU
이벤트 루프란 (a.k.a. 자바사크립트가 비동기 함수를 실행시키는 방법) 00:00~21:00

V8 엔진은 어떻게 내 코드를 실행하는 걸까? | Evan Moon

TODO

What the heck is the event loop anyway? | Philip Roberts | JSConf EU
21분부터 공부하기 (feat. repaint 공부)

0개의 댓글