AI 코딩 도구 시대에 Java/Spring 기술 스택을 재정비하는 관점을 다룹니다. Lombok 제거, JPA 대안, Virtual Threads, 선언적 HTTP 클라이언트 등 명시성 중심의 기술 선택을 살펴봅니다.
Posts for: #Java
WELC ver. 2026 Part 5: 의존성 깨기 기법 카탈로그
원서 Chapter 25의 의존성 깨기(Dependency-Breaking) 기법들 중 modern Java에서 특히 유용한 핵심 기법들을 JDK 25 기준의 코드 예제와 함께 카탈로그 형태로 정리합니다.
WELC ver. 2026 Part 4: 대규모 코드 문제 다루기
비대한 클래스, 몬스터 메서드, 중복 코드 등 대규모 코드 문제를 다루는 전략을 JDK 25 기준의 modern Java 코드로 살펴봅니다. SRP, ISP, Open/Closed Principle 등 SOLID 원칙의 실전 적용을 포함합니다.
WELC ver. 2026 Part 3: 테스트 하네스에 코드 넣기
테스트가 전혀 없는 클래스와 메서드를 테스트 하네스에 넣는 기법들을 다룹니다. Hidden Dependency, Irritating Parameter, Global Dependency 등의 문제 상황별 해법과 Characterization Test 작성법을 JDK 25 코드로 보여줍니다.
WELC ver. 2026 Part 2: 안전한 코드 변경 패턴 — Sprout와 Wrap
레거시 코드에 기능을 추가할 때 가장 즉시 적용 가능한 4가지 패턴 — Sprout Method, Sprout Class, Wrap Method, Wrap Class — 를 JDK 25 기준의 modern Java 코드로 재현합니다.
WELC ver. 2026 Part 1: 레거시 코드의 정의와 변경의 역학
2004년 출판된 Michael Feathers의 명저를 2026년 현재 JDK 25 기준으로 재해석합니다. Part 1에서는 레거시 코드의 정의, 변경의 4가지 이유, Legacy Code Change Algorithm, 그리고 Seam Model을 다룹니다.
STITCH 스택으로 JavaScript 없이 모던 웹앱 만들기
Java 백엔드 개발자가 프론트엔드 프레임워크 없이도 인터랙티브한 웹 애플리케이션을 만들 수 있다면 어떨까요? 이 글에서는 STITCH 스택으로 JavaScript 로직을 최소화한 To-Do 앱을 처음부터 끝까지 만들어봅니다.
Java: JEP 444, 485, 506, 519 설명
JEP 444, 485, 506, 519 에 대한 설명과 예제코드를 담았습니다.
AI-Native 아키텍처: Java 25와 Spring Boot 4.0 시대의 에이전트 중심 개발 패러다임
이 포스트는 Java 25(LTS)와 Spring Boot 4.0의 최신 기술 스택을 기반으로, AI 에이전트가 이해하기 쉽고, 수정하기 용이하며, 디버깅하기 좋은 애플리케이션 아키텍처를 심층 분석합니다.
Java to Go: #5. 프로젝트 구조와 생태계
지금까지 Go의 철학, 문법, 에러 처리, 동시성을 살펴봤다. 이제 실제 프로젝트를 시작하는 데 필요한 것들을 다룬다. Maven/Gradle에서 Go Modules로, JUnit에서 testing 패키지로, Spring에서 Go 라이브러리 조합으로 전환하는 방법을 알아보자.
Java to Go: #4. 동시성: Goroutine과 Channel
Go의 동시성 모델은 Java와 근본적으로 다르다. Thread, synchronized, ExecutorService에 익숙한 개발자라면 처음엔 낯설겠지만, Go의 방식이 얼마나 우아한지 금방 알게 될 것이다. “공유 메모리로 통신하지 말고, 통신으로 메모리를 공유하라"는 Go의 철학을 이해해보자.
Java to Go: #3. 에러 처리와 Null 안전성
Java 개발자가 Go를 배울 때 가장 큰 패러다임 전환이 필요한 부분이 에러 처리다. try-catch에 익숙한 우리에게 if err != nil의 반복은 처음엔 원시적으로 느껴진다. 하지만 이 방식에는 명확한 철학이 있다. 이번 편에서 그 철학을 이해하고, Go 방식의 에러 처리에 익숙해져 보자.
Java to Go: #2. 문법 전환 가이드: Java 코드를 Go로 옮기기
Part 1에서 Go의 철학과 언제 Go를 선택해야 하는지 살펴봤다. 이제 실제 코드 레벨에서 Java와 Go가 어떻게 다른지 1:1로 비교해보자. Java 문법에 익숙한 개발자가 Go 코드를 읽고 쓸 수 있도록 핵심 차이점을 정리한다.
Java to Go: #1. Go 첫인상: 철학과 패러다임의 차이
Java를 수년간 써온 개발자가 Go를 처음 접하면 당혹스럽다. “왜 이렇게 만들었지?“라는 생각이 끊이지 않는다. 이 글에서는 Go의 설계 철학을 이해하고, Java에서 Go로의 전환이 언제 적절한지 판단할 수 있는 기준을 제시한다.
번역글: ExecutorService invokeAll 과 가상 스레드 사용하기
invokeAll 은 ExecutorService 의 메서드로, 여러 제출된 작업을 동시에 시작합니다. ExecutorService 는 스레드 풀에서 플랫폼 스레드를 사용하여 제출된 작업을 실행합니다. 이 비싸고 리소스 집약적인 플랫폼 스레드를 사용하는 대신, 가상 스레드를 사용하여 ExecutorService 에 제출된 작업을 실행할 수도 있습니다. 이 글에서는 invokeAll 메서드를 가상 스레드 (virtual threads), 구조화된 동시성 (structured concurrency) 및 플랫폼 스레드 (platform threads) 와 함께 구현하는 모든 방법을 다룰 것입니다.
번역글: Java 스레드 성능 vs. 가상 스레드 vs. Kotlin 코루틴
면접 중에 한 면접관이 저에게 Java 스레드와 가상 스레드의 성능 차이에 대해 물었습니다. 저는 가상 스레드가 실제로는 JVM이 처리하는 경량 스레드이기 때문에 더 빠를 것이라고 답했지만, 둘 사이의 정확한 성능 차이가 궁금했습니다. 그래서 가상 스레드의 성능 향상을 확인하기 위해 간단한 벤치마크를 수행했습니다.
번역글: Java 23: 성능 및 생산성 향상 (2024년 9월)
Java 23은 성능 및 개발자 생산성 향상 추세를 이어갑니다. 기본 타입을 지원하는 패턴 매칭을 개선하고, 더 안전한 메모리 관리를 위해 Scoped Values를 도입하며, 구조화된 API를 통해 동시성을 단순화합니다. Markdown 문서화는 개발자 경험을 개선하고, ZGC가 기본 컬렉터가 되어 더 나은 성능과 낮은 지연 시간을 보장합니다.