(TypeScript 공부 중)
몇몇 타입스크립트 한글 온라인 핸드북으로 공부하고 있는데, 예제와 설명이 빈약해 아쉽다. ‘그러면 이러이런 경우는 어떻게 되는 거지?’하는 사이드 질문들이 너무 많이 생겨나고 끝나버리는 온라인 핸드북보다, 제공하는 정보량을 (초보자에게 맞도록) 제한하되 제공한 정보에 대해서는 추가적인 의문이 남지 않을 수 있도록 구조와 균형을 잘 잡아 써놓은 책으로 공부하고 싶다… 한 번의 예제로 이해하지 못하면 다른 예제를 찾고 그곳에 나와있는 (거의 항상 과한) 정보를 추가로 이해하고, 이전 정보와 비교하고 통합하는 데에 드는 시간과 노력이 생각보다 크다는 것을 느끼고 있다.
이를 방지하려면 처음 접한 문서에서 (최대한) 닫힌 결말로 설명을 잘 해주거나, 내 쪽에서 의문을 다 죽이고 일단 그저 따라가는 방법 뿐이다. 하지만 또 이렇게 되면 기본적으로 문서를 반복해서 읽어야 함이 전제된다. 의문이 남았던 부분들을 나중에 습득하게 된 블록으로 채우기 위해서는 말이다. 구멍난 채로 지나온 곳이 너무 많으면 어느 부분이 비었었는지 파악하기 어려워 다시 처음부터 스캔해야 하는데, 그게 또 거의 처음부터 공부하는 것과 같은 시간 비용과 심리적 거부감이 든다.
그래도 이번 기회에 딱 한 소스만 (부족한 문서더라도) 붙잡고 구멍 숭숭 난 채로 쭉 공부해보는 기회를 삼자. 더… 좋은 면이 있을 수도 있잖아..? 지상 과제는, ‘시간을 최대한 적게 들여서 블록 쌓기.’ 구멍 숭숭 난 채로 지나가게 된다 하더라도.
(참고중인 타입스크립트 핸드북 원, 투, 쓰리)
제일 위의 문서의 원조격 :
+ 참고할 만한 사이트 발견: JavaScript, ECMAScript6, Node.js, Express(Socket.IO), TypeScript 등에 대한 글들이 예쁘게 정리되어 있다.
- 가용성 = 업 타임 / (업 타임 + 다운 타임)
- 백엔드의 서버든 데이터베이스든, 고가용성을 추구한다.
- 데이터베이스의 고가용성은 이중화를 통해 구현한다.
- 이중화란 상시 대기하고 있는 DB 인스턴스가 있어서, 메인 DB 인스턴스가 다운되면 바로 교체하여 DB 서비스가 끊기지 않도록 하는 것을 말한다.
프로그래머스 MySQL 문제 풀이 - 144856
프로그래머스 MySQL 문제 풀이 - 144856
https://school.programmers.co.kr/learn/courses/30/lessons/144856
내 해답:
SELECT AUTHOR_ID, a.AUTHOR_NAME, CATEGORY, SUM(b.price * bs.sales) AS TOTAL_SALES
FROM book AS b
INNER JOIN author AS a
USING (author_id)
INNER JOIN book_sales as bs
USING (book_id)
WHERE sales_date BETWEEN '2022-01-01' AND '2022-01-31'
# WHERE bs.sales_date < '2022-02-01'
# WHERE bs.sales_date LIKE '2022-02%'
GROUP BY author_id, category
ORDER BY b.author_id ASC, b.category DESC
알게된 점:
- Date 타입에 조건을 걸 때 저렇게 LIKE를 사용하면 특정 ‘기간’을 표현할 수 있겠다!
- BETWEEN … AND … 는 양 끝점이 다 inclusive 이라는 것 주의.
- GROUP BY가 WHERE보다 나중에 와야 한다.
타입스크립트 시작 설정
타입스크립트 시작 설정
- typescript는 글로벌로 설치되어 있다는 전제 하에…
- 새 프로젝트 폴더 생성
npm init -y
로 node의 package.json 생성
tsc —init
명령어로 tsconfig.json 설정 파일 생성 후 수정하기// tsconfig.json { // include: 컴파일할 파일 경로를 설정. // "include": ["src/**/*.ts"] "compilerOptions": { "lib": ["ES2021", "dom"], // esModuleInterop 속성이 위의 코드 처럼 true로 설정될 경우, ES6 모듈 사양을 준수하여 CommonJS 모듈을 가져올 수 있게 됩니다. // e.g. typescript-test.ts => import express from "express" "esModuleInterop": true, "target": "ES2021", // outDir: 컴파일 후 생성되는 js 파일이 생성될 폴더명 "outDir": "dist", // strictNullChecks: void 타입 '변수'에 null을 사용할 수 없고 오직 undefined만 할당 가능하게 됨. "strictNullChecks": true } }
원래는 tsc → node app.js 처럼 2단계를 거쳐 실행해야 하는 것을 바꾸려면:
npm i @types/node
설치 → “console.log 등을 정의하는 패키지 ‘node’를 node_module의 @types라는 폴더에 설치하겠다”
npm i -g ts-node
설치 (npm i -D ts-node
명령어를 한 번 더 입력하면 devDependencies 항목에 ts-node를 나타내게 할 수 있음)(-D
플래그는--save-dev
과 같음)
- 이제
ts-node app.ts
로tsc
+node app.js
명령어 한 방에 실행
바뀐 점:
- ts-node test.ts 등의 명령어로 실행하면 트랜스파일된 test.js 파일은 생기지 않는다.
- 이제 tsc 명령어를 실행하면 js로 트랜스파일된 파일들은 dist 폴더에 위치하게 된다.
- tsconfig.json에서 “lib”의 ‘dom’을 지워도 console.log같은 함수에 에러가 뜨지 않는다. ← @types/node 덕분
Union 타입과 Intersection 타입
Union 타입과 Intersection 타입
Union type
: |
연산자를 이용해 타입을 여러 개 연결하는 방식
// 유니온 타입 예시
function getAge(age: number | string) {
if (typeof age === 'number') {
age.toFixed(); // 정상 동작, age의 타입이 `number`로 추론되기 때문에 숫자 관련된 API를 쉽게 자동완성 할 수 있다.
return age;
}
if (typeof age === 'string') {
return age;
}
console.log(age.toFixed()) // 에러.
console.log(age.valueOf()) // 타입 후보 number와 string의 공통 함수이므로 컴파일 시점에(?) 에러 없이 통과됨.
return new TypeError('age must be number or string');
}
⇒ getAge()를 호출하는 시점에(?) 둘 중 어느 타입으로 인수가 주어질지 모르기 때문에, 아예 어느 타입으로 들어오든지 에러가 안 나는 방향으로 타입을 추론하게 된다고 한다.
function getAge(age: number | string) {
console.log(age.toFixed()) // 에러.
console.log(age.valueOf()) // 타입 후보 number와 string의 공통 함수이므로 컴파일 시점에(?) 에러 없이 통과됨.
console.log(age.toLocaleString()); // 마찬가지로 통과됨
}
getAge(38);
getAge('hello38');
getAge(true); // 에러
즉 위의 예시 코드에서 age가 접근 가능한 메소드나 함수는 number와 string 타입의 공통부분만 가능하다.
Intersection type
: &
연산자를 이용해 여러 개의 타입 정의를 하나로 합치는 방식
// 교차 타입 예시
interface Person {
name: string;
age: number;
}
interface Developer {
name: string;
skill: number;
}
type Capt = Person & Developer;
// Capt의 타입:
{
name: string;
age: number;
skill: string;
}
→ 근데 굳이 intersection으로 명시하지 않아도 interface는 복합 할당(정의)가 가능하다고 하지 않았나?
- 만약 두 name의 타입이 달랐다면?
- Capt의 정의된 모양새를 볼 수 있는 방법은?
- 이제 Capt를 어떻게 사용할 수 있나?
Uploaded by N2T