backend 25

Hack Playground: 부산대-부경대 해킹캠프 회고

11월 8일자로 진행된 부산대-부경대 연합 해킹캠프에서 'Hack-Playground' 서비스 내의 CTF 대회를 시범적으로 도입했다. 서비스 자체는 KOREN망 안에서 호화롭게 실험하고 성능 걱정없이 트래픽 때려박던 공모전 기간이 끝나면서, 초라한 운영 서버로 겨우 무료로 연명하고 있었다. 1. 학술 행사에서의 서비스 실사용부산대와 부경대 정보보안 동아리끼리 문제를 제작했고, 해운대에 위치한 동남정보보호클러스터의 훈련장을 지원받아서 오프라인으로 행사를 진행했다. 12시부터 오프라인으로 대회장에 모여서 회원가입 및 소속을 등록하는 참가 수속을 진행하고, 13시부터 CTF 대회를 진행했다. 최대 5명까지 팀을 생성 혹은 참가해서 경쟁하는 구조인데, 무려 8시간 넘게 진행되기에 색다른 트래픽 경험이 될거라..

backend 2025.11.10

토스가 겪은 Reactor Netty의 Memory Leak 이슈를 알아보자

토스에서 제공하는 기술 블로그를 통해서 어떤 사고 과정을 거쳐서 문제를 해결하는지 권위자들의 시야를 엿볼 수 있어서 훔쳐보고(?) 커비처럼 빨아먹어야 한다. 클러스터 안에는 수많은 서버들이 Spring WebClient를 통해 REST API로 통신해서 요청을 처리한다.1. Spring Cloud Gateway의 Memory Leak 이슈 파악하기해당 컨테이너에 지정한 메모리 상한을 사용한 총 메모리가 초과한 경우 OOMKilled 알림을 보낸다. 그런데 Gateway가 왜 OOM으로 죽어? Gateway의 OOM 문제를 트러블 슈팅하는 과정으로 JVM 튜닝에 대한 이야기부터 시작한다. 토스에서는 메모리 할당에 드는 오버헤드를 줄이기 위해서 -XX:+AlwaysPreTouch JVM 옵션을 사용해서..

backend 2025.08.18

AOP를 이용한 @Transactional의 동작 원리 (feat. 트랜잭션의 범위, 전파)

Spring이 제공하는 트랜잭션의 기능트랜잭션 동기화: 컨텍스트 내에서 일관된 처리트랜잭션 추상화: jdbc, jpa 등의 다양한 인터페이스를 동일한 방식으로 제공AOP를 이용한 트랜잭션 분리: 트랜잭션이라는 관심사(Aspect)를 분리해서 비즈니스에 집중시킴 AOP(Aspect Oriented Programming)은 흩어진 관심사를 별도의 클래스로 모듈화하는 방식을 말한다.Aspect: 애플리케이션 내에서 중복으로 존재하는 부가 기능(advice)을 모듈화Advice: Aspect에 구현된 실제의 부가 기능 코드Pointcut: Aspect를 어디에 적용할지 지정 (언제)EX) @GetMapping시에만, UserService만 등의 언제 실행할지 정하는 조건문JointPoint: Advice가 실행..

backend 2025.07.12

JVM 튜닝 목적으로 Heap 덤프 분석은 처음 해봐요 (feat. Eclipse MAT)

OOM 아닌 경우에 직접 힙 덤프 뜨는건 처음인거 같다. 겉핥기식을 넘어서 그래도 덤프 분석을 좀 진득하게 해볼 수 있었다. Heap 메모리는 JVM 내에서 임의로 생성된 객체들이 동적으로 할당되는 공간을 말한다.Heap의 덤프 파일은 운영중인 애플리케이션의 Heap 영역을 snapshot으로 기록한 파일을 일컫는다. GC Logs만 놓고 분석할때는 Eden 영역이 작은지 계속 꽉 차는 일이 잦았다.짧은 수명주기를 가지는 객체가 대부분이어서 GC시 비효율적인 메모리 사용이 생기는 것으로 보인다. ZGC같은 경우는 과도한 CPU 사용이나 TPS 저하문제를 바로잡기 위한 튜닝이 중요하다.Heap 영역을 넉넉하게 잡을수록 GC 주기가 길어진다. 반대로, 작으면 자주 GC를 돌려야해서 TPS가 저하하게 된다. ..

backend 2025.06.13

What Color is Your Function? (feat. 함수의 색 전염성)

본 블로그 글의 내용은 이전 글인 '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...

backend 2025.03.12

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

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

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

backend 2025.02.19