분류 전체보기 364

웹소켓(WebSocket) 개념 이해하기!

WebSocket(WebSocket)은 클라이언트와 서버를 연결하고 실시간으로 통신이 가능하도록 하는 통신 프로토콜이다. WebSocket은 TCP 접속에 전이중(duplex) 통신 채널을 제공한다. 쉽게 말해, Socket Connection을 유지한 채로 실시간 양방향 통신이 가능하다. 아래 서비스에서 대표적으로 웹소켓을 많이 사용한다. SNS 실시간 채팅 화상 회의 실시간 협업 툴 온라인 게임 증권, 거래소 예시를 보면 동시간 접속자 수가 많으며, 실시간 데이터가 아주 많이 오간다는 것을 알 수 있다. vs HTTP 먼저 일반적으로 사용하는 HTTP 프로토콜과의 차이를 알아보자. 1. State HTTP는 단방향 통신이다. 클라이언트가 서버로 요청을 보내면 응답을 받는 구조로 동작하며, 어떠한 상태..

Operation/Network 2023.07.25

메일 발송 시 OOM 해결하기! (with. FilterOutputStream)

평화롭던 어느날 메일 API에서 OOM이 터졌다. 발생한 End-point는 메일 발송으로 확인했다. 메일 원문은 40MB였고 개발 서버에서 테스트를 해봤다. 동일 본문으로 메일 발송 요청 1번에 결과 메모리 사용량이 117MB 정도 급증했다. 세부적으로는 2단계 메모리가 튀는 것으로 확인된다. 1차: 724MB -> 761MB 2차: 761 MB -> 841MB 바로 의심했던 것이 발송 이벤트였다. 비동기 이벤트가 두 건 발행되고 있었다. Forward Event Archive Event Line Separator 확인 결과 1. 발송, 2. 포워드 이벤트 핸들러, 3. 아카이브 이벤트 핸들러에서 아래 로직을 수행한다. 코드를 보면 ByteArrayOutputStream에 eml 파일 내용을 저장한다...

Language/Java 2023.07.24

JavaMail API 튜닝기! (메모리 성능 개선!)

이슈 Handle dispatch failed: nested exception is java.lang.OutOfMemoryError: Java heap space 어느날 특정 end-point에서 OOM이 터졌다. 아직까지 일부 사용자에게만 운영중인 서버라서 OOM이 터지는 것은 뭔가가 잘못되었다는 것을 의미한다. 리소스를 확인한 결과 실제로 메모리가 들쑥날쑥했고, OOM으로 인해 파드가 여러번 재실행되었다. 본문 내용 해당 본문을 확인해본 결과 아래와 같았다. 원문 크기: 38MB Part (첨부파일): 총 10개 - 하나 당 3~4MB 정도 첨부파일 조회 Flow 아래는 사용자가 Java-Mail-API를 사용하는 해당 서버에서 첨부파일을 조회할 때 발생하는 동작이다. 해당 원문과 Flow를 그려보니..

Language/Java 2023.07.19

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, …), 이벤트, 로그, 트랜잭션 등을 모니터링할 수 있다. 이렇게 분석한 데이터는 아래의 목적을 위해 활용할 수 있다. 성능 문제를 예측하고 방지 고객 기대 성능 보장, 고객 경험 향상 응답 시간 보장 가용성 증대, 다운타임 감..