책(200)
-
[any 43] 몽키 패치 방지
1. 몽키 패치 몽키 패치란 런타임 환경에서 프로그램의 특정 기능을 수정하여 사용하는 기법을 말한다. 자바스크립트의 문제는 지나치게 유연해서 객체나 클래스에 임의의 속성을 추가할 수 있다는 것이다. 예를 들어, 이는 window나 document에 값을 할당해 전역 변수를 만들거나 더 심한 경우 내장 기능의 프로토타입에 프로퍼티를 추가할 수도 있다. window.monkey = 'ㅋㅋㅋ이게되네'; RegExp.prototype.monkey = '아니 어디까지 되는거야ㅋㅋㅋ'; 이렇게 만들면 프로그램 전체에 의존성을 만들면서 부작용을 미치는데, 여기에 타입스크립트를 끼얹으면 문제가 더 커진다. 예를 들어 타입 체커는 window의 내장 속성에 대해선 알고 있지만, 임의로 추가한 속성에 대해서는 알지 못하기..
2022.07.29 -
[any 42] 값의 타입을 모를땐 any대신 unknown
1. any, unknown, never 할당 가능성의 관점에서 any, unknown, never타입을 다시 생각해보면 아래 특징을 갖는다. 구분 특징 any 어떠한 타입이든 any 타입에 할당 가능 any 타입은 어떠한 타입에도 할당 가능(never제외) unknown 어떠한 타입이든 unknown에 할당 가능 unknown은 오직 unknown과 any에만 할당 가능 never 어떠한 타입도 never에 할당 불가 never는 어떠한 타입에도 할당 가능 타입을 할당 가능한 값의 집합으로 볼 때, 한 집합이 다른 집합의 부분집합이면서 동시에 상위 집합이 될 수 없다. 때문에 any가 강력하면서 동시에 문제를 일으키는 원인이 되는 것이다. 반면 unknown은 any대신 쓸 수 있는 안전한 타입이다. ..
2022.07.29 -
[5.1] 복합인덱스
1. 복합 인덱스 실제 상당수의 쿼리는 두 개 이상의 키를 기반으로 이뤄진다. 따라서 인덱스 또한 두 개 이상의 키를 기반으로 작성하는 경우가 많다. 단, 이전 장에서도 설명했듯 필드를 배치하는 순서에 따라 정렬의 효과가 달라질 수 있다. 따라서 인덱스 생성 당시 필드를 적절하게 배치하지 않거나, 의도대로 쿼리문을 작성하지 않는다면 별 도움이 안 될 수도 있다. 복합 인덱스를 만들면 내부적으로 키의 순서와 정렬에 맞춰 아래와 같은 형태로 저장된다. 각 인덱스 항목은 나이와 사용자명을 포함하면서 레코드 식별자record identifier를 가리킨다. 레코드 식별자는 내부에서 스토리지 엔진에 의해 사용, 도큐먼트 데이터를 찾는다. 아래와 같은 방식으로 1000명쯤 있다고 쳐보자 > db.users { "u..
2022.07.28 -
[5.1] 인덱스
1. 인덱스 인덱스란 효율적인 쿼리를 위한 특수한 데이터 구조체(special data structures)다. 인덱스는 컬렉션內 데이터 셋의 일부를 순회하기 쉬운 형태로 저장해두는데, 특정 필드값이나 필드들의 집합을 정렬하여 저장해둔다. 이렇게 정렬된 인덱스 항목들은 이후 완전 일치 쿼리문이나 범위 일치 쿼리문을 빠르게 수행할 수 있도록 도와준다. 또한, 이미 정렬돼있는 상태이므로 정렬이 필요한 쿼리문을 빠르게 수행할 수 있다. 근본적으론 몽고 DB의 인덱스도 여느 DB시스템의 인덱스와 유사하다. 단지 몽고 DB는 인덱스를 컬렉션 레벨에서 정의하고, 도큐먼트의 어떤 필드(하위 필드까지도)에도 사용할 수 있다. 가. Collection scan 인덱스를 사용하지 않는 쿼리를 말하며, 컬렉션內 모든 도큐먼..
2022.07.28 -
[any 41] any 타입의 진화(evolve)
1. any 진화 진화란 말이 뭔가 거창해보일 수 있는데, 변수의 타입이 암시적 any 타입에 어떤 값을 할당하면 해당 값으로부터 타입을 추론해 타입이 변하는 일을 말한다. any any[ ]타입이나 초기값딩 null인 경우도 any의 진화가 발생한다. Type narrowing과는 다른 개념으로, noImplicitAny이 설정된 상태에서만 일어난다. 1) 변수 any타입의 진화 let val; // any val = /hello/; //RegExp val = 12; // number 2) if나 try..catch문에서도 쉽게 보인다 if (Math.random() < 0.5) { val = /hello/ } else { val = 12 } // val : number | RegExp 3) 변수 an..
2022.07.28 -
[any 40] 함수 안으로 타입 단언문 감추기
함수를 만들다 보면 매개변수와 반환 타입은 간단한데 내부 로직이 더럽게 복잡해서 안전한 타입 구현이 어려운 경우가 꽤 많다. 물론 함수 구석구석을 안전한 타입으로 구현하는 것이 이상적이지만, 불필요한 예외 상황까지 고려하며 힘들게 타입 정보를 구성할 필요는 없다. 차라리 함수 내부는 타입 단언문을 쓰고, 외부로 드러나는 부분만 명시하는 방법도 나쁘지 않다. 1. 타입 단언문 숨기기 아래 예시는 타입 단언문을 함수 안으로 숨긴 예제이다. 함수타입인 T 타입의 매개변수로 받아서 T 타입의 함수를 반환한다 그런데 코드를 짜놓고보니 TS가 return하는 function의 타입을 잘 추론해놔서 T와 타입이 맞지 않는다 근데 코드를 짠 나는 어차피 T 타입을 받아서 T 타입을 뱉어낼 걸 알기에 그냥 내부에 타입 ..
2022.07.28