깊은바다거북
개발 공부 기록
깊은바다거북
전체 방문자
오늘
어제
  • 분류 전체보기 (219)
    • JAVA (9)
    • JavaScript (15)
    • 스파르타코딩클럽 (11)
      • [내일배움단] 웹개발 종합반 개발일지 (5)
      • [내일배움캠프] 프로젝트와 트러블 슈팅 (6)
    • SQL | NoSQL (4)
    • CS 등등 (0)
    • TIL | WIL (173)
    • 기타 에러 해결 (3)
    • 내 살 길 궁리 (4)

인기 글

최근 글

최근 댓글

태그

  • leetcode-cli
  • 최대 힙(Max Heap)
  • BST(이진 탐색 트리)
  • 트러블 슈팅 Troubleshooting
  • Til
  • Binary Tree(이진 트리)
  • Linked List
  • TypeScript
  • 재귀 함수
  • 자바스크립트 기초 문법
  • 팀 프로젝트
  • POST / GET 요청
  • Backtracking(백트래킹)
  • 01. 미니 프로젝트
  • 점화식(Recurrence Relation)
  • 자료 구조
  • 프로그래머스
  • 혼자 공부하는 자바스크립트
  • 시간 복잡도
  • 자잘한 에러 해결
  • BFS(너비우선탐색)
  • TIT (Today I Troubleshot)
  • DFS(깊이우선탐색)
  • Preorder Traversal(전위 순회)
  • Leetcode
  • tree
  • Trie
  • 최소 힙(Min Heap)
  • 코딩테스트 연습문제
  • Inorder Traversal(중위 순회)
hELLO · Designed By 정상우.
깊은바다거북

개발 공부 기록

1/17 화 (웹 서비스에서 고가용성이란) TIL
TIL | WIL

1/17 화 (웹 서비스에서 고가용성이란) TIL

2023. 1. 17. 22:28

(TypeScript 공부 중)

몇몇 타입스크립트 한글 온라인 핸드북으로 공부하고 있는데, 예제와 설명이 빈약해 아쉽다. ‘그러면 이러이런 경우는 어떻게 되는 거지?’하는 사이드 질문들이 너무 많이 생겨나고 끝나버리는 온라인 핸드북보다, 제공하는 정보량을 (초보자에게 맞도록) 제한하되 제공한 정보에 대해서는 추가적인 의문이 남지 않을 수 있도록 구조와 균형을 잘 잡아 써놓은 책으로 공부하고 싶다… 한 번의 예제로 이해하지 못하면 다른 예제를 찾고 그곳에 나와있는 (거의 항상 과한) 정보를 추가로 이해하고, 이전 정보와 비교하고 통합하는 데에 드는 시간과 노력이 생각보다 크다는 것을 느끼고 있다.

이를 방지하려면 처음 접한 문서에서 (최대한) 닫힌 결말로 설명을 잘 해주거나, 내 쪽에서 의문을 다 죽이고 일단 그저 따라가는 방법 뿐이다. 하지만 또 이렇게 되면 기본적으로 문서를 반복해서 읽어야 함이 전제된다. 의문이 남았던 부분들을 나중에 습득하게 된 블록으로 채우기 위해서는 말이다. 구멍난 채로 지나온 곳이 너무 많으면 어느 부분이 비었었는지 파악하기 어려워 다시 처음부터 스캔해야 하는데, 그게 또 거의 처음부터 공부하는 것과 같은 시간 비용과 심리적 거부감이 든다.

그래도 이번 기회에 딱 한 소스만 (부족한 문서더라도) 붙잡고 구멍 숭숭 난 채로 쭉 공부해보는 기회를 삼자. 더… 좋은 면이 있을 수도 있잖아..? 지상 과제는, ‘시간을 최대한 적게 들여서 블록 쌓기.’ 구멍 숭숭 난 채로 지나가게 된다 하더라도.



(참고중인 타입스크립트 핸드북 원, 투, 쓰리)

인터페이스 | 타입스크립트 핸드북
인터페이스는 상호 간에 정의한 약속 혹은 규칙을 의미합니다. 타입스크립트에서의 인터페이스는 보통 다음과 같은 범주에 대해 약속을 정의할 수 있습니다. 인터페이스에 대해 알아볼 수 있는 간단한 예제를 봅시다. 위 logAge() 함수에서 받는 인자의 형태는 age 를 속성으로 갖는 객체입니다. 이렇게 인자를 받을 때 단순한 타입 뿐만 아니라 객체의 속성 타입까지 정의할 수 있죠.
https://joshua1988.github.io/ts/guide/interfaces.html#%ED%81%B4%EB%9E%98%EC%8A%A4-%ED%83%80%EC%9E%85
인덱스 시그니처 속성
https://yamoo9.gitbook.io/typescript/interface/index-signature

제일 위의 문서의 원조격 :

TypeScript 한글 문서
TypeScript의 핵심 원칙 중 하나는 타입 검사가 값의 형태 에 초점을 맞추고 있다는 것입니다. 이를 "덕 타이핑(duck typing)" 혹은 "구조적 서브타이핑 (structural subtyping)"이라고도 합니다. TypeScript에서, 인터페이스는 이런 타입들의 이름을 짓는 역할을 하고 코드 안의 계약을 정의하는 것뿐만 아니라 프로젝트 외부에서 사용하는 코드의 계약을 정의하는 강력한 방법입니다.
https://typescript-kr.github.io/pages/interfaces.html

+ 참고할 만한 사이트 발견: JavaScript, ECMAScript6, Node.js, Express(Socket.IO), TypeScript 등에 대한 글들이 예쁘게 정리되어 있다.

Node.js(Express)와 Socket.io | PoiemaWeb
HTTP는 무상태 프로토콜(stateless protocol)으로 어떠한 이전 요청과도 무관한 각각의 요청을 독립적인 트랜잭션으로 취급하는 통신 프로토콜이다. 이러한 HTTP의 한계에서 벗어나 Node.js에서 손쉽게 Real-time communication(RTC, 실시간 양방향 통신) 웹 애플리케이션을 작성할 수 있는 Socket.io를 간단한 채팅 애플리케이션 작성을 통해 알아본다. WebSocket 은 사용자의 브라우저와 서버 사이의 동적인 양방향 연결 채널을 구성하는 HTML5 프로토콜이다.
https://poiemaweb.com/nodejs-socketio



  • 가용성 = 업 타임 / (업 타임 + 다운 타임)
  • 백엔드의 서버든 데이터베이스든, 고가용성을 추구한다.
  • 데이터베이스의 고가용성은 이중화를 통해 구현한다.
  • 이중화란 상시 대기하고 있는 DB 인스턴스가 있어서, 메인 DB 인스턴스가 다운되면 바로 교체하여 DB 서비스가 끊기지 않도록 하는 것을 말한다.


프로그래머스 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보다 나중에 와야 한다.

타입스크립트 시작 설정

  1. typescript는 글로벌로 설치되어 있다는 전제 하에…
  1. 새 프로젝트 폴더 생성
  1. npm init -y로 node의 package.json 생성
  1. 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단계를 거쳐 실행해야 하는 것을 바꾸려면:

  1. npm i @types/node 설치 → “console.log 등을 정의하는 패키지 ‘node’를 node_module의 @types라는 폴더에 설치하겠다”
  1. npm i -g ts-node 설치 (npm i -D ts-node 명령어를 한 번 더 입력하면 devDependencies 항목에 ts-node를 나타내게 할 수 있음)(-D 플래그는 --save-dev과 같음)
  1. 이제 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 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

    'TIL | WIL' 카테고리의 다른 글
    • 1/19 목 (fetch()는 왜 onload 이벤트보다도 늦는 걸까) TIL, TIT
    • 1/18 수 (TypeScript로 간단 포켓몬 도감 만들기) TIL, TIT
    • 1/16 월 (TypeScript, 만나서 반갑소) TIL, TIT
    • 1/15 (Socket.IO를 활용한 간단 듀얼 게임, 일) TIL
    깊은바다거북
    깊은바다거북

    티스토리툴바