들어가며 리액티브 스트림즈(Reactive Streams)에 대해 공부하고 간단하게 정리했던 포스팅이 있다. https://devfunny.tistory.com/333 Reactive Streams Reactuve Streans를 들어가기 이전 Reactive Streams 포스팅을 들어가기전, Reactive Spring의 개념에 대해 알아야한다. 포스팅 바로가기 : devfunny.tistory.com/314?category=820617 Reactive Spring / Reactive Programming Reactive devfunny.tistory.com 리액티브 프로그래밍 책을 읽다보면, 해당 내용을 계속 만나게되는데 여러번 반복하며 학습한 결과 내용을 이해하는데 어려움은 없지만 볼때마다 헷갈리..
MongoDB를 사용하는 다른 방법 'MongoDB Altas Free버전 Compass 사용하기' 이전 포스팅을 참고하자. https://devfunny.tistory.com/850 [MongoDB] MongoDB Altas Free버전 Compass 사용하기 1) monggoDB 사이트 접속 https://account.mongodb.com/account/login?signedOut=true Cloud: MongoDB Cloud account.mongodb.com 2) 회원가입 후 로그인시, 접속되는 화면 3) create a database ■ [Build a Database] ■ [Create] ■ [Create Cluste devfunny.tistory.com Altas Free 버전 Compa..
Spring WebFlux Spring WebFlux는 리액티브 웹 애플리케이션 구현을 위해 Spring 5.0부터 지원하는 리액티브 웹 프레임워크다. 대량의 요청 트래픽을 Spring MVC 방식이 처리하지 못하는 상황이 잦아짐에 따라 적은 수의 스레드로 대량의 요청을 안정적으로 처리할 수 있는 비동기 Non-Blocking I/O 방식의 Spring WebFlux가 등장했다. Spring WebFlux 기술 스택 1) 서버 Non-Blocking I/O 방식으로 동작하는 Netty 등의 서버 엔진에서 동작한다. 2) 서버 API 기본 서버 엔진이 Netty이지만 Jetty나 Undertow 같은 서버 엔진에서 지원하는 리액티브 스트림즈 어댑터를 통해 리액티브 스트림즈를 지원한다. 3) 보안 WebFl..
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) 하나의 코어는 두개의 스레드를 포함하고 있는데 이 두개의 스레드는 물리적인 코어를 논리적으로 나눈 것을 의미한다. 이렇게 물리적인 코어를 논리적으로 나눈 코어를 물리적인 스레드..
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는 처음부터 새로 시작해야하고, 새로 시작하기 때문에 같..
익명클래스 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 ..
수강완료한 강의 복습해보자 (코딩으로 학습하는 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..