
JVM 메모리 모델 - Heap과 Non-heap, -Xmx가 제한하는 영역
앞 편에서 프로세스 메모리가 stack/heap 등으로 나뉜다는 CS 기초를 다시 잡았습니다. 이번 편은 그 위에서 JVM이 자기 메모리를 어떤 영역으로 조직하는지를 봅니다. JVM도 하나의 프로세스지만, 자기만의 “런타임 데이터 영역(runtime data areas)”으로 메모리를 관리합니다. 이 편의 한 문장: -Xmx는 Heap만 제한한다. ...

앞 편에서 프로세스 메모리가 stack/heap 등으로 나뉜다는 CS 기초를 다시 잡았습니다. 이번 편은 그 위에서 JVM이 자기 메모리를 어떤 영역으로 조직하는지를 봅니다. JVM도 하나의 프로세스지만, 자기만의 “런타임 데이터 영역(runtime data areas)”으로 메모리를 관리합니다. 이 편의 한 문장: -Xmx는 Heap만 제한한다. ...

Series 3 1편에서 리액티브는 “블로킹을 하지 않는다”는 데까지 봤습니다. 그런데 블로킹을 하지 않으면 서버 스레드는 구체적으로 어떻게 동작할까요. “적은 스레드로 많은 요청을 처리한다”는 말의 실체는 무엇이고, netty가 쓰는 메모리는 왜 JVM 힙 바깥(off-heap)에 있을까요. 이번 글에서는 Spring WebFlux의 실행 모델인 e...

Series 1 3편에서 Spring MVC는 thread-per-request, 즉 “요청당 워커 스레드 1개가 I/O를 기다리는 동안에도 묶여 있다”고 했습니다. Series 3은 그 블로킹을 하지 않는 다른 모델 - 리액티브(WebFlux) - 을 다룹니다. 그 첫걸음으로 이번 편은 리액티브의 개념과 Reactor의 기초를 잡습니다. TL...

gcloud CLI를 사용하며 알게 된 CLI 명령어들을 공유합니다. 1. 기본 설정 및 초기화 gcloud init # 대화형 초기 설정 (계정/프로젝트/리전) gcloud version # 설치된 gc...

Series 3 1편에서 리액티브와 Reactor의 기초를, 2편에서 WebFlux의 event loop와 netty direct memory를 봤습니다. 그러면 자연스러운 질문이 남습니다. 그래서 새 서비스에 MVC를 쓸까, WebFlux를 쓸까. 흥미롭게도 Spring 공식 문서의 답은 “무조건 최신(WebFlux)”이 아니라 의외로 담백합니다. ...

Series 5 1편에서 빌드와 의존성을 봤습니다. 의존성에 spring-boot-starter-security를 더하면 갑자기 로그인 화면이 뜨고 권한 없는 요청은 막힙니다. 이 동작의 정체는 무엇일까요. 정답은 컨트롤러 앞단에 서는 필터 체인입니다. 이번 글에서는 Spring Security의 구조(필터 체인), 그리고 인증(누구인가)과 인가(무엇...

앞선 S3 Tables & Catalog Federation 글에서 관리형 Iceberg 레이크하우스가 s3tablescatalog 아래에 어떻게 중첩되는지, 그래서 ARN이 왜 깊어지는지를 정리했습니다. 이번 글에서는 이 federated 데이터에 한 겹 더 얹히는 권한 계층, AWS Lake Formation을 알아봅니다. Lake For...

Series 4 1편에서 영속성 컨텍스트를, 2편에서 트랜잭션을 봤습니다. JPA를 쓰면서 가장 자주 만나는 성능 문제는 N+1 selects입니다. 분명 코드는 단순한데 로그를 보면 SQL이 수백 번 나가는 상황입니다. 이번 글에서는 N+1이 왜 생기고, fetch join / batch size / EntityGraph로 어떻게 해결하며, 어떤 함...

JPA로 데이터를 다루다 보면 이상한 경험을 합니다. 엔티티의 필드를 바꾸기만 했는데 update() 같은 걸 부르지 않아도 DB에 반영됩니다. 같은 트랜잭션에서 같은 id를 두 번 조회하면 두 번째는 쿼리가 안 나갑니다. 이 “마법”의 정체가 영속성 컨텍스트(persistence context)입니다. 이번 글에서는 영속성 컨텍스트가 무엇이고(1차 ...

Series 4 1편에서 영속성 컨텍스트의 수명이 트랜잭션에 묶인다고 했습니다. 그 트랜잭션을 거는 도구가 @Transactional인데, 메서드에 한 줄 붙이면 트랜잭션이 시작되고 끝납니다. 그런데 정확히 어떻게 동작할까요. 언제 롤백되고, 트랜잭션 메서드가 또 다른 트랜잭션 메서드를 호출하면 어떻게 될까요. 이번 글에서는 @Transactional...