[Book - 가상 면접 사례로 배우는 대규모 시스템 설계 기초] 1. 사용자 수에 따른 규모 확장성
단일 서버 사용자 요청 처리 흐름 도메인명(www.google.com) 접속 DNS 조회 결과로 IP 주소(172.217.25.164) 반환 해당 IP 주소로 HTTP 요청 전달 요청을 받은 웹 서버가 HTML 페이지 및 JSON 형태의 응답 반환 데이터베이스 사용자가 늘면...
단일 서버 사용자 요청 처리 흐름 도메인명(www.google.com) 접속 DNS 조회 결과로 IP 주소(172.217.25.164) 반환 해당 IP 주소로 HTTP 요청 전달 요청을 받은 웹 서버가 HTML 페이지 및 JSON 형태의 응답 반환 데이터베이스 사용자가 늘면...
클래스는 작아야 한다! 클래스를 설계할 때도, 함수와 마찬가지로, ‘작게’가 기본 규칙이다. 만약 메서드가 5개 정도면 괜찮을까? 메서드 수가 작아도 책임이 너무 많다면 괜찮지 않다. 단일 책임 원칙 객체 지향 설계에서 중요한 개념인 Single Responsibility Principle(SRP)은 클래스나 모듈을 변경할 이유가 단 하나뿐이어야...
TDD 법칙 세 가지 실패하는 단위 테스트를 작성할 때까지 실제 코드를 작성하지 않는다. 컴파일은 실패하지 않으면서 실행이 실패하는 정도로만 단위 테스트를 작성한다. 현재 실패하는 테스트를 통과할 정도로만 실제 코드를 작성한다. 실제 코드와 맞먹을 정도로 방대한 테스트 코드는 심각한 관리 문제를 유발하기도 한다. 깨끗한 테스트 코드 ...
외부 코드 사용하기 Map<String, Sensor> new HashMap<Sensor>(); ... Sensor s = sensors.get(sensorId); “Map<String, Sensor>가 사용자에게 필요하지 않은 기능까지 제공한다”는 문제는 해결하지 못한 코드이다. Map<String, Sen...
오류 코드보다 예외를 사용하라 오류가 발생하면 예외를 던지자. 그렇지 않으면 함수를 호출할 때 마다 오류를 확인해야 할 수 있으며, 휴먼 에러가 생길 수 있다. null을 반환하지 마라 null을 반환하는 코드는 일거리를 늘릴 뿐만 아니라 호출자에게 문제를 떠넘긴다. null을 반환한다면 감싸기 메서드를 구현해 예외를 던지거나 특수 사례 객체를 ...
자료 추상화 추상 인터페이스를 제공해 사용자가 구현을 모른 채 자료의 핵심을 조작할 수 있어야 진정한 의미의 클래스이다. 자료를 세세하게 공개하기보다는 추상적인 개념으로 표현하는 편이 좋다. 인터페이스나 조회/설정 함수만으로는 추상화가 이뤄지지 않는다. 개발자는 객체가 포함하는 자료를 표현할 가장 좋은 방법을 심각하게 고민해야 한다. 아무 생...
다 읽고 쓰자는 안일함에 다 읽어 놓고 쓰지는 않아서 이제야 쓴다.. (앞으로 읽자마자 쓰자. 반성하자.) 프로그래머라면 형식을 깔끔하게 맞춰 코드를 짜야 한다. 이유는 코드 형식 또한 의사소통의 일환이기 때문이다. 오늘 구현한 기능이 다음 버전에서 바뀔 확률은 아주 높다. 그런데 그 코드의 가독성은 앞으로 바뀔 코드의 품질에 많은 ...
테스트와 지속적 통합 JUnit 테스트를 개발 주기 안에 포함하는 것은 굉장히 중요한 일이다. 일반적인 개발 주기 코드 작성 > 구동 > 테스트 > 코드 작성 TDD를 적용한 개발 주기 테스트 > 코드 작성 > 구동 > 테스트 모듈은 서로 ...
이번 챕터는 주로 쓰이는 IDE에서 JUnit 5로 테스트를 어떻게 실행하는지를 알려 준다. 주로 쓰이는 IDE는 IntelliJ, Eclipse, NetBeans가 있다. JUnit 5가 처음 출시되었을 때는 IntelliJ가 지원하는 유일한 IDE였다고 한다. 그래서 그런지 IntelliJ가 JUnit 5와 통합이 잘 되어 있고, 나머지 Ec...
Gradle은 아파치 Ant와 아파치 Maven에 녹아 있는 개념에서 시작된 오픈 소스 빌드 자동화 도구다. Maven은 프로젝트 설정 파일은 XML로 작성한다. Gradle은 프로젝트 설정 파일을 Groovy를 기반으로 한 DSL(domain specific language, 도메인 특화 언어)로 작성한다. DSL은 특정한 애플리케이션 도메인에...