728x90

분류 전체보기 636

Effective Java 3/E - 4장 클래스와 인터페이스 - 3

23. 태그 달린 클래스보다는 클래스 계층구조를 활용하라 태그 달린 클래스의 단점 열거 타입 선언, 태그 필드, switch 문 등의 관련 코드가 필요 필드들을 final로 선언하는 경우, 쓰이지 않는 필드까지 생성자에서 초기화 인스턴스의 타입만으로는 현재 의미 파악 불가 의미 없는 코드로 가독성이 떨어지면서 필요 없는 코드 작성 과정에서 오류 발생 가능성과 비효율적인 작업이 급격하게 증가하게 된다. 이러한 문제를 해결하기 위해서는 서브타이핑(Subtyping)을 사용하는 것이 좋다. 태그 달린 클래스의 예시 public class Figure { enum Shape { RECTANGLE, CIRCLE }; final Shape shape; // 관련 필드가 한 곳에다 모여 있다. double lengt..

RAID(레이드)란 무엇인가?

Redundant Array Independent Disks 복수 배열 독립 디스크 여러 디스크를 배열해서 가용성 및 고성능, 안정성 등을 위해 사용하는 기술 RAID의 장점 운용 가용성 및 안정성 증대 디스크 용량 증설 용이성 디스크 I/O 성능의 향상 종류와 구성 방식 RAID 0 Concatenate 방식, Stripe 방식으로 나뉨 Concatenate 두 개 이상의 디스크에 데이터를 순차적으로 쓰는 방식 디스크 기본 공간이 부족할 때 데이터는 보존하여 여분의 디스크를 볼륨에 포함하여 용량 증설이 가능 RAID 0의 특성 상 디스크에 하나라도 장애가 발생하면 복구가 어렵고 패리티 체크를 지원하지 않음 Stripe RAID 0의 일반적인 방식 두 개 이상의 디스크를 랜덤하게 쓰는 방식 데이터 사용 ..

Effective Java 3/E - 4장 클래스와 인터페이스 - 2

18. 상속보다는 컴포지션을 사용하라 상속은 코드 재사용의 강력한 수단이지만, 잘못된 사용은 오히려 오류를 유발한다. 다른 패키지의 구체 클래스를 확장하여 사용하는 상속은 위험한 행위가 된다. 상속은 캡슐화를 깨뜨린다. 상위 클래스의 구현에 따라서, 하위 클래스 동작에 이상이 발생할 수 있다. 상위 클래스는 릴리즈마다 내부 구현이 변경될 수 있는데, 이를 확장한 하위 클래스에서는 어떠한 변경 사항 없이도 동작에 문제가 발생할 수 있다. HashSet을 상속하여 사용하는 구조 예시 public class InstrumentedHashSet extends HashSet { public int addCount = 0; public InstrumentedHashSet() {} public Instrumented..

Effective Java 3/E - 4장 클래스와 인터페이스 - 1

15. 클래스와 멤버의 접근 권한을 최소화하라 아주 기본적인 내용이지만, 처음 입문했을 때 모든 내부 구현 정보를 외부에 제공하던 설계를 만들었던 시기가 생각나는 아이템이었다. 결론적으로, 잘 설계된 컴포넌트는 모든 내부 구현을 완벽히 숨겨서 구현과 API를 깔끔히 분리하고, 오직 API를 통해서만 다른 컴포넌트와 소통하고 내부의 동작에는 상호 개의치 않는 설계가 필요하다. 우리가 흔히 이야기하는 이 개념은 정보 은닉, 캡슐화로, 설계의 근간이다. 장점 시스템 개발 속도를 높인다. 여러 컴포넌트가 병렬로 개발할 수 있기 때문에 시스템 관리 비용을 낮춘다. 컴포넌트를 더 빨리 파악해, 디버깅하고 다른 컴포넌트로의 교체도 부담 적음 성능 최적화 단계에서 도움이 될 수 있다. 완성된 시스템을 프로파일링해 최적..

Effective Java 3/E - 3장 모든 객체의 공통 메서드

Object는 객체를 만들 수 있는 구체 클래스로, 상속하여 사용하는 것을 기본으로 하고 있다. Object의 final이 아닌 메서드들은 모두 재정의를 염두에 두고 설계되어 있어 이에 맞게 재정의해야 한다. 10. equals는 일반 규약을 지켜 재정의하라 equals를 잘못 재정의하면 문제를 발생시키므로, 대응하기 위한 방법 중 가장 쉬운 것은 하지 않는 것이다. 다음 케이스에 대해서는 재정의하지 않는 것이 좋다. 재정의하지 않아도 되는 경우 각 인스턴스가 본질적으로 고유한 경우 Thread 클래스 같은, 어떤 행위를 하는 클래스들이 이에 해당한다. 인스턴스의 논리적 동치성을 검사할 필요가 없는 경우 java.util.regex.Pattern은 두 인스턴스가 같은 regex인지 확인하도록 재정의했다...

전략 패턴(Strategy Pattern)

Strategy Pattern이란? 교환이 가능한 객체를 정의하고, 런타임에 설정하고 변환하는 패턴 같은 문제를 해결하는 여러 알고리즘을 클래스별로 캡슐화하고 필요에 따라 교체할 수 있는 설계로, 이를 런타임에 수행할 수 있게 하려는 패턴이다. 예시 그림과 예시 그림에 있는 용어들에 대해서 정리하고 가자. Strategy 인터페이스나 추상 클래스로 외부에서 동일한 방법으로 알고리즘을 호출하는 방법을 명시 ConcreteStrategyA, B, C 앞서 설계한 추상 클래스 혹은 인터페이스를 필요 기능에 따라 실제 구현한 클래스 Context 전략 패턴을 이용하는 역할을 수행한다. 필요에 따라서, 동적으로 구체적인 전략을 바꿀 수 있는 setter를 제공한다. 사용하는 쪽에서는 Strategy만 바꿔주면 코..

템플릿 메서드 패턴(Template Method Pattern)

템플릿 메서드 패턴(Template Method Pattern) 슈퍼 클래스에서는 알고리즘의 구조를 정의한다. 서브 클래스에서는, 슈퍼 클래스가 정의한 구조는 변경하지 않고 그 내용만 오버라이딩한다. 알고리즘이 동일하여 같은 역할을 하는 메서드들이 여러 벌 생성될 수 있지만, 세부 구현은 다른 형태로(DB만 다르거나, 주고 받는 내용만 다르거나...) 이루어진 경우에 유용하다. 대부분 어떤 것을 만드는 클래스들로(XXXMaker, XXXBuilder) 구현하면서 예시를 드는데, 샌드위치 메이커라는 컨셉으로 한 번 구현해봤다. 샌드위치는 안에 들어가는 재료가 저마다 다르고, 빵의 끝을 잘라낼 수도 있고, 먹기 편하게 아예 반으로 자를 수도 있고 다양한 형태로 조리될 수 있다. 만드는 과정이나 재료는 여러모..

무엇이 다른가? HTTP/1.1 vs HTTP/2

HTTP/1.1 HTTP/1.0 릴리즈 이후(1996) 표준으로 등록된 새로운 프로토콜(1999) 표준 프로토콜이라 여전히 많은 서비스에서 이를 기본 버전으로 사용하고 있음 특징 Persistent Connection 기존 HTTP/1.0은 연결 당 하나의 요청만 처리 가능 HTTP/1.1부터는 Persistent 기능으로 여러 요청이 가능하도록 개선 HTTP Pipelining TCP 안에 2개 이상의 HTTP 요청을 담아 지연을 줄이는 방식 각각의 요청을 보내고 이에 대한 응답을 받아서 처리할 수 있게 함 Host Header HTTP/1.0은 1개의 IP = 1개의 도메인 HTTP/1.1에서는 Host 헤더의 추가로, Virtual Hosting이 가능해져 1개의 IP = N개의 도메인 지원 인증 ..

윈도우에 Redis 설치해서 사용하기 with Docker

필요한 것 윈도우 PC Docker Desktop 약간의 시간 Docker Desktop 설치 Docker 설치는 아래 경로에서 진행하면 된다. https://www.docker.com/products/docker-desktop 설치하고 재시작이 한 번 필요하므로 재시작을 해줘야 한다. x64프로세서(특히 AMD)를 사용하는 경우, WSL 2가 없으면 Docker Engine이 실행이 안된다. 별도로 설치해줘도 되고, 재시작을 하면 설치하라고 안내 해주는 경로가 나오는데 그곳에서 설치하면 된다. 경로를 찾지 못한 사람들은 아래 경로에서 "x64 머신용 최신 WSL2 Linux 커널 업데이트 패키지"를 설치하고, WSL 2를 기본 버전으로 설정하면 된다. https://docs.microsoft.com/k..

Computer Science/DB 2021.12.04
728x90