책
-
[대규모 시스템 설계 기초] 1장 : 사용자 수에 따른 규모 확장성책/가상 면접 사례로 배우는 대규모 시스템 설계 기초 2024. 2. 17. 09:02
단일 서버 웹 앱, 데이터베이스, 캐시 등이 전부 한 대의 서버에서 실행되는 것 데이터베이스 사용자가 늘면 서버 하나로는 충분하지 않다 웹/모바일 트래픽 처리 용으로 하나, 데이터베이스 용으로 하나를 분리한다. 관계형 조인 연산 지원 MySQL, Oracle 등 비관계형 네가지 분류 키-값 저장소 그래프 저장소 컬럼 저장소 문서 저장소 아주 낮은 응답 지연시간(Latency) 다루는 데이터가 비정형 데이터를 직렬화/역직렬화 할수만 있으면 됨 아주 많은 양의 데이터를 저장해야함 위의 경우 NoSQL을 고려 수직적 규모 확장 vs 수평적 규모 확장 스케일 업 : 서버에 고사양 자원을 추가하는 것 스케일 아웃 : 더 많은 서버를 추가하여 성능 개선 트래픽 양 적을 때 → 스케일 업이 좋음 스케일 업의 한계 한..
-
[Refactoring] 12장 : 상속 다루기책/Refactoring 2판 2024. 2. 14. 11:45
메서드 올리기 // before class Parent { } class Child1 extends Parent { get name() {} } class Child2 extends Parent { get name() {} } // after class Parent { get name() {} } class Child1 extends Parent { } class Child2 extends Parent { } 부모에게는 없는데 자식에게만 중복되서 등장하는 필드, 메서드들이 있는 경우 이를 부모로 올려주는 것이 중복을 막을 수 있다. 만약 동작이 다를 경우, 템플릿 메서드 만들기를 고려할 수 있다. 필드 올리기 // before class Parent { } class Child1 extends Paren..
-
[Refactoring] 11장 : API 리팩터링책/Refactoring 2판 2024. 2. 14. 11:43
질의 함수와 변경 함수 분리하기 // before function getSomeDataAndSetAnother() { const result = func(); setAnother(); return result; } // after function getSomeData() { return func(); } function setAnother() { thie.field = 0; } 질의 함수 (읽기 함수) 는 어떠한 부수효과도 없어야 한다. 명렁-질의 분리 (Command-query seperation) 만약 읽기 함수 내에 무언가 다른 일을 하는 게 있다면, 바로 추출해주자. 함수 매개변수화하기 // before function addTwoTimes(number) { return number + numbe..
-
[Refactoring] 10장 : 조건부 로직 간소화책/Refactoring 2판 2024. 2. 14. 11:37
조건문 분해하기 // before if (!aDate.isBefore(plan.summerStart) && !aDate.isAfter(plan.summerEnd)) { charge = quantity * plan.summerRate; } else { charge = quantity * plan.regularRate + plan.regularServiceCharge; } // after if (summer()) { charge = summerCharge(); } else { charge = regularCharge(); } 복잡한 조건문은 코드를 어렵게 만드는 원흉이다. 코드를 부위별로 분해한 다음 코드 덩어리들을 의도를 살린 이름의 함수 호출로 바꿈 조건식 통합하기 // before if (someExp..
-
[Refactoring] 9장 : 데이터 조직화책/Refactoring 2판 2024. 2. 14. 11:35
변수 쪼개기 // before let temp = 2 * (height + width); console.log(temp); temp = height * width; console.log(temp); // after const perimeter = 2 * (height + width); console.log(perimeter); const area = height * width; console.log(area); 변수는 하나의 역할만 수행해야한다. 만약 두가지 이상의 역할을 수행한다면, 변수를 쪼개고 적절한 이름을 붙여준다. 참고 : 변수는 웬만하면 선언 후 바로 초기화 → 상수화하는 것이 좋다. 필드 이름 바꾸기 // before class Organization { get str() {} } // af..
-
[Refactoring] 8장 : 기능 이동책/Refactoring 2판 2024. 2. 14. 11:32
함수 옮기기 // before class SomeClass { get someFunc(); } // after class AnotherClass { get someFunc(); } 이는 클래스 이름을 바꾼게 아니라 함수가 옮겨진 것이다. 함수는 대부분 어떤 클래스에 속하게 된다. (자바의 경우 필수다) 만약 어떤 함수가 자신이 속한 모듈 A보다 모듈 B의 요소를 더 참조한다면 모듈 B로 옮겨주는 것이다. 필드 옮기기 // before class Customer { get plan() { return this.plan; } get discountRate() { return this.discountRate; } } // after class Customer { get plan() { return this.p..
-
[Refactoring] 7장 : 캡슐화책/Refactoring 2판 2024. 2. 14. 11:31
레코드 캡슐화하기 // before someRecord = {name: "choijaewon", country: "korea"}; // after class SomeRecord { constructor (data) { this._name = data.name; this._country = data.country; } get name() { return this._name; } set name(arg) { this._name = arg; } get country() { return this._country; } set country(arg) { this._country = arg; } } 레코드를 직접 노출하는 것이 아닌 클래스로 감싸고, 접근자 메서드를 통해 접근 및 수정할 수 있도록 바꾼다. 컬렉션 캡..
-
[Refactoring] 6장 : 기본적인 리팩터링책/Refactoring 2판 2024. 2. 14. 11:24
1. 함수 추출하기 function print() { printBanner(); let someVar = calculate(); // print detail console.log("something 1"); console.log("something 2"); } // after function print() { printBanner(); let someVar = calculate(); printDetail(); function printDetail() { console.log("something 1"); console.log("something 2"); } } 말 그대로 함수 추출하기 2. 함수 인라인하기 function func() { return someFunc1(); } function someFun..