JPA Persistence Context and Dirty Checking

A managed entity from findById gets UPDATEd through dirty checking, with no save() call. The three entity states, how snapshot comparison works, what save() actually does, and the persistence context lifetime that all of it depends on.

July 6, 2026 · 4 min read

@Transactional Only Works Through the Proxy

@Transactional doesn’t work just because it’s declared. Spring wraps the bean in a proxy and intercepts only the calls that go through it. Why the annotation is silently ignored on private methods and self-invocation, and how @DataJpaTest’s test transaction hides the defect.

July 5, 2026 · 5 min read

Three Type Systems and Runtimes — JVM, CPython, and the Go Compiler

Java pairs static strong typing with JVM bytecode and adaptive JIT optimization. Python combines dynamic typing with an interpreter and declarative type hints. Go ships static structural typing and a single compiler. The type-system decision drives the runtime mechanism.

June 16, 2024 · 6 min read

Three Concurrency Models — GIL, Virtual Thread, and Goroutine

CPython’s GIL serializes multithreaded execution and pushes work onto multiprocessing or asyncio. Java pinned threads 1:1 to the OS until virtual threads (Java 21) reopened the thread-per-request model. Go shipped with an M:N scheduler from day one. The model you start from decides whether your service goes thread-per-request, reactive, or multiprocess.

June 15, 2024 · 6 min read

Three Garbage Collectors — How Java, Python, and Go Reclaim Memory

All three languages use a garbage collector, but the priorities differ. Java leans on generational + region GCs (G1, ZGC), Python combines reference counting with a cyclic detector, and Go runs a single concurrent tri-color mark-and-sweep. What each GC gave up is what shapes its operational profile.

June 14, 2024 · 6 min read

Everything Is Pass by Value — Memory Transfer in Go, Java, and Python

Calling a function with an object is often described as pass by reference, but in memory all three languages copy values. Java copies a reference value, Python binds a new name to the same object (call by sharing), and Go copies a struct header — escape analysis decides where the values live.

June 13, 2024 · 7 min read

Go Concurrency Model

Go’s concurrency model builds on CSP, providing Goroutines and Channels as core tools. An overview of how each works and when to choose what.

April 5, 2024 · 4 min read

Spring WebFlux Fundamentals — Non-blocking I/O and the Reactive Stack

Spring MVC assigns one thread per request. When I/O waits pile up, threads sit idle. WebFlux replaces this with an event loop-based non-blocking model. A summary of the structural differences from MVC, the Reactor pattern, and when to choose which.

March 25, 2024 · 4 min read

Nest.js Fundamentals — DI and Module System

Nest.js provides a DI container and Module system at the framework level in the Node.js ecosystem. A summary of its core design principles: IoC, DI, Module, and Provider.

February 26, 2024 · 5 min read