KKamJi
Preview Image

JVM 메모리 모델 - Heap과 Non-heap, -Xmx가 제한하는 영역

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

Preview Image

Spring WebFlux와 netty event loop - 적은 스레드, 그리고 off-heap 메모리

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

Preview Image

Spring Security 기초 - 보안 필터 체인, 인증과 인가

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

Preview Image

JPA 영속성 컨텍스트 - 1차 캐시, 엔티티 상태, dirty checking

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

Preview Image

Spring @Transactional과 트랜잭션 전파 - 프록시, 롤백 규칙, REQUIRED vs REQUIRES_NEW

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