반응형

java 10

Java Reactive Streams Publisher / Subscriber 분석 (projectreactor)

개요 ReactibeStreams의 사상 및 목적 조사 및 Publisher / Subscriber의 실제 동작 확인 Java의 Reactive Programing의 구현 사항 및 동작 원리 분석 Reactive Programing 이란 정의 데이터 스트림의 구성 및 변화의 전파에 대한 선언적 프로그래밍 패러다임 이 패러다임을 도입하면 배열 또는 이벤트 스트림을 쉽게 표현할 수 있다. 목적 1. (비동기적인) 이벤트 처리를 표현 및 구현하기 위해 2. 데이터 스트림을 표현 및 구현하기 위해 3. 반응형 시스템을 구현하기 위해 즉 실시간 데이터의 변화를 효율적으로 반영하여 제공하기 위해 탄생했다. 원칙 1. Responsive: 시스템은 요청/호출에 대해 즉각 응답할 수 있어야 한다. 2. Resilien..

개발 일지 2024.03.26

Global Hooks And Context Propagation (Projectreactor Advanced Features)

Global Hooks란 리액터는 연산자의 콜백을 전역으로 설정할 수 잇다. 이는 Operator에 element가 흐르는 로직에 관여하는 것과 비슷하다. Hooks 클래스로 제공되는 기능으로 3가지 종류가 있다. 1. Dropping Hooks 2. Internal Error Hook 3. Assembly Hooks DroppingHooks 일반적으로 onError가 모든 에러를 잡을 수 있을 것으로 기대하지만, 그렇지 못한 상황이 발생한다. 가령 onComplete()를 호출 한 후 onNext()등 다른 signal를 연결했을 때 또는 handle되지 못한 에러가 있다. Dropped By Previous Complete // onNextDropped Example Hooks.onNextDroppe..

개발 일지 2024.02.20

Hot vs Cold Publisher (Projectreactor Advanced Features)

개요 Project Reactor 기능 중 심화 개념에 해당되는 파트들을 정리 Hot Publisher And Cold Publisher 일반적으로 Webflux 등에서 사용되는 Publisher들은 subscribe()가 되어야 Element를 생성한다. 이는 모두 Cold Publisher를 사용하기 때문이며, Hot Publisher는 구독과 상관없이 Element를 생성한다. cold와 hot의 차이점은 데이터 발행의 주도권이 누구에게 있는가 이다. Cold Publisher Flux source = Flux.fromIterable(Arrays.asList("blue", "green", "orange", "purple")) .map(String::toUpperCase); source.subscri..

개발 일지 2024.02.19

Clean Code in Reactive

개요 Reactive 모델은 익숙한 기존 Thread 모델보다 가독성이 떨어지는 이슈가 있다. 이러한 문제는 Reactive의 한계가 아닌, 코드를 작성할 때 가독성을 고려하지 않고 작성하면 발생한다. 이번 리뷰는 가독성 좋은 Reactive 코드를 위한 개념들에 대해 정리한다. 1. 비즈니스 로직은 Operator가 기준이 된다. userService.getFavorites(userId) .map(Favorite::toRequestModel) .flatMap(favoriteService::getDetails) Reactive 모델은 Data Flow가 곧 비즈니스이다. Data Flow는 결국 비즈니스의 “행위”가 되며, 행위는 operator의 묶음으로 표현하게 된다. 이는 결국 추후 Reactive..

개발 일지 2024.01.25

AnnotationProcessor를 통한 project 내 ServerInfo Enum 생성

개요 중복되는 코드를 줄이기 위해 개인 서버 프로젝트를 gradle을 활용한 subproject 구조로 잡았었다. 새로 생성되는 subproject에서 중복 로직들을 모은 LIB project를 implementation 하여, 중복을 줄이고자 시도 중이다. 문제는, 프로젝트가 추가될 때마다 LIB project의 코드를 추가해 주는 방식은, 목표했던 편의성과는 거리가 있다. 이에 프로젝트 전체를 지속적으로 모니터링하여, 자동으로 최신화하는 방법을 모색했다. 목표는 수동으로 코드의 추가 없이, 신규 프로젝트의 설정 및 properties 등을 스크랩하여 추가할 수 있는 방안을 마련하는 것이다. AnnotationProcessor란 JAVA 5에서 신규 도입된 개념으로 Compile 시점에 JAVA의 소..

Spring Cloud Sleuth란 - 분산 Tracing

Spring Cloud Sleuth란 Spring Cloud의 분산 트레이싱 솔루션으로 개발 오픈소스 Trace And Span name desc Trace 전체 작업을 하나로 묶는 것 작업 당 64-bit ID 하나를 가진다. Span 분산 시스템에서 세부 작업, 다른 서비스, 다른 머신 또는 다른 쓰레드 등으로 나누어 질 수 있다. 각각 64-bit ID를 가진다. 최초의 Span은 traceId와 동일하며, root span으로 불린다. 분산 시스템의 한 작업의 예이다. 전체 작업을 하나의 Trace로 묶고, 세부 작업을 Span으로 표현한다. 이를 통해 전체 프로세스를 한번에 tracing 할 수 있으며, 세부적인 작업에 대한 부분도 확인 가능하다. 전체 작업을 Span을 기준으로 tree 구조화..

개발 일지 2023.09.11

Arthas 란

Arthas 란 알리바바 미들웨어팀이 오픈소스로 공개한 자바 진찰도구 요구사항 JDK 6 이상 Linix, Mac, Windows 설치 curl -O https://arthas.aliyun.com/arthas-boot.jar wget https://arthas.aliyun.com/arthas-boot.jar 실행 java -jar arthas-boot.jar 감지된 jvm을 선택한다 Arthas With Spring boot with docker 도커 컨테이너에서 실행되는 어플리케이션(JVM)에 접근하기 위해서는 컨테이너 내부에 arthas를 설치해야한다... jre만으로는 arthas가 정상작동 안하며 jdk를 설치해야한다.. 단지서버에서 가용되는 openjdk:11-jre-slim-buster (JR..

개발 일지 2022.11.25

MDC 란

MDC란 Mapped Diagnostic Context 멀티 클라이언트 환경에서 다른 클라이언트와 값을 구별하여 로그를 추적할 수 있도록 제공되는 map ThreadLocal을 통해 구별할 수 있는 키 값을 저장하여 Thread가 살아있는 동안 해당 키값 활용 사실상 쓰레드안에서 공유되는 Map을 할당하여 사용하는 개념 Interface Singleton으로 생성됨 Map과 비슷하게 CRUD 인터페이스 제공 동작원리 MDC class 내부적으로 MDCAdapter라는 인스턴스를 singleton하게 가지고 있으며 해당 어댑터를 통해서 interface들을 제공 MDCAdapter public MDCAdapter getMDCA() { return new LogbackMDCAdapter(); } 기본적으로 ..

개발 일지 2022.11.23

HikariCP 동작원리

HikariCP 란 JDBC의 Connection을 효율적으로 관리하는 Connection Pool의 구현체이다. 또한 일정 버전 Spring Boot가 기본적으로 사용하는 connection-pool Framework 다. HikariCP 동작원리 (ver 3.4.5) HikariConfig public class HikariConfig implements HikariConfigMXBean { ... private volatile long connectionTimeout; private volatile long validationTimeout; private volatile long idleTimeout; private volatile long leakDetectionThreshold; private ..

개발 일지 2022.11.16

JDBC 동작원리

JDBC란? Java DataBase Connectivity 자바와 데이터베이스 간의 커뮤니케이션을 위한 API 및 드라이버 JDBC API를 통해 자바는 해당 인터페이스만 바라보고 개발하면 된다. 이하 DB와의 커뮤니케이션은 JDBC API의 구현체가 담당한다. JDBC 동작원리 (JDK 11) DriverManager getConnection(...) 1. JDBC의 Driver interface의 구현체가 로드된 상태인지 체크한다. - 기본적으로 Driver의 구현체는 자체적으로 DriverManager에 등록되게끔 구현해놓았다. - 일반적으로 JDBC 가이드를 보면 Class.forName(...)을 통해 드라이버를 로드하도록 하는 이유이다. - driver가 로드 안되어있다면, System.pr..

개발 일지 2022.11.15
반응형