Reactor의 디버깅 Reactor는 처리되는 작업들이 대부분 비동기적으로 실행되고, Reactor Sequence는 선언형 프로그래밍 방식으로 구성되므로 디버깅이 쉽지않다. Reactor에서는 디버깅을 할 수 있는 방법을 몇가지 제공한다. Debug Mode Debug Mode를 활성화해서 Reactor Sequence를 디버깅할 수 있다. @Slf4j public class Example12_1 { public static Map fruits = new HashMap(); static { fruits.put("banana", "바나나"); fruits.put("apple", "사과"); fruits.put("pear", "배"); fruits.put("grape", "포도"); } public st..
Context the situation, events, or onformation that are related to something and that help you understand it '어떤 것을 이해하는데 도움이 될만한 관련 정보나 이벤트, 상황'로 해석된다. 즉, Context는 어떠한 상황에서 그 상황을 처리하기 위해 필요한 정보라고 볼 수 있다. 프로그래밍 세계에서의 Context 예시 1) ServletContext는 Servlet이 Setvlet Container와 통신하기 위해서 필요한 정보를 제공하는 인터페이스다. 2) Spring Framework에서 ApplicationContext는 애프리케이션의 정보를 제공하는 인터페이스다. 3) Spring Security에서 Securi..
Thread 개념 이해 Reactor에서 사용되는 Scheduler Reactor Sequence에서 사용되는 스레드를 관리해 주는 관리자 역할을 한다. 컴퓨터 시스템에서 스레드는 물리적인 스레드(Physical Thread)와 논리적인 스레드(Logical Thread)로 구분된다. CPU의 코어(Core) 코어는 CPUD의 명령어를 처리하는 반도체 유닛이다. 일반적으로 코어의 개수가 많으면 더 많은 수의 명령어를 더 빠르게 병렬로 처리할 수 있다. 코어와 물리적인 스레드 관계 ▶ 물리적인 스레드 (Physical Thread) 하나의 코어는 두개의 스레드를 포함하고 있는데 이 두개의 스레드는 물리적인 코어를 논리적으로 나눈 것을 의미한다. 이렇게 물리적인 코어를 논리적으로 나눈 코어를 물리적인 스레드..
불필요한 객체 생성을 피하라 똑같은 기능의 객체를 매번 생성하기보다는 객체 하나를 재사용하는 편이 나을 때가 많다. 재사용은 빠르고 세련되다. new String() 하지 말것 아래 코드를 보자. 쓰면 안되는 코드 String s = new String("bikini"); // 따라하지 말 것 위 코드는 실행될 때마다 String 인스턴스를 새로 만든다. 완전히 쓸데없는 행위다. 권장되는 코드 String s = "bikini"; 위 코드는 새로운 인스턴스를 매번 만드는 대신 하나의 String 인스턴스를 사용한다. JVM 안에서 이와 똑같은 문자열 리터럴을 사용하는 모든 코드가 같은 객체를 재사용함이 보장된다. String.matches()를 사용할때 주의할것 생성 비용이 아주 비싼 객체가 있는데, 이..
Backpressure 리액티브 프로그래밍에서의 배압, 즉 Backpressure은 Publisher가 끊임없이 emit하는 무수히 많은 데이터를 적절하게 제어하여 데이터 처리에 과부하가 걸리지 않도록 제어하는 것이다. Publisher가 빠르게 데이터를 emit하는 경우 Subscriber의 처리속도가 느려서 처리가 끝나기도 전에 계속해서 emit하게된다. 이렇게되면 처리되지 않고 대기 중인 데이터가 지속적으로 쌓이게되어 오버플로가 발생하거나 최악의 경우에는 시스템이 다운되는 문제가 발생한다. 이 문제를 해결하기 위한 수단이 바로 Backpressure이다. Reactor에서의 Backpressure 처리 방식 첫번째 방법. Subscriber가 적절히 처리할 수 있는 수준의 데이터 개수를 Publis..
Cold와 Hot의 의미 지난 RxJava 공부 시기에 위 개념을 공부했었는데 다시보면 기억하기가 쉽지 않다. 리액티브 프로그래밍을 공부하면서 다시 나온 개념을 기억하고자 포스팅한다. Cold와 Hot의 의미를 모르는 사람은 없을 것이다. 대표적인 예시로 Hot Swapt이나 Hot Deploy를 보자. Hot Swap 컴퓨터 시스템의 전원이 켜져 있는 상태에서 디스크 등의 장치를 교체할 경우 시스템을 재시작하지 않고서도 바로 장치를 인식한다. Hot Deploy 서버를 재시작하지 않고서 응용 프로그램의 변경 사항을 적용한다. 공통점을 찾아보자. Hot은 무언가 처음부터 다시 시작하지 않고, 같은 작업이 반복하지 않는 느낌이다. 이와 반대인 Cold는 처음부터 새로 시작해야하고, 새로 시작하기 때문에 같..
정적 유틸리티 클래스 잘못 사용한 예제 - 유연하지 않고 테스트하기 어렵다. 싱글턴을 잘못 사용한 예제 - 유연하지 않고 테스트 하기 어렵다. 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 ..