이번주는 짧게 타입스크립트를 배워보는 시간을 가졌다. 타입스크립트를 배워보기에 앞서 비동기 처리에 대해서 다시 복습하고 node.js를 맛보았다.
* 스레드 = 일하는 사람
싱글 스레드
= 일하는 사람 1명
한 사람이 주어진 작업을 하나씩 처리하는 방식
경쟁 상태가 없음 멀티 스레드 대비 코드 복잡도가 낮음 -> 문제 발생을 항시 대비해야함
여러 명이서 일하는 병렬처리보다는 평균적으로 성능이 떨어짐
멀티 스레드
= 일하는 사람이 여러 명
여러 사람이 작업을 처리하는 방식
평균적으로 싱글스레드보다 성능이 매우 좋음
사용시 경쟁 상태를 고려해야함 코드 복잡도가 높음
blocking
과non-blocking
blocking
: 하나의 작업이 마치고 나서 다음 작업을 실행하는 순차적 실행 방식.
작업이 길어지면 다음 작업이 지연이 되는 문제
자바스크립트 세계에서는 동기(synchronous)라는 단어와도 혼용
non-blocking
: 하나의 작업을 실행시키고 그 작업이 끝나지 않아도 다음 작업을 실행하는 실행 방식. "작업을 실행 시켜 놓기만 하는 행위"
작업이 길어져도 다음 작업이 지연이 되는 문제가 없음
보통 결과값을 return문으로 리턴을 바로 받지 못하며 콜백 함수를 통해 받는 경우가 많음(Promise의 등장으로 then으로 받기 시작)
자바스크립트는 non-blocking 방식을 지원함으로써 일정 수준의 동시성을 보여줌
자바스크립트는 싱글스레드이지만 위임을 함으로써 병렬 처리를 한다.
- 자바스크립트 실행 환경의 구조와 각 구성요소의 역할
자바스크립트 엔진 + 이벤트 루프 + 큐 + 외부 API
자바스크립트 엔진
: 자바스크립트 코드를 읽어서 해석하고 작업을 수행하는 역할. 엔진 자체는 작업을 수행만 할 뿐 비동기/동기와는 관계가 없음
이벤트 루프 / 큐 : 비동기 작업을 위한 중심적인 역할
큐
: 비동기 작업을 마친 후 실행될 콜백 함수가 쌓이는 곳
Task Queue(MacroTask Queue)
,MicroTask Queue
큐가 여러개인 이유 -> 우선 순위에 따라 큐가 나뉨 (프로미스가 우선순위가 제일 높음)
이벤트 루프
: 큐에 쌓인 콜백함수들을 꺼내서 자바스크립트 엔진에세 전달해주는 역할
외부 API
: 비동기/동기 작업들의 묶음. 비동기 작업 실행은 대부분 외부 API를 통해 일어난다.
자바스크립트는 외부 API를 사용해서 비동기 작업을 수행(위임)하며 작업이 마쳤을 때 실행되는 콜백 함수를 대부분 해당 API 매개변수로 전달한다. 작업이 완료되면 큐에 콜백 함수를 등록한다.
- 자바스크립트의 비동기 작업 수행 방식
콜백함수
-> 콜백 지옥
비동기 작업의 완료 여부를 반환하는 방식으로 콜백 패턴을 사용
JS는 함수를 일급 객체로 취급했기 때문에 콜백 패턴이 사용 가능했음
Promise
-> then 체이닝이 길어지면 DX 저하
콜백 지옥을 벗어나기 위함. 비동기 함수를 일관성 있는 형식으로 관리(then
,catch
,finally
)
비동기 함수들을 순차적으로 연결해주는 then, 비동기 함수에서 에러 처리를 해주는 catch
DX 향상: 코드 가독성,chaining
Promise.all
,Promise.allSettled
,Promise.any
,Promise.race
async/await
비동기 코드를 동기 코드처럼. 가독성 향상, 익숙하지 않은 사람들도 읽기 쉬움, 코드 흐름 보기 쉬움, 많은 사람들이 익숙한 문법
* 오늘날의 자바스크립트는 멀티스레드를 지원한다.(worker thread)
- server-side 자바스크립트의 문을 연 Node.js
Web 2.0 시대에 들어서면서 양방향 통신이 가능해지면서 자바스크립트의 중요도가 상승했다.
Chrome의V8엔진
-> 오픈 소스로 만들어진 엔진
2009년에 Ryan Dahl에 의해서 Node.js가 출시됨. V8 엔진과 libuv 그리고 Node bindings로 이루어진 자바스크립트 런타임
여태 런타임 과는 다르게 비동기 실행 방식을 기본적으로 지원하여 IO관련 작업 시 최고의 성능을 보여줌- Node.js 구성
V8엔진 + libuv(이벤트 루프) + Node.js 기본 라이브러리(js,C/C++기반)
libuv
: C로 작성된 이벤트 루프, 비동기 작업이 마친 후 실행되는 콜백 함수들을 각종 큐에서 우선순위에 맞게 꺼내와서 자바스크립트 엔진에게 전달해준다. 싱글스레드로 작동한다. Node.js를 위해 개발되었지만 현재는 다른 언어들도 사용한다.
Node.js 기본 라이브러리
: 브라우저가 아닌 일반 머신 환경에서 실행되기 때문에 브라우저의 Web API와는 다른 라이브러리들이 포함되어 있음
ex) fa, path, crypto, Stream, zilb, child_process, EventEmitter
전체적인 프로젝트 관리를 위한패키지 매니저
, 그리고 개발한 모듈을 다른 개발자가 사용할 수 있도록 올려놓을 수 있는 공간인npm registry
타입스크립트 수업을 시작했다. 자바스크립트의 문법을 이어가면서 타입에 더 까다로운 언어였다. 객체 지향 언어이기 때문에 자바에서 많이 보던 키워드들이 보였다. 그래서 자바와 정말 비슷하다는 생각도 많이 들었던 것 같다. 자바를 배울 때 많이 어려워했던 기억이 있는 데 역시나 타입스크립트도 쉽지 않았다. 짧은 시간 동안 압축해서 맛보기 정도로 배웠기 때문에 더 어렵게 느껴지는 것 같기도 하다.
- 동적 타입: 코드가 실행되면서 변수의 타입이 정해짐, 컴파일 단계 없이 바로 코드를 실행
- 정적 타입: 코드에 타입을 명시적으로 표현하여 코드가 실행되기 전에 타입이 정해짐, 컴파일 단계에서 에러를 찾을 수 있음, 컴파일 과정으로 반드시 거쳐야하지만 에러를 미리 방지할 수 있다는 점이 장점
- 인터프리터/스크립트 언어: 일련의 작업만을 수행하도록 하는 코드를 빠르게 작성하는 데에 집중되어 있음. 일반적인 컴파일 언어보다는 기능도 적고 제한도 적음. 소규모 프로젝트에 많이 사용 (JavaScript, Python, Ruby)
- 컴파일 언어: 복잡한 로직을 갖는 시스템을 위해 만들어진 언어. 기본 기능도 많을 뿐만 아니라 엄격한 규칙을 가지고 있음. 중-대규모 프로젝트에 많이 사용 (C, C++, Java)
- 일반적인 개발 과정: 코드추가/수정 - 컴파일 - 커밋 - 코드리뷰 - 빌드 -배포
- 버그를 늦게 발견할 수록 처리 비용이 기하 급수적으로 늘어남. 즉, 코드 수정/개발단에서 조금 더 엄격하게 작업을 하여 미리 버그 예방.
- tsc: 타입스크립트 전용 컴파일러
- tsconfig.json: TypeScript 컴파일러를 튜닝하기 위한 설정 파일
- 타입스크립트 타입:
String
,Number
,Boolean
,Null
,Undefined
,Array
,Object
,symbol
,Tuple
,Enum
,Any
,unknown
,Void
,Never
- 타입 표기는 클론(
:
)을 사용객체 지향 프로그래밍(OOP)
, 강한 응집력 과 약한 결합력클래스(Class)
- 접근제어자:
public
|protected
|private
getters & setters
|readonly
|static
추상클래스
abstract
(직접 인스턴스화 불가)인터페이스(Interface)
(abstract 사용 불가, 직접 인스턴스를 생성할 수 없고 모든 메소드가 추상 메소드)Optional
Properties (?
)Readonly
properties제네릭(Generic)
: 함수, 인터페이스, 클래스에 재사용성을 부여Union type
: 여러 개의 타입 선언 (|
)- 제약조건 (
Constraints
: 특정 타입들로만 동작 /keyof
: 두 객체를 비교)