2025/02 11

Java도 한다 경량 쓰레드 (Virtual Thread)

봄(Spring)은 왔는가?Java의 위대한 산물인 가상 쓰레드는 분명 JVM 생테계에 엄청난 열풍을 일으켰음에 의심할 여지가 없다.많은 개발자들이 그 패러다임에 발맞춰서 프레임워크를 개선하고 있듯이, 나도 얼른 쫓아가겠다.  * 구조도를 직접 그린게 이해하기 어려우면 맨 아래의 출처에 가면 다른 이미지도 있습니다  Java의 기존 쓰레드 모델 (JDK 17 이하)컨텍스트 스위칭을 통해 OS 자체의 리소스를 점유하는 방식으로, JVM 내에서 플랫폼 쓰레드를 생성할때 JNI를 사용해서 OS(Kernel) 쓰레드에 직접 매핑되도록 설계되었다.  Heap에 존재하는 수많은 유저 쓰레드 중 하나가 JVM의 스케줄링에 따라서 커널 쓰레드에 매핑되어 실행되는 기존 구조스케줄링은 ExecutorService에 의해서..

backend 2025.02.26

JVM의 Garbage Collector 분석 (feat. ZGC와 G1간의 차이점 비교)

우리는 JVM 위에서 동작하는 다양한 언어, 프레임워크, 라이브러리나 도구 등을 포함한 광범위한 영역에서 활동한다.이러한 JVM 생태계 전반에 대한 이해를 위해서 먼저 JVM을 깊게 이해하고자 한다.  Java Virtual Machine(JVM)의 이해단순히 Java만 실행하는 것이 아니라 Kotlin, Scala, Groovy 등의 다양한 언어를 바이트코드로 실행하는 가상머신으로, 플랫폼 독립적인 환경을 제공한다.바이트코드 실행GC를 통한 자동 메모리 관리JIT 컴파일로를 활용한 런타임 최적화효율적인 쓰레드 관리  1. Java Code를 컴파일(javac)2. JVM이 이해할 수 있는 바이트코드(.class)를 JVM의 클래스 로더(Class Loader)가 메모리에 적재3. 런타임 메모리 영역(M..

backend 2025.02.26

Java17 - String 클래스의 최적화

기존 JDK(17 이하)와 달라진 Stirng 클래스의 최적화에 대해 알아보자. 크게 배워야할 부분은 없고 3가지 특징으로 구분할 수 있다. String 관련 성능이 기존보다 훨씬 최적화되었다. (메모리 절약 + 실행 성능 향상 + GC 부담 감소) 1. Compact Strings 유지Java8까지만 해도 String 객체는 내부적으로 char[] (2byte UTF-16 인코딩)을 사용함 Java9부터 Compact Strings 기법을 도입. byte[] + coder 플래그를 사용해서 1byte 문자 저장해서 메모리 절약→ 한글이나 중국어같은 다국어는 UTF-16(2byte) 유지, 영어나 숫자는 1byte로 저장Heap 공간을 적게 차지해서 GC 성능 최적화작은 크기의 문자열을 더욱 빠르게 처리..

backend 2025.02.25

Tomcat, Netty의 쓰레드 덤프 분석을 통해 병목 지점을 분석해보자 - Prometheus,Grafana를 통한 시각화 모니터링

자바 쓰레드의 상태(Thread State)상태 전이에 대해 간략하게 설명하기 전에 종류나 알고 가자NEW : 쓰레드가 생성되었으나 아직 시작되지 않은 상태 (아직 OS 쓰레드는 존재하지 않는 상태)Thread.start()를 호출해야 OS에서 실제로 쓰레드를 생성RUNNABLE : 쓰레드가 실행 가능하여 OS의 리소스를 기다리거나 JVM 안에서 실행중인 상태OS 스케줄러의 실행 대기열에 포함되었다가 차례로 CPU에서 실행된다.BLOCKED : 쓰레드가 동기화 락을 기다리며 Block된 상태WAITING : 무한정 대기중인 쓰레드 (CPU 입장에서 Waiting과 Blocked는 동일)TIMED_WAITING : 쓰레드가 지정된 시간동안 대기TERMINATED : 실행 완료되었거나 예외가 발생하여 종료된..

backend 2025.02.24

Windows In Docker - C++ 프로젝트의 컨테이너화 빌드 및 관리

Windows 환경의 C++ 프로젝트의 컨테이너 이미지 관리혹자는 Linux 환경에서 C++ 빌드도 되는데, 그냥 리눅스로 도커 이미지 빌드하면 안되냐고 할 것이다. 하지만 제목에서 말해주듯 IOCP 게임서버에 관한 내용으로, IO Completion Port는 윈도우 OS의 커널 오브젝트이다.Overlapped IO를 통해 OS에 종속될 수 밖에 없는 Proactor 비동기 기술의 비애라고 볼 수 있겠다. 어쩔 수 없이 Windows 플랫폼을 고집해야하는 상황이고, k8s 환경에서 다른 마이크로서비스들과 함께 관리하기 위해서라도 컨테이너화 빌드도 필요한 상황이다.  핵심 : Visual Studio 빌드 시스템 사용 (.vcsproj 프로젝트 파일) FROM mcr.microsoft.com/window..

windows 2025.02.20

스프링에서 제공하는 Redis 직렬화/역직렬화 도구의 한계와 직접 구현 (Snappy 압축)

Redis에서도 동일하게 클래스 정보를 넘겨주게 되면 저장공간을 사용하게 될 뿐만 아니라, 클래스 정보가 변경되는 경우 캐시 정합성 문제가 생길 수 있다. 따라서 압축을 적용하는 것이 합리적이라 볼 수 있고, 추가적인 CPU 처리를 하더라도 Redis 사용량을 줄일 수 있는 직렬화 도구를 직접 구현하여 적용해보자.   스프링에서 Redis 사용 (spring-data-redis)Redis는 기본적으로 byte 배열을 사용해 데이터를 저장한다.spring-data-redis에서는 데이터를 직렬화해서 Redis에 기록하고 역직렬화하는 도구를 제공한다. 하지만 스프링에서 제공하는 직렬화/역직렬화 도구를 그대로 활용하면 몇가지 문제가 있으며 어떻게 개선할 수 있을지 살펴보자. Spring 진영에서는 Redis를..

backend 2025.02.19

Hexagonal Architecture의 테스트코드 작성 (feat. StepVerifier, TestPublisher)

프로젝트를 Hexagonal Architecture로 개발하면서, 외부 시스템과 소통하는 Port 인터페이스를 통해서 실제 비즈니스를 담당하는 UseCase의 구현체인 Service를 검증할 수 있다. 독립적인 테스트 코드비즈니스 로직이 외부 시스템에 의존하지 않으므로, 독립적으로 단위 테스트(Unit Test), 빠른 테스트 실행DataBase, HTTP Client, 메시징 등의 외부 시스템에 대한 각 Adapter는 독립적으로 테스트 가능의존성의 대체(Mock, Stub, Fake)Port-Adapter 패턴으로 인해, 실제 사용하는 외부 시스템이 아닌 Mock 등 으로 활용한 테스트 가능예를 들어, DB Adapter 대신 InMemoryRepository를 사용하여 테스트할 수 있다.  테스트코..

backend 2025.02.13

minikube로 로컬 환경을 구축해보자 (feat. Kubernetes Java Client 도입)

https://kubernetes.io/ko/docs/tutorials/hello-minikube/ Hello Minikube이 튜토리얼에서는 Minikube와 Katacoda를 이용하여 쿠버네티스에서 샘플 애플리케이션을 어떻게 실행하는지 살펴본다. Katacode는 무료로 브라우저에서 쿠버네티스 환경을 제공한다. 참고:로컬에서 Mkubernetes.io  관리형 k8s나 IaaS 클러스터에서 테스트하기 부담스러웠다.그래서 로컬 환경에서 쉽게 클러스터를 구성할 수 있는 Minikube나 k3s 같은 로컬 쿠버네티스 도구를 알아봤다.WSL2 리소스 설정Windows의 경우, .wslconfig 파일을 통해 도커에 할당할 리소스를 지정할 수 있다. 검색 : %UserProfile%[wsl2]processor..

kubernetes 2025.02.11

비동기 프로그래밍, 얼마나 알고 있나요? (Advanced Asynchronized)

이벤트 기반 IO 처리 방식의 비동기 설계 패턴으로 여러 방식이 존재하고, 비동기 작업을 관리하지만 그 방식이 상이하다. 비동기 방식의 구분 : 이벤트를 감지하는 주체가 누구인가?두 방식 모두 "-actor"로끝나며 행동하는 주체로서 행위자(actor)를 의미한다. 따라서 어떤 방식으로 행동하는지를 나타낸다고 볼 수 있다. Reactor : IO 이벤트가 발생하면 직접 반응(React)하여 실행Proactor : 미리, 앞서서(Pro) + IO 작업을 요청해두고, 완료되면 OS가 자동으로 실행 1. Reactor 패턴I/O 이벤트가 발생하면 핸들러(Callback)를 등록해 두고, 이벤트가 발생하면 이를 처리하는 방식 동작 방식애플리케이션이 비동기 작업을 요청하고, 처리할 핸들러(콜백)를 등록I/O 멀티..

backend 2025.02.11

Hexagonal Architecture 마이그레이션

Hexagonal Architecture 마이그레이션프로젝트 내의 모든 서비스의 마이그레이션이 어느정도 마무리되었다. (25-02-22)가장 아래에서 일단락된 스프린트에 대한 후기를 작성했다.   대공사가 진행중입니다.와 너무 양이 많다……….그나마 통계 서비스는 내용이 적고 DynamoDB를 애초에 Adapter 형태로 설계해서 좀 편했다. 뭣도 모르고 사전순으로 피드(Feed) 서비스부터 시작했다가 뭔가 잘못됐다는걸 크게 느껴버렸음.게시글, 공지사항, 이벤트, 댓글, 좋아요 기능에는 PostgreSQL와 Redis를 섞어 쓰고 있기 때문에 엔티티와 외부시스템이 가장 많다. 현재 피드, 매칭, 통계를 담당하는 각 마이크로 서비스는 마이그레이션을 완료한 상태고, 사용자 정보 관리쪽과 게임 결과 관리 서비..

project/wargame 2025.02.11