본문 바로 가기

전체 카테고리28

자바 개발자의 Next.js 분투기, Claude Code 한 달 리뷰 들어가며요즘 AI 코딩 에이전트가 정말 핫하다. 매일매일 관련 새로운 제품 (Jules, spec kit..) 이 올라오고 있고, 유투브에서 제일 성능이 좋다는 에이전트는 일주일 마다 바뀌는 듯 하다. 커서 -> 클로드 코드 -> 코덱스 로가는 느낌..저는 이직을 하면서 이러한 코딩 에이전트를 처음 써보았습니다. 자바와 스프링만 다루던 백엔드 개발자에게 타입스크립트와 Next.js 기반의 풀스택 환경은 막막했습니다. 새로운 회사, 처음 보는 도메인, 게다가 방대한 코드 베이스까지. 어디서부터 손을 대야 할지 감도 안 잡히던 찰나, 마침 회사에서 AI 코딩 에이전트 사용을 적극 권장하는 분위기였습니다. 요즘 워낙 다양한 AI 에이전트가 쏟아져 나오다 보니 뭘 써야 하나 싶었는데, 제가 처음으로 써보기로 한..
안정 해시(Consistent Hashing) 개요데이터 분산 시스템(주로 캐시서버) 를 사용할때, 캐시서버가 새로 추가되거나 다운되는 경우가 있다. 일반적인 해시 알고리즘 (ex. mod) 를 사용하게 되면 모든 데이터가 다시 재배치되어야 한다.이를 방지하고, 일부 데이터들만 재배치하도록 만드는 알고리즘이 Consistent Hashing 이다.기존 해싱위와 같이, 3개의 데이터베이스가 있고, 가장 module 계산을 통해 데이터가 저장될 위치를 지정한다고 하면 위와 같은 상태 일 것이다.그런데, 만약 scale out 을 하게 되어 서버 한개를 추가하게 되면 위와 같은 상태로 변한다.이와 같이 새로운 서버를 추가하게 되면 rehashing 을 해주어야 하는데, 그렇게 되면 대부분의 데이터 위치들이 변경 될 것이다.지금은 데이터가 6개 밖에 없지만..
자바 Serial Minor GC 동작 방식 들어가며GC는 JVM이 더 이상 사용하지 않는 객체를 메모리에서 자동으로 제거하여, 개발자가 직접 메모리를 관리하는 부담을 덜어주는 핵심 기능입니다. 오늘 우리는 그 GC 알고리즘 중 가장 기본적인 Java Serial GC에 대해 알아 보도록 하겠습니다. Serial GC는 다른 복잡한 GC 알고리즘들의 기반이 되는 개념들을 가장 명확하게 보여줍니다. 특히, Serial GC 중에서도 Young Generation 에서 일어나는 Minor GC가 어떻게 동작하는지, 그리고 실제 소스코드를 통해 그 내부를 들여다볼 예정입니다.🛫 가비지 컬렉션의 기본 원리: Mark & Sweep vs. Mark & Copy본격적으로 Serial GC를 알아보기 전에, GC 알고리즘의 가장 기본적인 두 가지 원리인 Ma..
@ExceptionHandler는 어떻게 동작할까? Spring 예외 처리의 내부 동작 원리 파헤치기 들어가며오늘은 우리가 Spring Framework로 애플리케이션을 만들면서 정말 자주 사용하는 '예외 처리'에 대해 이야기해보려고 합니다.아마 많은 분들이 @ExceptionHandler나 @RestControllerAdvice를 사용해 컨트롤러에서 발생하는 예외를 처리해 본 경험이 있을 겁니다. 그런데 혹시 이런 궁금증을 가져본 적 없으신가요?"내가 만든 핸들러가 없는 예외는 대체 어디까지 날아가는 걸까?""Spring은 수많은 컨트롤러와 메서드 중에서 어떻게 정확히 이 예외를 처리할 @ExceptionHandler를 찾아내는 걸까?"Spring Framework의 소스 코드를 직접 따라가며, 예외 하나가 어떤 여정을 거쳐 처리되는지 함께 알아보도록 하겠습니다. 이 글을 다 읽고 나면, 여러분의 예외..
자바 비동기 파헤치기 1편: Future의 내부 구조 들어가며자바 진영에는 비동기 프로그래밍을 위한 여러 도구가 존재하는데요, 오늘은 그중 가장 기본적인 Future에 대해 파헤쳐 보고자 합니다. 단순히 get()을 호출하면 블로킹된다 에서 그치는 것이 아니라, 대체 어떤 원리로 스레드가 잠들고(blocking), 또 어떻게 깨어나는지 그 내부 동작을 함께 엿보겠습니다. 이 글을 끝까지 읽으시면 Future의 동작 원리를 명확히 이해하고, 동시성 프로그래밍에 대한 자신감을 한 단계 더 높일 수 있을 겁니다. 🏡 Future란? - 미래에 받을 결과에 대한 약속Future는 Java 5부터 java.util.concurrent 패키지에 포함된 인터페이스입니다. 이름 그대로 '미래'의 어떤 시점에 결과를 돌려주겠다는 '약속'과 같은 객체죠. 비유하자면, 카페..
리눅스는 어떻게 TLB Flush를 최적화할까? 들어가며오늘은 TLB(Translation Lookaside Buffer), 그리고 컨텍스트 스위칭(Context Switch) 과정에서 발생하는 TLB Flush 최적화에 대한 주제로 글을 작성했습니다. 애플리케이션의 성능을 이야기할 때 흔히 DB 쿼리, API 응답 속도 등을 떠올리지만, 그 아래에는 운영체제와 하드웨어가 벌이는 수많은 최적화 노력이 숨어있습니다. 오늘은 그중 하나인 TLB 최적화의 여정을 리눅스 커널 코드와 인텔 CPU 아키텍처 문서를 통해 함께 따라가 보겠습니다.😤 이론 배경: 가상 메모리와 TLB본격적인 이야기에 앞서, 몇 가지 핵심 개념을 가볍게 짚고 넘어가겠습니다.가상 메모리(Virtual Memory)와 페이징(Paging)현대 운영체제는 각 프로세스에게 독립적인 메모리 ..
스프링 직접 구현하기 #6: AOP 구현을 위한 IoC 컨테이너 리팩토링 들어가며이번 글에서는 스프링의 또 다른 핵심 기능인 AOP(Aspect-Oriented Programming)를 구현해보고, 이 과정에서 기존 IoC 컨테이너를 어떻게 개선했는지 공유하고자 합니다. AOP 기능의 목표는 앞으로 구현할 선언적 트랜잭션의 기반을 마련하는 것입니다. AOP를 구현하려면 특정 메서드가 호출될 때 공통 로직(부가 기능)을 실행시켜야 합니다. 스프링에서는 이를 프록시(Proxy) 객체를 통해 해결합니다. 즉, 실제 빈(Bean) 대신 프록시 객체를 IoC 컨테이너에 등록하고, 의존성을 주입할 때도 이 프록시 객체를 주입해야 합니다. 여기서 기존 구현 방식의 한계가 드러났습니다.기존 방식은 @Component가 붙은 클래스를 모두 스캔한 뒤, (1) 생성자 주입이 필요 없는 빈들을 ..
스프링 직접 구현하기 #5: 톰캣 - I/O Multiplexing 구현 들어가며지난 시간에는 DispatcherServlet 구현과 HandlerMapping, HandlerAdapter의 책임 분리에 대해 알아보며, 콘솔을 통해 요청과 응답을 주고받았습니다. 이번 여정에서는 한 걸음 더 나아가, 우리 애플리케이션의 요청을 가장 먼저 맞이하는 웹서버, 톰캣(Tomcat)의 핵심 기능을 직접 구현해보려 합니다. 기존의 콘솔 입출력 방식에서 벗어나, 소켓(Socket) 기반의 통신으로 시작하여 멀티쓰레딩, 쓰레드 풀, 그리고 톰캣 NIO Connector의 핵심인 I/O Multiplexing (Selector 활용)까지 단계별로 발전시켜 나가는 과정을 작성해보았습니다. 환경JDK 17🏚 WebServer v1: 소켓 기반 입출력의 첫걸음가장 먼저, 기존 콘솔 기반 입출력을 ..