책
[대규모 시스템 설계 기초] 2장,3장 - 개략적인 규모 추정 / 시스템 설계 면접 공략법
개략적인 규모 추정을 위해서는 규모 확장성 표현에 능숙해야 한다. 2의 제곱수 응답 지연(latency) 값 고가용성 2의 제곱수 데이터 최소 단위 : 1 byte = 8bit ASCII 문자 하나 메모리 크기 : 1 byte 모든 프로그래머가 알아야 하는 응답지연 값 메모리는 빠르지만 디스크는 아직 느리다. 디스크 탐색(seek) 가능한 피하기 단순한 압축 알고리즘은 속도가 빠르다. 데이터를 인터넷으로 전송하기 전에 가능하면 압축하기 데이터 센터는 여러 지역에 분산되어 있고, 센터들 간에 데이터를 주고 받는 시간은 꽤 걸린다. 가용성에 관계된 수치들 고가용성(high availability) : 시스템이 오랜 시간동안 지속적으로 중단 없이 운영될 수 있는 능력 SLA(Service Level Agree..
[대규모 시스템 설계 기초] 1장 - 사용자 수에 따른 규모 확장성
단일 서버 웹 앱, 데이터베이스, 캐시 등이 전부 서버 한 대에서 실행된다. 사용자 요청 처리 흐름 1. 사용자는 도메인 이름(api.mysite.com)을 이용해서 웹사이트에 접속한다. 이 접속을 위해서는 도메인 이름을 DNS에 질의하여 IP 주소로 변환하는 과정이 필요하다. 2. DNS 조회 결과로 IP 주소가 반환된다. (웹 서버의 주소) 3. 해당 IP 주소로 HTTP 요청이 웹 서버에 전달된다. 4. 요청을 받은 웹 서버는 HTML 페이지나 JSON 형태의 응답을 반환한다. 두 가지 종류의 단말으로부터 요청 웹 애플리케이션 서버 구현용 언어(자바, 파이썬) : 비즈니스 로직, 데이터 저장 처리 클라이언트 구현용 언어(HTML, JS) : 프레젠테이션용 모바일 앱 HTTP 프로토콜 이용 : 모바일..
RealMySQL 4장 - 4.1 MySQL 엔진 아키텍처
RealMySQL 8.0 (4장 아키텍처) 4.1 MySQL 엔진 아키텍처 크게 MySQL 서버의 구조를 나누었을 때 3가지로 나눌 수 있다. MySQL 엔진 클라이언트로부터의 접속 및 쿼리 요청을 처리하는 커넥션 핸들러 SQL파서 및 전처리기, 옵티마이저 등으로 이루어짐 스토리지 엔진 실제 데이터를 디스크 스토리지에 저장하거나 디스크 스토리지로 부터 데이터를 읽어오는 역할 InnoDB, MyISAM ... MySQL 서버에서 MySQL 엔진은 하나지만, 스토리지 엔진은 여러 개를 동시에 사용 가능 각 스토리지 엔진은 성능 향상을 위해 키 캐시나 InnoDB 버퍼 풀과 같은 기능을 내장 핸들러 API MySQL 엔진의 쿼리 실행기에서 데이터를 쓰거나 읽을 때 각 스토리지 엔진에 쓰기/읽기를 요청하는 것을..
클린 아키텍처 17장, 18장, 19장 리뷰
17장 경계: 선 긋기 경계 경계는 한편에 있는 요소가 반대편에 있는 요소를 알지 못하도록 막는다. 프로젝트 초기에 작성되는 경우도 있고, 매우 나중에 그어지는 경우도 있다. 초기에 경계를 긋는 경우 가능한 한 결정을 오랫동안 연기시키기 위해. 즉, 핵심적인 업무 로직을 오염시키지 못하게 만들려는 목적 경계를 지어야하는 이유 시스템의 업무 요구사항과 관련없는 결정에 따른 결합은 생산성을 떨어트리기 때문. (프레임워크, DB, 웹서버, 유틸리티 라이브러리, 의존성 주입 등에 대한 결정) 좋은 아키텍처는 이러한 결정에 의존하지 않는다. Good Example 어떠한 DB를 사용할 것인지에 대한 결정 어떤 DB를 사용하더라도 상관없는 형태로 설계함으로써 의도적으로 DB에 대한 결정을 미루었다. 방법 : 모든 ..
클린 아키텍처 15장, 16장 리뷰
15장 아키텍처란? 소프트웨어 아키텍트는 최고의 프로그래머이며, 코드와 동떨어져서는 안된다. 동시에,나머지 팀원들이 생산성을 극대화 할 수 있는 설계를 하도록 이끈다. 아키텍처의 주된 목적은 시스템의 생명주기를 지원하는 것이다. 좋은 아키텍처는 시스템을 쉽게 이해하고, 쉽게 개발하며, 쉽게 유지보수하고, 쉽게 배포하게 해준다. 아키텍처의 궁극적인 목표는 시스템의 수명과 관련된 비용은 최소화하고, 프로그래머의 생산성은 최대화하는데 있다. 개발 개발하기 힘든 시스템이라면 수명이 길지도 않고 건강하지도 않을 것이다. 시스템 아키텍처는 개발팀이 시스템을 쉽게 개발할 수 있도록 만들어야 한다.배포소프트웨어 시스템이 사용될 수 있으려면 반드시 배포할 수 있어야 한다. 배포 비용이 높을수록 시스템의 유용성은 떨어진다..
클린 아키텍처 12장, 13장, 14장 리뷰
12장 컴포넌트 컴포넌트 : 시스템의 구성 요소로 배포할 수 있는 가장 작은 단위 컴파일러형 언어 : 바이너리 파일의 결합체 인터프리터형 언어 : 소스 파일의 결합체 ex) java - .jar , ruby - .gem , .net -> .dll 컴포넌트가 마지막으로 어떤 형태로 배포되든, 잘 설계된 컴포넌트라면 반드시 독립적으로 배포가 가능해야 하며 독립적으로 개발 가능한 능력을 갖춰야 한다. 컴포넌트의 간략한 역사 소프트웨어 개발 초창기 : 프로그램이 로드될 주소 직접 제어 구시대의 라이브러리 함수 접근 : 라이브러리 함수의 소스 코드를 application 코드에 직접 포함시켜 단일 프로그램으로 컴파일 이 때문에, 컴파일 과정 오래 걸리고, 메모리는 한정적 컴파일 시간 단축을 위해 함수 라이브러리를..
클린 아키텍처 8장, 9장, 10장, 11장 리뷰
8장 OCP : 개방폐쇄 원칙 소프트웨어 개채(artifact)는 확장에 열려 있어야 하며, 변경에는 닫혀 있어야 한다. 개체의 행위는 확장할 수 있어야 하지만, 이 때 산출물을 변경해서는 안된다. 사고 실험 A기능을 이용해 B형태로 보여주는 기능이 있다 이 때, B 형태에 추가적인 사항이 생겨 새로운 C 형태로 보여주는 기능이 추가 되어야 할 때 이상적인 코드 변경량 : 0 (변경되는 코드의 양을 최소화해야한다.) 위 그림에서 FinancialDataMapper은 구현관계를 통해, FinancialDataGateway를 알고 있지만, FinancialDataGateway는 FinancialDataMapper를 알지 못한다. : 인터페이스 : 데이터 구조 -> : 호출 관계 -ᐅ : 구현 / 상속 관계 ..
클린 아키텍처 6장, 7장 리뷰
6장 함수형 프로그래밍(FP) FP 패러다임의 람다(lambda)계산법으로 1930년 발명 정수를 제곱하기 리스프에서 파생한 클로저(Clojure)는 함수형 언어 Java는 가변 변수(Mutable Variable) 사용 - 가변 변수는 프로그램 실행중에 상태가 변할 수 있다. 클로저는 이러한 가변 변수 존재 X 함수형 언어에서는 변수는 한 번 초기화되면 절대로 변하지 않는다. 불변성(Immutable)과 아키텍처 가변 변수에 의해 아키텍처에서 발생하는 문제 Race Condition DeadLock 동시 업데이트(Concurrent Update) 아키텍트는 동시성(Concurrency) 문제에 대해 고려할 줄 알아야한다. 가변성의 분리 불변성과 관련하여 가변 컴포넌트와 불변 컴포넌트를 분리하는 것이 중..