What Color is Your Function? (feat. 함수의 색 전염성)
·
backend
본 블로그 글의 내용은 이전 글인 'Java도 한다 경량 쓰레드 (Virtual Thread)' 중에서 설명하는 함수의 색상 문제를 다룬다. Java도 한다 경량 쓰레드 (Virtual Thread)봄(Spring)은 왔는가?Java의 위대한 산물인 가상 쓰레드는 분명 JVM 생테계에 엄청난 열풍을 일으켰음에 의심할 여지가 없다.많은 개발자들이 그 패러다임에 발맞춰서 프레임워크를 개선하고 있듯downfa11.tistory.com   함수의 색 문제 (Function coloring Problem)아래의 포스트에서부터 시작한 논의로 Java, Kotlin, Go 등의 언어에 대해서 활발하게 이야기되고 있다.  What Color is Your Function? – journal.stuffwithstuff...
데이터에 기반한 사용자 행위 분석 - 어떤 데이터를 수집해야할까?
·
project/wargame
공격적인지 등의 플레이 스타일이나 성향 분석도 재밌을 거 같고, 인게임 데이터를 수집해서 사용자의 행위를 분석하면서 AFK나 탈주같은 트롤 행위를 검출하면 좋을 것같다. 추후 수집된 데이터들을 기반으로 다시 고민해보겠다. 일단 수집이 먼저다.  데이터 파이프라인(Data Pipeline) 구축e커머스 서비스들로 예시를 들자면, 구매나 배송같은 트랜잭션 작업 이외에 장바구니에 담거나 다시 꺼내고 쿠폰을 적용하는 모든 사용자 액션을 로그 데이터로 수집하고자 한다. 이런 사용자 행위를 수집하고 분석하는 데이터 파이프라인을 구축하는 것을 목표로 한다. 기존에 이미 사용하고 있던 Kafka를 통해서 데이터를 스트리밍할 생각이다. Case 1. Kafka Consumer가 이벤트를 받아서 구축한 ELK에서 분석Ca..
데이터베이스 인덱스는 왜 B-tree를 사용하는가?
·
tech
서론 - 인덱스에서 쓰이는 B tree가 뭔데? Tree 구조는 기본적으로 탐색시 시간복잡도 O(log N)을 가진다.  하지만 최악의 경우, 트리 노드가 한쪽 방향으로 쏠려서 O(N)을 가지게 된다.이런 경우를 방지하기 위해서 Balanced Tree를 이용한다.  balanced tree : 노드 삽입 및 삭제시 특정 규칙에 맞게 재정렬되어 양쪽 자식 수의 밸런스를 유지하는 트리최악의 경우에도 각 연산이 무조건 O(log N)를 보장하며 redblack-tree나 b-tree가 여기에 해당한다.   본론 - 각 자료구조간 비교를 통해 확인해보자데이터베이스의 인덱스에서는 위의 B tree와 B+tree 자료구조를 채택해서 사용하고 있다. 그렇다면 다른 자료구조도 많은데 왜 하필 저 녀석들을 사용할까? ..
Service Mesh - Kubernetes가 있는데 왜 Istio가 필요한가요?
·
kubernetes
사실 wargame 프로젝트에서 운영하면서 도입해보고 싶었는데, 공부하면서 더욱 불필요하다고 느꼈다.일단 마이크로서비스의 수나 아키텍처 복잡도 수준이 Service Discovery나 API Gateway 정도로 관리하기 어려울 정도의 규모가 안된다. 좀 더 프로젝트가 확장되면서 양질의 서비스가 추가된다면 그때서야 다시 도입을 고민해보겠다.지금은 회사에서 쓰는 것도 아니고 '이런게 있다~' 정도만 이해하고 넘어가겠다.​ 대충 이런 궁금증Istio가 Kubernetes에서 실행되는 이유가 뭔가?클라우드 환경에서 배포되는 애플리케이션 아키텍처에서 Kubernetes와 Service Mesh의 역할이 무엇인가?Istio는 Kubernetes의 어떤 측면(aspect)를 확장하는가? 혹은 어떤 문제점을 해결해주..
Java도 한다 경량 쓰레드 (Virtual Thread)
·
backend
봄(Spring)은 왔는가?Java의 위대한 산물인 가상 쓰레드는 분명 JVM 생테계에 엄청난 열풍을 일으켰음에 의심할 여지가 없다.많은 개발자들이 그 패러다임에 발맞춰서 프레임워크를 개선하고 있듯이, 나도 얼른 쫓아가겠다.  * 구조도를 직접 그린게 이해하기 어려우면 맨 아래의 출처에 가면 다른 이미지도 있습니다  Java의 기존 쓰레드 모델 (JDK 17 이하)컨텍스트 스위칭을 통해 OS 자체의 리소스를 점유하는 방식으로, JVM 내에서 플랫폼 쓰레드를 생성할때 JNI를 사용해서 OS(Kernel) 쓰레드에 직접 매핑되도록 설계되었다.  Heap에 존재하는 수많은 유저 쓰레드 중 하나가 JVM의 스케줄링에 따라서 커널 쓰레드에 매핑되어 실행되는 기존 구조스케줄링은 ExecutorService에 의해서..
JVM의 Garbage Collector 분석 (feat. ZGC와 G1간의 차이점 비교)
·
backend
우리는 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..
Java17 - String 클래스의 최적화
·
backend
기존 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 성능 최적화작은 크기의 문자열을 더욱 빠르게 처리..
Tomcat, Netty의 쓰레드 덤프 분석을 통해 병목 지점을 분석해보자 - Prometheus,Grafana를 통한 시각화 모니터링
·
backend
자바 쓰레드의 상태(Thread State)상태 전이에 대해 간략하게 설명하기 전에 종류나 알고 가자NEW : 쓰레드가 생성되었으나 아직 시작되지 않은 상태 (아직 OS 쓰레드는 존재하지 않는 상태)Thread.start()를 호출해야 OS에서 실제로 쓰레드를 생성RUNNABLE : 쓰레드가 실행 가능하여 OS의 리소스를 기다리거나 JVM 안에서 실행중인 상태OS 스케줄러의 실행 대기열에 포함되었다가 차례로 CPU에서 실행된다.BLOCKED : 쓰레드가 동기화 락을 기다리며 Block된 상태WAITING : 무한정 대기중인 쓰레드 (CPU 입장에서 Waiting과 Blocked는 동일)TIMED_WAITING : 쓰레드가 지정된 시간동안 대기TERMINATED : 실행 완료되었거나 예외가 발생하여 종료된..
Windows In Docker - C++ 프로젝트의 컨테이너화 빌드 및 관리
·
windows
Windows 환경의 C++ 프로젝트의 컨테이너 이미지 관리혹자는 Linux 환경에서 C++ 빌드도 되는데, 그냥 리눅스로 도커 이미지 빌드하면 안되냐고 할 것이다. 하지만 제목에서 말해주듯 IOCP 게임서버에 관한 내용으로, IO Completion Port는 윈도우 OS의 커널 오브젝트이다.Overlapped IO를 통해 OS에 종속될 수 밖에 없는 Proactor 비동기 기술의 비애라고 볼 수 있겠다. 어쩔 수 없이 Windows 플랫폼을 고집해야하는 상황이고, k8s 환경에서 다른 마이크로서비스들과 함께 관리하기 위해서라도 컨테이너화 빌드도 필요한 상황이다.  핵심 : Visual Studio 빌드 시스템 사용 (.vcsproj 프로젝트 파일) FROM mcr.microsoft.com/window..
스프링에서 제공하는 Redis 직렬화/역직렬화 도구의 한계와 직접 구현 (Snappy 압축)
·
backend
Redis에서도 동일하게 클래스 정보를 넘겨주게 되면 저장공간을 사용하게 될 뿐만 아니라, 클래스 정보가 변경되는 경우 캐시 정합성 문제가 생길 수 있다. 따라서 압축을 적용하는 것이 합리적이라 볼 수 있고, 추가적인 CPU 처리를 하더라도 Redis 사용량을 줄일 수 있는 직렬화 도구를 직접 구현하여 적용해보자.   스프링에서 Redis 사용 (spring-data-redis)Redis는 기본적으로 byte 배열을 사용해 데이터를 저장한다.spring-data-redis에서는 데이터를 직렬화해서 Redis에 기록하고 역직렬화하는 도구를 제공한다. 하지만 스프링에서 제공하는 직렬화/역직렬화 도구를 그대로 활용하면 몇가지 문제가 있으며 어떻게 개선할 수 있을지 살펴보자. Spring 진영에서는 Redis를..
Hexagonal Architecture의 테스트코드 작성 (feat. StepVerifier, TestPublisher)
·
backend
프로젝트를 Hexagonal Architecture로 개발하면서, 외부 시스템과 소통하는 Port 인터페이스를 통해서 실제 비즈니스를 담당하는 UseCase의 구현체인 Service를 검증할 수 있다. 독립적인 테스트 코드비즈니스 로직이 외부 시스템에 의존하지 않으므로, 독립적으로 단위 테스트(Unit Test), 빠른 테스트 실행DataBase, HTTP Client, 메시징 등의 외부 시스템에 대한 각 Adapter는 독립적으로 테스트 가능의존성의 대체(Mock, Stub, Fake)Port-Adapter 패턴으로 인해, 실제 사용하는 외부 시스템이 아닌 Mock 등 으로 활용한 테스트 가능예를 들어, DB Adapter 대신 InMemoryRepository를 사용하여 테스트할 수 있다.  테스트코..
minikube로 로컬 환경을 구축해보자 (feat. Kubernetes Java Client 도입)
·
kubernetes
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..