KKamJi
Preview Image

Datadog RUM 알아보기 - Real User Monitoring 개념과 Observability [Datadog 1]

서버 쪽 observability는 APM, logs, metrics로 비교적 익숙하게 다룹니다. 그런데 “백엔드는 200 OK로 빠르게 응답했는데 사용자는 느리다고 한다”는 상황은 server-side 신호만으로는 잘 잡히지 않습니다. 느린 렌더링, 레이아웃 이동, 브라우저 JS 에러처럼 사용자가 실제로 겪는 문제는 대부분 client-side에서 ...

Preview Image

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

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

Preview Image

빌드 도구와 의존성 관리 - Gradle/Maven과 Spring Boot 패키징

매일 ./gradlew bootJar나 mvn package를 치고, 만들어진 app.jar를 java -jar로 실행합니다. 그런데 그 사이에 무슨 일이 일어날까요. 의존성에 버전을 안 적었는데 어떻게 빌드가 되고, 하나의 jar 안에 라이브러리가 전부 들어가는 건 어떻게일까요. Series 5(빌드/보안)의 첫 글에서는 빌드 도구가 하는 일, 의존...

Preview Image

Spring/JVM Capstone - 업그레이드 후 Old gen과 off-heap 메모리 진단

이 커리큘럼은 하나의 질문에서 시작했습니다. “Spring Boot 메이저 업그레이드(새 JDK/G1GC 동반) 이후, Old gen이 예전보다 높게 유지되고 컨테이너 메모리가 빠듯해 보인다. 메모리 누수일까?” 마지막 글에서는 Series 1~4에서 쌓은 조각(요청 처리, JVM 메모리, GC, 동시성, 데이터 계층)을 모아 이 질문을 끝까지 진단합...

Preview Image

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

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

Preview Image

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

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

Preview Image

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

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