전체 글 361

Reactive Programming(리액티브 프로그래밍)이란 무엇인가?!

보통 증권이나, 대량의 트래픽이 발생하는 거래소, 뱅킹 시스템에서 필요로 하는 기술 스택 중에 아래의 것이 있다. Reactive Programming, Parallel Programming, Webflux, Netty,, … 리액티브 프로그래밍에 대해 알아보자. Reactive Programming(리액티브 프로그래밍) Reactive의 정의는 "reacting to events or situations rather than acting first to change or prevent something" 이다. 이를 직역하면 "무언가를 바꾸거나 예방하기 위해 먼저 행동하기 보다는 사건이나 상황에 반응하는"이다. Reactive Programming은 데이터 스트림과 변경 사항 전파를 중심으로 하는 비동..

Spring Legacy의 실행 순서!

Spring Legacy 프레임워크가 실행되는 순서는 다음과 같다. 위 동작을 단계별로 정리해보자. 1. Tomcat(WAS)에 의해 web.xml 로드 web.xml은 WAS가 최초 구동될 때 사용하는 웹 애플리케이션 설정 파일이다. contextConfigLocation /WEB-INF/spring/root-context.xml org.springframework.web.context.ContextLoaderListener appServlet org.springframework.web.servlet.DispatcherServlet contextConfigLocation /WEB-INF/spring/appServlet/servlet-context.xml 1 appServlet *.do 각 태그는 크게 ..

Server/Spring 2023.07.16

Spring Test - ContextCustomizerFactory란 무엇인가?!

지난 번 Spring-kafka 라이브러리에서 ContextCustomizerFactory의 구현체인 EmbeddedKafkaContextCustomizerFactory를 수정했었다. https://jaehoney.tistory.com/347 ContextCustomizerFactory에 대해 알아보자. ContextCustomizerFactory ContextCustomizerFactory는 ContextCustomizer를 생성하는 클래스이다. 해당 클래스는 Spring-test 라이브러리 안에서 관리되며, ConfigurableApplicationContext(ApplictionContext를 상속하는 인터페이스)가 Refresh 되기 전에 Context를 커스터마이징 하기 위해 사용한다. 일반적으..

Server/Spring 2023.07.15

스프링 배치 Scope, Context 이해하기!

아래는 Spring Quartz + Spring Batch를 사용하여 만든 주식 1분봉 수집 서버 코드 일부이다. https://github.com/violetbeach/kis-trading-server/blob/master/boot/data-processing-server/src/main/java/com/violetbeach/kistradingserver/boot/processing/adapter/in/batch/job/DataProcessingStepConfiguration.java 코드를 요약하면 아래와 같다. Batch Job이 @Bean으로 등록되어 있다. 여기서 보면 Step에서 SpEL을 사용해서 stepExecutionContext에 접근하고 있다. 이게 내부적으로 어떻게 동작하는 것인지 ..

Server/Spring batch 2023.07.15

SpringApplication.run()을 호출하면 일어나는 일들!

요즘 들어서 Spring의 동작 원리에 대해 많이 부족하다고 느낀다. 2년차인데.. 부끄럽다! 다시 초심으로 돌아가자 ㅠ 보통 스프링부트로 개발하면 main() 메서드를 통해 SpringApplication.run() 메서드를 호출한다. SpringApplication.run()을 호출하면 일어나는 일에 대해 알아보자. SpringApplication.run() 가장 먼저 알아야할 것은 해당 코드는 SpringApplication 클래스는 SpringBoot에서만 사용한다는 점이다. 그러면 일반 Spring Legacy 에서는 어떻게 사용할까? Spring Legacy는 SpringApplication을 직접 실행하지 않는다. 빌드를 한 후에 WAS에 war를 내장시켜서 돌리는 방식이다. 코드 publi..

Server/Spring 2023.07.11

토스 증권의 실시간 데이터 처리!(with. 시세 플랫폼)

해당 포스팅에서는 토스 SLASH 23에서 실시간 데이터를 처리하는 방법에 대한 강연 내용에 바탕을 둔다. https://www.youtube.com/watch?v=SF7eqlL0mjw&t=41s 토스 증권에서는 KRX(한국 거래소)에서 실시간 체결가, 호가뿐 아니라 거래 정지, 공매도, 외국인 투자 현황 등을 전달받는다. 가장 중요한 것은 요청이 많은 오전 9시에 데이터가 누락되거나 밀리지 않고 처리하는 것이다. 시세 플랫폼 시세 플랫폼은 거래소의 데이터를 가공하고, 누적한 데이터와 결합한 후 내부 서비스에 전달한다. 여기서 더 세부적인 단위로 나누면 아래와 같다. 수신부는 UDP 멀티캐스트 그룹에 접속해서 데이터를 읽어온다. 참고로 한국 거래소에서 데이터를 읽어오는 방식은 크게 두 가지가 있다. UD..

Pinpoint 이해하기! (+ vs Prometheus)

Pinpoint는 Naver에서 2015년에 오픈소스로 공개한 APM 도구이다. 분산 환경에서 JVM 언어 기반으로 작성된 서버에서 많이 사용한다. APM이란 ? APM이란 Application Performance Management / Application Performance Monitoring의 약자이다. 즉, 애플리케이션의 성능을 관리/모니터링 한다고 보면 된다. APM 도구를 사용하면 서버에서 발생하는 메트릭(CPU, Memory, Thread, Transaction, …), 이벤트, 로그, 트랜잭션 등을 모니터링할 수 있다. 이렇게 분석한 데이터는 아래의 목적을 위해 활용할 수 있다. 성능 문제를 예측하고 방지 고객 기대 성능 보장, 고객 경험 향상 응답 시간 보장 가용성 증대, 다운타임 감..

GraphQL 이해하기!

GraphQL 이란 2012년 페이스북의 클라이언트 데이터 전송 방식 개선 목적으로 시작되었다. GraphQL이란 클라이언트와 서버의 통신 명세이다. (REST와 마찬가지로 실체는 없다.) 명세를 기반으로 다양한 라이브러리가 생성되었다. 구조(스키마)와 행동(리졸버)로 구성된다. vs REST API GraphQL과 REST API의 차이를 알아보자. GraphQL REST 구성 스키마 / 타입 시스템 URL endpoints 동작 Query, Mutation, Subscription CRUD End-point 단일 접점(API 1개) URL 집합 데이터 포맷 Only JSON JSON, XML, … 관점 클라이언트 주도 설계 서버 주도 설계 러닝 커브 어려움 보통 (비교적 쉬움) 그러면 이러한 차이는 ..

Operation/GraphQL 2023.07.02

Hibernate - QueryPlanCache Memory Leak 해결하기!

오늘 OOM이 터졌다는 요청이 왔다. 그래서 해당 API를 새로 배포한 후, 원인을 찾기로 했다. HeapSize 확인 첫 번째로 살펴본 부분은 HeapSize였다. java -server -Xms256m -Xmx256m 놀랍게도 HeapSize가 256m 이었다. 일단 Size가 너무 적었기 때문에 누수가 아니라, 트래픽 급증 등이 원인일 수도 있겠다고 생각을 했다. 문제가 되는 부분 해당 배치가 돌아간 시간을 확인해보니 아래 쿼리가 문제가 되었음을 확인했다. public interface CommentRepository extends JpaRepository { @Query("select m from Comment m where m.userId in (:userIds)") List findAllByU..

Server/Spring JPA 2023.06.29

Spring - Environment 동작원리 이해하기!

기존 자바 애프리케이션의 경우 커맨드 라인 인수, 자바 시스템 속성 인수, OS 환경변수 등을 꺼내는 방법이 달랐다. OS 환경 변수: System.getEnv(key) 자바 시스템 속성: System.getProperty(key) … 스프링은 이를 추상화해서 PropertySource라는 추상 클래스를 만들고, 그것을 구현하는 XXXPropertySource라는 구현체를 만들었다. 그래서 내부적으로 스프링 컨테이너 로딩 시점에 PropertySource들을 생성하고, Environment에서 사용할 수 있게 연결해둔다. Environment에서 PropertySource를 하나씩 접근해서 찾으면서 속성을 찾으면 반환하는 방식 스프링에서 내부적으로 우선순위를 정하고 있다. https://docs.spri..

Server/Spring 2023.06.27