정적 유틸리티 클래스 잘못 사용한 예제 - 유연하지 않고 테스트하기 어렵다. 싱글턴을 잘못 사용한 예제 - 유연하지 않고 테스트 하기 어렵다. public class SpellChecker { private static final Dictionary dictionary = new DefaultDictionary(); // 자원을 직접 명시 private SpellChecker() {} public static boolean isValid(String word) { // TODO 여기 SpellChecker 코드 return dictionary.contains(word); } public static List suggestions(String typo) { // TODO 여기 SpellChecker 코드 ..
private 생성자 구현 생성자를 명시하지 않으면 컴파일러가 자동으로 기본 생성자를 만들어준다. 즉, 매개변수를 받지 않는 public 생성자가 만들어지며, 사용자는 이 생성자가 자동 생성된 것인지 구분할 수 없다. 실제로 이러한 이유로 의도치 않게 인스턴스할 수 있게된 클래스가 종종 목격된다. 1) 추상 클래스로 만든다. (충분하지 않음) 결론적으로 추상 클래스로 만드는 것은 인스턴스화를 막을 수 없다. 하위 클래스를 만들어 인스턴스화하면 그만이다. public abstract class UtilityClass { ... } 2) private 생성자를 추가한다. 이 방법으로 클래스의 인스턴스화를 막을 수 있다. public class UtilityClass { /** * 이 클래스는 인스턴스를 만들..
익명클래스 vs 람다 익명클래스 public class AnonymousClass { public static void main(String[] args) { IntBinaryOperator plus = new IntBinaryOperator() { @Override public int applyAsInt(int left, int right) { return left + right; } }; } } ▷ 바이트코드 public class com/whiteship/white_ship_study/week15/AnonymousClass { static INNERCLASS com/whiteship/white_ship_study/week15/AnonymousClass$1 null null public static ..
싱글턴(Singleton) 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. 함수와 같은 무상태(stateless) 객체 설계상 유일해야하는 시스템 컴포넌트 클래스를 싱글턴으로 만들면 이를 사용하는 클라이언트를 테스트하기가 어려워질 수 있다. ▷ 타입을 인터페이스로 정의한 다음 그 인터페이스를 구현해서 만든 싱글턴이 아니라면 싱글턴 인스턴스를 가짜(mock) 구현으로 대체할 수 없기 때문이다. 싱글턴을 만드는 방식 생성자는 private로 감춰두고, 유일한 인스턴스에 접근할 수 있는 수단으로 public static 멤버를 하나 마련한다. 1) public static 멤버가 final 필드 public class Elvis { /** * 싱글톤 오브젝트 */ public static final ..
점층적 생성자 패턴(Telescoping Constructor Pattern) 선택적 매개변수가 많을때 적절히 대응하기가 어렵다. 점층적 생성자 패턴이란, 필수 매개변수만 받는 생성자, 필수 매개변수와 선택 매개변수 1개를 받는 생성자, 선택 매개변수를 받는 생성자, 필수 매개변수와 선택 매개변수 1개를 받는 생성자, 선택 매개변수를 2개까지 받는 생성자 등의 형태로 선택 매개변수를 전부 다 받는 생성자까지 늘려가는 방식이다. 점층적 생성자 패턴 - 확장하기 어렵다. public class NutritionFacts { private final int servingSize; // (mL, 1회 제공량) 필수 private final int servings; // (회, 총 n회 제공량) 필수 privat..
정적 팩터리 메서드 클라이언트가 클래스의 인스턴스를 얻는 전통적인 수단은 public 생성자다. 추가로, 생성자와 별도로 정적 팩터리 메서드 (static factory method)를 제공할 수 있다. 이는 그 클래스의 인스턴스를 반환하는 단순한 정적 메서드다. 정적 팩토리 메서드 ... /** * 미리 만들어놓는다. * 정적 팩토리 메서드로 외부에서 사용할 수 있다. */ private static final Settings SETTINGS = new Settings(); /** * 정적 팩토리 사용 * newInstance 명칭으로 사용 * * [플라이웨이트 패턴]과 비슷하다. * 미리 자주 사용하는 객체들을 만들어놓고, 필요한 객체르 꺼내다 쓴다. * @return */ public static ..
수강완료한 강의 복습해보자 (코딩으로 학습하는 GoF의 디자인 패턴) 플라이웨이트 패턴(Flyweight Pattern) 객체를 가볍게 만들어 메모리 사용을 줄이는 패턴. 자주 변하는 속성(또는 외적인 속성, extrinsit)과 변하지 않는 속성(또는 내적인 속성, intrinsit)을 분리하고 재사용하여 메모리 사용을 줄일 수 있다. 적용 전 코드 (Before) Character.java public class Character { private char value; private String color; private String fontFamily; private int fontSize; public Character(char value, String color, String fontFamily..
docker 이미지 다운로드 docker pull jenkins/jenkins dockerhub : https://hub.docker.com/r/jenkins/jenkins docker 컨테이너 실행 docker run -d -v jenkins_home:/var/jenkins_home -p 8080:8080 -p 50000:50000 —restart=on-failure —name jenkins-server jenkins/jenkins jenkins 접속 localhost:8080 1) 초기 비밀번호 입력 docker 로그로 확인 docker logs jenkins-server 직접 파일 열어서 확인 docker exec -it jenkins-server /bin/bash cat /var/jenkins_h..
샤드키 선정 컬렉션을 샤딩할때 데이터 분할에 사용할 1~2개의 필드를 선택하는데, 이 필드를 샤드 키라고 한다. 컬렉션을 샤딩하고나서는 샤드 키를 변경할 수 없으므로 올바르게 선택하는 것이 중요하다. 좋은 샤드키를 선정하려면 샤드 키가 애플리케이션의 요청을 분산하는 방법과 작업량을 이해해야한다. 1) 샤드를 얼마나 많이 늘릴 것인가? 샤드가 3개인 클러스터는 샤드가 천개의 클러스터보다 훨씬 유연하다. 클러스터가 점점 더 커질때, 쿼리가 모든 샤드를 방문해야하는 쿼리를 피하려면 거의 모든 쿼리가 샤드 키를 포함해야한다. 2) 읽기 혹은 쓰기 응답 대기 시간을 줄이려고 샤딩하는가? 쓰기 응답 대기 시간을 줄이는 일은 일반적으로 요청을 지리적으로 더 가까운 곳이나 더 좋은 장비로 보내는 작업과 관련 있다. 3..
샤딩을 사용하는 경우 사용 가능한 메모리를 늘릴때 사용 가능한 디스크 공간을 늘릴때 서버의 부하를 줄일때 한 개의 mongod가 다룰 수 있는 처리량보다 더 많이 데이터를 읽거나 쓸때 샤딩이 필요한 시점을 결정하는 데 모니터링이 중요하다. 어떤 항목을 프로비저닝(provisioning)할지 찾고, 복제 셋 전환 방법과 시기를 미리 계획해야 한다. 프로비저닝(provisioning) 사용자의 요구에 맞게 시스템 자원을 할당, 배치, 배포해 두었다가 필요 시 시스템을 즉시 사용할 수 있는 상태로 미리 준비해 두는 것을 말한다. 서버 시작 클러스터를 생성하려면 먼저 필요한 프로세스를 모두 시작해야한다. mongos, 샤드 설정 구성 서버 : 클러스터 구성을 저장하는 일반 mongod 서버 클러스터 구성 : 샤..
샤딩 샤딩은 여러 장비에 걸쳐 데이터를 분할하는 과정을 뜻한다. 각 장비에 데이터의 서브셋을 넣음으로써, 더 많은 수의 덜 강력한 장비로 더 많은 데이터를 저장하고 더 많은 부하를 처리할 수 있다. 컬렉션을 분할한 조각 데이터(청그)를 저장하며, 복제 세트로 구성될 수 있다. 더 자주 접근하는 데이터를 성능이 더 좋은 하드웨어에 배치할 수 있다. 지역에 따라 데이터셋을 분할해 주로 접근하는 애플리케이션 서버와 가까운 컬렉션에서 도큐먼트의 서브셋을 찾을 수 있다. ex) 사용자가 특정 로케일(locale)을 기반으로 할때 샤딩은 개발 및 운영 측면에서 몽고DB를 구성하는 가장 어렵고 복잡한 방법이다. 모니터링할 구성 요소가 많고, 클러스터에서 데이터가 자동으로 옮겨 다니기 때문이다. 몽고DB 에서의 자동 ..
Postgresql Docker 설치 1) postgresql 이미지 설치 docker pull postgres 2) docker 이미지 확인 docker images 3) docker 컨테이너 실행 한가지 참고할 점은, 위의 이미지 설치 과정을 생략 하고 해당 명령어만 수행할 경우, 이미지가 자동으로 설치된다. docker run -dp 5432:5432 --name postgresql -e POSTGRES_PASSWORD=1234 -v 호스트 패키지 경로:/var/lib/postgres/data postgres 명령어 설명 -d 컨테이너를 백그라운드에서 실행 -p port 설정 --name 컨테이너에 이름을 부여 -e 컨테이너 내 환경변수 값 설정 -v 호스트와 컨테이너의 directory 연결 4)..
문제 - 문자열 압축 알파멧 대문자로 이루어진 문자열을 입력받아 같은 문자가 연속으로 반복되는 경우, 반복되는 문자 바로 오른쪽에 반복 횟수를 표기하는 방법으로 문자열을 압축하는 프로그램을 작성하시오. 단, 반복횟수가 1인 경우는 생략 [입력] 첫 줄에 문자열, 길이는 100을 넘지 않는다. [출력] 첫 줄에 압축된 문자열을 출력 [입력 예제] KKHSSSSSSSE [출력 예제] K2HS7E 나의 풀이 package com.algorithm._01_그리디_구현; import java.util.Scanner; public class LC11_문자열_압축 { static int N; static String str; public static void main(String[] args) { // write y..
Docker 이미지를 생성하는 방법 1) 아무것도 존재하지 않는 이미지(우분두, CentOS 등)로 컨테이너를 생성 2) 애플리케이션을 위한 환경을 설치하고 소스코드 등을 복사해 잘 동작하는 것을 확인 3) 컨테이너를 이미지로 커밋(commit) 이 방법은 환경 구성을 위해 일일이 수작업으로 패키지를 설치하고 깃(Git)에서 복제하거나 호스트에서 복사해야한다는 단점이 있다. 그리고 직접 확인해보고 이미지로 커밋하기 때문에 이미지의 동작을 보장할 수 있다는 장점이 있다. DockerFile로 이미지를 생성하는 방법 Docker는 이미지를 생성하는 과정을 쉽게 수행할 수 있도록 빌드(build) 명령어를 제공한다. Dockerfile 하나의 파일에 이미지 생성을 위한 내용을 기록해두면 도커는 이 파일을 읽어..
문제 한 개의 문자열 s, 문자 t가 주어지면 문자열 s의 각 문자가 문자 t와 떨어진 최소 거리를 출력하시오. 입력 설명 문자열과 문자는 소문자다. 문자열의 길이는 100을 넘지 않는다. 입력 예제 teachermode e 출력 예제 1 0 1 2 1 0 1 2 2 1 0 나의 풀이 package com.algorithm._01_그리디_구현; import java.util.Arrays; import java.util.Scanner; /** * (문제) * 한 개의 문자열 s, 문자 t가 주어지면 문자열 s의 각 문자가 문자 t와 떨어진 최소 거리를 출력 * * (입력설명) * 문자열과 문자는 소문자 * 문자열의 길이는 100을 넘지 않는다. * * (입력예제) * teachermode e * (출력예제..
* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.