본문 바로 가기

전체 글30

1년 차 회고: 고객의 요청과 요구사항 현재 회사에 입사해 1년 동안 기획과 디자인, 풀스택 개발을 했다. 역할을 넓게 가져가다 보니 고객과 직접 접할 기회가 많았다. 그간의 경험을 바탕으로 간단한 회고를 남긴다.1. 고객 요청을 거절할 용기가 필요하다고객의 요청을 전부 들어주면서 제품을 수정해나가면 결국 프랑켄슈타인이 된다.서비스를 막 런칭한 시점에서는 모든 고객사의 요청을 들어주며 개발을 했다. 그러다보니 결국 상반된 요청이 들어왔고, 모두 맞춰주려 하다보니 설계가 복잡해지고 버그가 자주 발생했다. 더 허무한 건 그렇게 만든 기능의 상당수가 실제로는 필요하지 않았다는 점이다. 어렵게 구현해서 제공해도 이후에 거의 쓰이지 않는 경우가 많았다. 결국 사용자는 코어 기능을 보고 들어온다. 개별 고객을 위한 커스텀 기능이 비즈니스적으로 큰 가치를..
코드가 유일한 진실이 되면, 조직은 어떻게 바뀔까 유발 하라리의 『넥서스』를 읽다가 한 구절에 멈췄다. 1장에서 하라리는 문서의 등장이 세계를 어떻게 바꿨는지를 설명하면서 이렇게 말한다. 문서는 현실을 재현한 것이 아니라, 현실 그 자체가 되었다고. 이 구절을 읽다가 자연스럽게 코드가 떠올랐다.코드는 이미 진실이다개발자가 매일 하는 일의 본질은 현실을 추상화해서 코드로 옮기는 것이다. 할인 정책, 결제 플로우, 사용자 권한 체계. 이 모든 것이 코드로 표현된다. 그리고 그 코드가 제품이 되어 세상에 나가는 순간, 코드는 현실 그 자체가 된다. 기획 문서에 "쿠폰은 최대 3개까지 중복 적용 가능"이라고 적혀 있어도, 코드에서 1개만 허용하고 있다면? 현실은 코드 쪽이다. 코드는 이미 조직 안에서 단일 진실 공급원(Single Source of Truth)..
자바 개발자의 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)현대 운영체제는 각 프로세스에게 독립적인 메모리 ..