전체 글72 2026년 상반기 회고 (+ CKA) 상반기 회고를 쓴다면 이 이야기부터 꺼내야 할 것 같았다. 오래 미뤄둔 작은 목표 하나, CKA(Certified Kubernetes Administrator)를 드디어 땄다. 그런데 이 자격증을 "왜 이제서야" 땄는지를 설명하려면, 결국 지난 반년 동안 내가 무엇 때문에 흔들렸는지를 같이 적어야 한다. 이건 합격 후기라기보다, 빨라진 시대에 기초를 다시 붙잡기로 한 한 사람의 기록에 가깝다.돌아보기 전에, 요약부터CKA를 오래 미뤄뒀다가 올해 상반기에야 취득했다. 바빠서라는 핑계도 있었지만, 진짜 이유는 따로 있었다.몇 차례 이직 시도가 뜻대로 되지 않으면서 "나는 지금 빠르게 성과를 내고 있는데, 근본 체력은 오히려 비어 있는 게 아닐까"라는 질문이 계속 남았다.AI 도구가 내 퍼포먼스를 끌어올릴수록.. 2026. 7. 13. GPU는 '코어 많은 CPU'가 아니다 - 웹 백엔드 개발자가 다시 배운 GPU 나는 Kotlin/Spring으로 웹 백엔드를 만든다. 우리 제품의 SRE 영역까지 담당한다. 코드 레벨을 넘어 신경 쓰는 자원은 CPU와 메모리다. 스레드풀 크기를 만지고, 커넥션 풀을 튜닝하고, GC 로그를 들여다본다. GPU는 "게임할 때 그래픽 카드" 정도였고, 솔직히 내 일과는 상관없다고 생각했다. 그런데 언젠가부터 업계 전체가 GPU 얘기만 한다. 클라우드는 GPU를 못 구해 안달이고, 인프라 팀은 "GPU를 어떻게 쪼개 쓰냐"로 회의를 한다. 나 같은 개발자도 이제 GPU가 뭔지는 알아야겠다 싶어서 파고들었다. 그리고 첫 번째로 깨진 착각이 바로 "GPU = 코어 많은 CPU" 였다. 이 글은 그 오해를 부순 기록이다.IntroCPU와 GPU는 코어 수만 다른 게 아니라 설계 철학이 반대다... 2026. 7. 11. API는 소비자의 언어로 말해야 한다: 헥사고날의 진짜 경계, 그리고 AI 시대에 놓지 말아야 할 기본기 헥사고날 아키텍처를 폴더 구조로만 이해하면, 코어를 DB로부터는 지키면서 소비자에게는 그대로 유출하는 이상한 코드가 나온다. 진입점인 Web Controller도 어댑터라는 사실 하나만 놓쳐도 그렇게 된다. 이 글은 "API 계약은 소비자의 언어여야 한다"는 오래된 원칙을 헥사고날의 관점에서 다시 세우고, 코드 생산이 공짜가 되어가는 AI 시대에 개발자가 끝까지 쥐고 있어야 할 기본기가 왜 결국 설계와 사용성인지에 대한 내 생각을 정리한 것이다.사실 이 글은 이론에서 출발하지 않았다. 같은 실수를 반복하는 동료에게 이걸 어떻게 설명해야 할지 며칠을 고민하다 쓰게 됐다. 말로는 몇 번을 해봤는데, "코드는 도는데 뭐가 문제냐"는 얼굴 앞에서 매번 말문이 막혔다. 그래서 내 머릿속에 흩어져 있던 감각, "이.. 2026. 7. 11. 테스트 코드 뜯어보기 - 조연들을 한자리에 테스트 코드 관련 시리즈 글을 따라오며 계속 곁을 스쳤지만 정면으로 다루지 못한 것들이 있다. 여러 확장을 조합하는 @ExtendWith, 테스트를 계층으로 묶는 @Nested, 목에 넘어간 인자를 사후에 붙잡는 ArgumentCaptor, 가독성 레이어인 BDDMockito, 그리고 죽은 스텁을 실패로 노출시키는 Strict Stubbing. 이번 시리즈 마지막 글에서 이 조연들을 한자리에 모았다.Intro@ExtendWith는 JUnit4의 @RunWith(하나만)를 여러 개 조합 가능한 Extension 모델로 대체한 것. before는 선언 순서, after는 역순으로 도는 양파 구조다.@Nested는 테스트를 "대상 메서드 > 시나리오" 계층으로 묶는다. non-static inner class.. 2026. 7. 7. 테스트 코드 뜯어보기 - @ParameterizedTest는 for문의 문법 설탕이 아니다 "같은 로직을 값만 바꿔 여러 번 돌린다"는 점만 보면 @ParameterizedTest는 for문과 비슷해 보인다. 그런데 실패가 났을 때 완전히 다르게 행동한다. 이 차이(실패 격리)와, 그걸 가능하게 하는 ArgumentsProvider SPI, 그리고 enum 상태 전이 검증에 이걸 어떻게 응용할지를 정리했다.Intro@ValueSource, @CsvSource, @MethodSource, @EnumSource는 전부 ArgumentsProvider SPI를 트리거하는 메타 애노테이션이다.@ParameterizedTest가 데이터 N개를 받으면 JUnit은 이를 N개의 독립 invocation으로 취급한다.for문은 첫 실패에서 즉시 중단돼 뒤 케이스가 검증 안 되지만, @Parameterized.. 2026. 7. 7. 테스트 코드 뜯어보기 - MockMvc는 서블릿 컨테이너를 흉내 내는가 @AutoConfigureMockMvc(addFilters = false). 이 한 줄이 무엇을 끄는지, 그리고 인증 필터를 꺼버린 자리를 왜 ThreadLocal을 직접 세팅해서 메우는지를 정리했다. 여기엔 "MockMvc가 진짜 HTTP를 날리는가"라는 오래된 오해와, ThreadLocal 누수라는 flaky 테스트의 단골 원인이 함께 얽혀 있다.IntroMockMvc는 실제 서블릿 컨테이너를 띄우지 않는다. 가짜 서블릿 API를 만들어 진짜 DispatcherServlet에 직접 넘긴다. 요청 매핑부터 @Valid, @ExceptionHandler까지 프로덕션과 같은 파이프라인이 돈다.addFilters = false는 컨텍스트의 Filter 빈들을 MockMvc 체인에 등록하지 않는다. 즉 인증 .. 2026. 7. 5. 이전 1 2 3 4 ··· 12 다음