본문 바로가기
반응형

전체 글171

AI, Harness Engineering 구축기: 시스템으로 시스템 생산성 향상 시키기 INTRO최근 몇 달 동안 개발 방식이 많이 달라졌다.예전에는 기능 하나를 구현하려면 IDE를 열고, 설계를 하고, 직접 코드를 작성하고, 테스트를 돌리고, 리뷰 대응까지 대부분 사람이 수행했다. 이 방식은 더이상 언급할 필요가 없을 정도로 과거의 유물이 되었고, Claude Code, Codex, Cursor Agent 같은 AI 코딩 에이전트를 적극적으로 사용하기 시작하면서 생산성이 크게 올라갔다.단순 CRUD나 보일러플레이트 생성 수준을 넘어서, 리팩토링, 테스트 작성, 아키텍처 정리, CI 개선 같은 작업까지 AI가 상당 부분 수행하기 시작했다. 그런데 일정 수준 이상 사용해보면 의외의 결론에 도달한다. 수많은 코드라인이 생겨났지만, 코드의 품질적인 일관성이 같은 모델이라 할지라도 매번 달라지는.. 2026. 5. 30.
Claude Code Agent Teams를 넘어서: claude code + codex + cmux 기반 AI 오케스트레이션으로 발전한 개발 구조 1. 배경지난 글에서는 Claude Code의 Agent Teams를 활용해 여러 AI Worker를 병렬 운영하는 구조를 소개했었다.당시 핵심은:구현 Worker테스트 Worker리뷰 Worker분석 Worker를 역할별로 분리하고, 각각 독립 Context Window를 가진 상태에서 병렬 개발을 수행하는 방식이었다. 하지만 실제 운영을 몇 주 더 진행하면서 느낀 건, Agent Teams 자체보다 더 중요한 계층이 존재한다는 점이었다. 그건 바로 “AI Worker를 어떻게 orchestration 할 것인가” 이다.최근에는 단순 Agent Teams 활용 수준을 넘어, cmux 기반 surface orchestration 구조로 점차 발전시키고 있다. 이 단계부터는 단순 “AI를 병렬로 띄운다” .. 2026. 5. 15.
Claude Code Agent Teams로 “AI 개발 조직” 운영해보기 최근 Claude Code의 Agent Teams 기능을 활용해서 단순한 “AI 코드 생성” 수준을 넘어, 실제 개발팀처럼 여러 AI 세션을 병렬 운영하는 방식으로 개발을 진행하고 있다. 생각보다 중요한 변화는 “AI를 하나의 assistant로 쓰는 것”에서 “AI 개발 조직을 운영하는 것”으로 패러다임이 바뀐다는 점이다. 1. 기존 방식의 한계일반적인 AI 코딩 방식은 대부분 이런 흐름이다.개발자 ↓단일 AI 세션 ↓코드 생성 문제는 작업 규모가 커질수록:Context Window 오염역할 혼재테스트 누락리뷰 부실한 가설에 고착되는 문제속도이슈(한 작업이 마무리 될 때까지 대기)소스 충돌등이 발생 할 수 있다.특히 MSA, 투자 시스템, 이벤트 기반 아키텍처처럼 레이어가 많은 시스템에서는 한 세.. 2026. 5. 10.
UnsupportedClassVersionError ( java 설치 for mac os) 위와 같은 오류 확인 시 적절한 자바 버전을 설치해주면 끝 Homeblew 가 이미 설치 되어 있다는 가정하에적절한 자바 버전을 아래와 같이 설치!brew install openjdk@21 이후 설치가 제대로 되어있는지 확인한다(내가 설치한 자바버전이 리스트에 있으면 OK)/usr/libexec/java_home -V 아래 명령어를 입력해서 등록해주자!export JAVA_HOME=$(/usr/libexec/java_home -v 21)export PATH=$JAVA_HOME/bin:$PATH 그런 다음 자바버전 확인 시 내가 설치한 자바 버전이 노출되면 완료!java -version 혹시나 자동변경되지 않았다면 수동으로 추가하자!vi ~/.zshrc 최 하단에 추가!export JAVA_HOME=$(.. 2026. 2. 4.
Mac OS 내 git setting 하기 (for github) 1. homebrew 설치 - site 에서 다운로드 https://brew.sh/ HomebrewThe Missing Package Manager for macOS (or Linux).brew.sh - terminal 로 다운로드 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 2. Homebrew 에서 git 설치brew install git 3. git config 내 계정연결git config --listgit config --global user.name "XXX"git config --global user.email "XXX@AAA.com" 4... 2026. 2. 3.
[부록] Consumer Retry vs Command Replay 처리 1. Consumer Retry vs Command Replay 처리 : 만약 결제는 성공했는데, 배송 생성이 실패했다면? 환불하는게 적합한 의사결정일까? 배송생성을 재시도 하는게 적합한 의사결정일까? 그럼 환불하면 안 된다면, 시스템은 어떻게 복구되어야 할까? 2. 비동기 이벤트 기반처리 시 실패유형정리순번실패 유형예시처리방안1이벤트 전송실패Kafka publish 실패Transactional Outbox Pattern2Consumer 처리실패DB timeout or 외부 api 장애 등으로 일시적 장애의 경우Kafka Retry / Backoff → 초과 시 DLT3Consumer 이후 비지니스 로직 실패 유형1의도된 예외로 인한 실패(잔액 부족 등)Saga Pattern .. 2026. 2. 3.
[부록] JPA(Java Persistence API) 1. JPA(Java Persistence API) 란? - 자바 진영에서 사용하는 ORM(Object-Relational Mapping) 기술 표준 - 관계형 데이터베이스(RDB)를 자바 객체로 다루기 위한 인터페이스의 집합 2. ORM(Object-Relational Mapping) 이란? - 객체(Object)와 관계형 데이터베이스(RDB)의 테이블을 매핑하는 기술 - 애플리케이션의 객체를 RDB 테이블에 자동으로 영속화(persistence) 해주는 기술 - 개발자는 객체만 다루고, 실제 SQL 생성과 실행은 ORM 프레임워크가 담당 3. ORM 장점 1) SQL이 아닌 객체 중심 개발 - SQL 대신 메서드 호출로 DB 조작 .. 2026. 1. 27.
[부록] Docker for Mysql, Redis, Kafka 1. Docker 란? : VM(Viture Machine)의 경량화 버전으로, 응용프로그램실행에 꼭 필요한 경량화된 OS 및 서버를 설치하여 컨테이너 기반으로 실행, 관리하는 오픈 소스(하나의 격리된 작은 PC 개념) (추가설명 링크: https://www.ibm.com/kr-ko/topics/docker ) 2. Docker 설치 1) 다운로드 : https://www.docker.com/ Docker: Accelerated Container Application DevelopmentDocker is a platform designed to help developers build, share, and run container applications. We handle t.. 2026. 1. 26.
Claude code init setting 1. Claude code 설치npm install -g @anthropic-ai/claude-code 2. 프로젝트 생성 및 이동mkdir kotlincd kotlin 3. Claude code 실행claude 4. intellij plugin 설치 5. Claude 초기화/init 6. claude md 파일 생성 # CLAUDE.md## Project Overview## Build Commands## Tech Stack## Kotlin Compiler Configuration## Architecture & Design Guidelines## Mandatory Rules (Must Follow)## Spring & JPA Guidelines## API & Controller Guidelines## .. 2026. 1. 25.
[부록] REST 기반 마이크로 서비스 간 통신 - OpenFeign 1. 모든 내부 통신을 Kafka 기반 비동기 이벤트로 처리하면? 1) 주문하기와 같은 로직 처리 시 동기로 장바구니 data를 가지고 와야 하는데 kafka 이용 시 성능 감소 및 복잡성 증대 (return 받기 까지 처리시, consumer 제어에서 db 로 부터 data 를 가지고 와서 호출자에게 전달 할 때 - 폴링, 웹소켓등을 사용하여 전달 하여야 함!) 2) 소스레벨의 복잡성 증대로 인해, 개발 비용 증가 3) Kafka 이슈 발생 시 조회도 막힘(서킷 브레이커 fallback 지점 증가) 2. OpenFeign 이란? 1) netflix 에 의해 개발 됨(선언적 http client 도구) 2) HTTP API 호출을 인터페이스 선언만으로.. 2026. 1. 20.
Graceful Shutdown (처리중인 로직이 완료되지 않은 상태에서 종료할 것인가?) 1. K8S 기반 소스 배포 시 기존 POD 내 실행중인 프로세스가 있는 상화에도 불구하고 종료할 것인가? : No, 처리중인 내역이 모두 정상처리 후에 기존 Pod 를 정리해야 한다. 2. Graceful Shotdown 설정(spring boot 2.3이상 지원)server: port: 8080 shutdown: graceful # SIGTERM 수신 시 graceful shutdown 모드 활성화 #생략 spring: profiles: active: "local" lifecycle: timeout-per-shutdown-phase: 20s #종료대기 시간 설정(최대 허용 시간) 3. 처리 순서 1) K8S SIGTERM 을 보냄 2) spring boo.. 2026. 1. 15.
10) Kafka 기반 도메인 분리(3) - Saga 패턴이란? 1. Saga 패턴이란? : Saga 패턴은 분산 트랜잭션을 여러 개의 로컬 트랜잭션(Local Transaction) 시퀀스로 나누어 처리하고, 만약 실패 시 보상(Compensation) 작업을 통해 전체 일관성을 맞추는 패턴.2. 사용사례 1) 결제 중 쿠폰 사용 시 쿠폰 사용가능여부를 확인해서 사용으로 변경 했으나, 결제 시 잔액부족으로 결제를 할 수 있는 상황이 아니라면? → 쿠폰을 다시 사용가능한 형태로 롤백해야 함. (잔액 부족인 상태에서 시스템에서 재시도 해도 잔액부족은 바뀌지 않기때문) 2) 마찮가지로 주문 결제 시 재고차감에 성공하고 결제 시도 시 잔액부족으로 결제를 할 수 없는 상황이라면? .. 2026. 1. 14.
10) Kafka 기반 도메인 분리 (4) Transactional Outbox 패턴이란? 1. CAP 이론 이란? 1) 정의 - 분산 시스템에서 동시에 만족할 수 없는 세 가지 특성을 설명하는 이론 - 2000년 Eric Brewer가 제안 → "Brewer’s theorem" 2) 세 가지 요소 - C (Consistency, 일관성) : 모든 노드가 동시에 같은 데이터를 보며, 어떤 노드에서 읽든 항상 최신 데이터가 보장됨 - A (Availability, 가용성) : 모든 요청에 대해 항상 응답을 돌려줌, 다만 최신 데이터일 필요는 없음 - P (Partition Tolerance, 파티션 허용성) : 네트워크 장애나 노드 분리 상황(P.. 2026. 1. 13.
10) Kafka 기반 도메인 분리 (2) 결제 시 쿠폰도메인을 완전하게 분리하기 1. 도메인 분리를 왜 해야할까?(feat. 트랜젝션 분리) 1) 트랜잭션 범위가 커질수록 장애 전파가 기하급수적으로 증가 - 배송 DB 장애 → 결제 실패 - 결제 PG 지연 → 주문 생성 실패 - 하나의 느린 컴포넌트가 전체를 멈춤"하나만 죽어도 다 같이 죽는 구조” 2) 긴 트랜젝션으로 인해 락 경쟁과 성능 저하 - 오랜 락 유지(대기 시간 발생) - 동시성 감소 - TPS 처리량 하락"특히 결제·재고·배송 같은 핵심 도메인이 하나의 트랜잭션에 묶이면 성능상 병목지점 발생" 2. Kafka 를 이용한 도메인 분리방법은? 1) 각 도메인은 각 도메인에서 처리해야할 것만 책임.. 2026. 1. 13.
10) Kafka 기반 도메인 분리 (1) Kafka 란? 1. Kafka 란? : Apache 재단에 등록된 오픈소스로써, 분산형 스트리밍, 대규모 트래픽처리, 대용량 데이터 처리를 원활하게 처리하기 Message Queue https://kafka.apache.org/ Apache KafkaApache Kafka: A Distributed Streaming Platform.kafka.apache.org 2. Kafka 최근 근황 및 구조 - kafka 의 구성은 main 의 역할인 kafka와 헬스체크 등 보조적인 역할인 zookeeper 가 있음.- Apache Kafka 3.3 버전부터는 KRaft 를 합의 프로토콜로 공식 지정 함.(자체 메타 관리 가능)- 4.0 버전부터는 Zookeeper 를 완전히 제거 함.- 하지만, 대규모 기업 고객 대부.. 2026. 1. 13.
Tech news 참고 사이트 https://www.techmeme.com/ Techmeme www.techmeme.com 2026. 1. 12.
소규모 조직에서 성장을 설계하는 개발총괄의 역할 우리는 아이러니하게도 스스로 생각하는 것보다 훨씬 더 주변 사람들의 영향을 받으며 살아간다. 개인의 의지와 능력이 중요하지 않다는 의미는 아니지만, 현실적으로는 개인의 성과와 성장 속도가 속한 환경의 평균값에 강하게 수렴하는 경우가 많다. 이를 설명하기 위해 두 개의 대학교를 가정해 보자. 성적 수준이 매우 높은 A대학교와, 상대적으로 성적이 낮은 B대학교가 있다. 홍길동이라는 학생이 주변 환경의 영향을 거의 받지 않는 유형이라면, 어느 학교에 가더라도 일정 수준 이상의 성과를 낼 수 있을 것이다. 그러나 동수라는 학생이 주변 환경의 영향을 많이 받는 유형이라면 이야기는 달라진다. 동수는 본래 우수한 학생일 수 있지만, A대학교가 아닌 B대학교에 진학할 경우 성적이 하락할 가능성이 높아진다. 이는 단순히.. 2026. 1. 11.
WebClient vs OpenFeign vs RestTemplate 비교 1. 라이브러리 별 권장 선택Case권장 라이브러리신규서비스 또는 MSA 용Feign or WebClient조직 생산성 및 표준화 측면OpenFeign이벤트 기반, 비동기 스트리밍, 리엑티브 스택WebClient레거시 내 Rest Template 사용 중이고 변경이 어려운 경우RestTemplate 2. 라이브 러리별 추가 설명 1) RestTemplate - 이미 끝난 기술(Spring 5부터 Deprecated), 주니어 개발자에게 RestTemplate뿐 아니라 OpenFeign에 대한 이해도 필요 함. - 이해가 쉬우며, 디버깅이 단순 - 동기 블로킹 I/O - MSA 환경에서 사용 시 logging, auth, retry 다량 증복 발생 .. 2026. 1. 1.
왜 많은 팀은 결국 Webflux와 같은 "Reactive Programming"를 포기하는가? 이 글은 1) 리액티브가 왜 실패하는지를 구조적 측면에서 설명하고, 2) 어떤 조건에서는 여전히 강력한지를 정의하며, 3) Kafka / 메시징이 이 문제를 어떻게 분리하는지를 아키텍처 관점에서 정리해본 것이다. 리액티브를 충분히 써 본 팀은 비슷한 지점에 도달한다.도입 초기의 성과를 지나, 운영 복잡성과 성능 병목을 동시에 마주하는 시점이다. 1. 리액티브의 전제는 명확하다“느린 I/O를 숨긴다”즉, 1) 스레드를 오래 점유하지 않는다. 2) 대기 시간 동안 다른 일을 처리한다. 3)높은 동시성을 적은 리소스로 처리한다 이 모든 것은 하나의 전제 위에서만 성립한다. I/O가 비동기·논블로킹일 것 CPU 작업, 네트워크 I/O, 이벤트 처리 파이프라인, 이 영역에서 리액티브는 압도적으로 효율적이다. 문.. 2025. 12. 22.
bitnami redis cluster 로 local 개발용 도커컨테이너 생성 시 image pull error 운영단에 redis 클러스터를 개발 하기 위해서는 로컬 개발환경도 구성할 필요가 있다.아래와 같이 간단하게 클러스터를 생성해서 사용했었다! services: redis-node-0: image: docker.io/bitnami/redis-cluster:latest ports: - 6479:6479 - 16479:16479 volumes: - ./data2/redis-cluster_data-0:/bitnami/redis/data environment: - "REDIS_PORT_NUMBER=6479" - "REDIS_PASSWORD=1234" - "REDIS_CLUSTER_DYNAMIC_IPS=no" - "REDIS_CL.. 2025. 10. 29.
9) Spring 캐시 (4) Redis 로 캐싱 관리 1. 구현체만 Caffeine 에서 Redis 로 변경 Spring 캐시로 인해 추상체는 그대로 둔채 구현체만 변경가능! 2025. 9. 20.
9) Spring 캐시 (3)redis란? 1. Redis 란? : C언어로 구현된 Key value 기반의 data 저장소(nosql) 이자, pub sub 이 지원 되는 Message Queue 2. Redis 는 어떻게 동작할까? : Redis 핵심 서버 엔진은 단일 쓰레드, 논블로킹 이벤트 루프로 동작 ( 클라이언트 요청 → 이벤트 루프 → 명령 실행 → 응답 하는 구조임) - 이벤트 루프란? 1) 클라이언트가 요청을 보냄 → 소켓 이벤트 감지 2) 이벤트 루프가 해당 명령을 싱글 스레드에서 바로 실행 (대부분의 명령은 메모리 연산이므로 바로 처리 가능) 3) 처리 결과를 바로 클라이언트 소켓에 기록 (별도 스레드 없이도 논블로킹 소켓 사용 가능) .. 2025. 9. 20.
9) Spring 캐시 (2)분산 캐시란? 1. 로컬 캐시의 한계 1) 데이터 불일치(Inconsistency) - 서버 A, B, C가 각각 로컬 캐시를 들고 있을 경우, A에서 데이터가 갱신되더라도 B, C 캐시는 여전히 옛 데이터를 유지 - 분산 환경에서는 캐시 갱신 전파 불가능 2) 메모리 한계 - 캐시 데이터가 많아질수록 JVM Heap / 애플리케이션 메모리 부족(OutOfMemoryError 위험) - GC 부하 증가(애플리케이션 성능 저하로 까지 이어질 수 있음) 3) 확장성(Scalability) 부족 - 서버가 늘어날수록 각 서버가 동일한 데이터를 중복 캐싱(메모리 낭비) - 서버 수평 확장(Scale-out) 환.. 2025. 9. 20.
9) Spring 캐시 (1) HomeBody 상품 리스트 구현 내 "로컬 캐싱" 추가 1. 로컬 캐시란? - 서버 내부 메모리(Heap) 에 데이터를 캐싱하는 방식. - 대표적으로 Caffeine, Guava, EhCache 같은 라이브러리를 사용. - 장점 1) 낮은 지연 시간: DB나 Redis까지 가지 않고 바로 응답 2) 구현 단순: 라이브러리 import 후 간단하게 적용 가능 3) 추가 비용 없음: 별도 캐시 서버 필요 없음 2. 스프링 캐시는? 1) 추상화된 공통 API 제공 - @Cacheable, @CachePut, @CacheEvict, @Caching 같은 어노테이션을 제공 - 개발자는 캐시 라이브러리(Caffeine, Redis, Ehcache 등)를 몰라도 동일한 방식으로 .. 2025. 9. 20.
8) 테스트 코드 작성 (1)테스트 코드란? 1. 테스트 코드란? - 개발한 코드가 요구사항에 명시한 대로 동작하는지 검증하는 코드 - 테스트 자동화로 회귀 오류를 방지하고 안정적인 리팩토링을 지원! 2. 테스트 코드의 작성 이유 - 기능 요구사항의 검증 - 코드 변경 이후 기능 보호 - 문서화 효과 및 설계 개선 "테스트 코드 작성에 무한정 리소스를 투입할 순 없다."(테스크 커버리지 100%목적이 아니며, 중복테스트, 자주 변경되는 테스크 코드는 일단 보류하자)"테스트 케이스는 성공케이스에 대한 집중이 아닌 실패케이스 집중을 통해 시스템의 안정성을 검증하는데 있다."(의도한대로 실패하는가 > 실패상황에서도 장애없이 잘 동작하는가?) 3. Spring Boot에 Kotlin 조합의 테스트 코드 기본 : .. 2025. 9. 20.
알고리즘 별 자료구조 선택 Java Collection 을 권장 하는 경우1. 그래프 알고리즘 - 인접 리스트 표현할 때 : List> 또는 Map>로 사용List> graph = new ArrayList();for (int i = 0; i ());} - BFS나 DFS에서 큐(Queue queue = new LinkedList())나 스택을 쓰는 경우 //BFSQueue queue = new LinkedList();//DFSStack stack = new Stack(); 2. 우선순위가 필요한 경우 - 다익스트라(Dijkstra) 같은 최단경로 알고리즘 : PriorityQueue (최소 힙) 사용. PriorityQueue pq = new PriorityQueue.. 2025. 9. 15.
주요 알고리즘 1. 정렬(Sorting): 정렬은 가장 기본적인 알고리즘 문제 중 하나입니다. 다양한 정렬 알고리즘을 이해하고, 그 특성과 시간 복잡도를 고려하는 것이 중요합니다. 주요 알고리즘: - 버블 정렬(Bubble Sort): 인접한 두 값을 비교하여 정렬하는 단순한 방법입니다. 시간 복잡도: O(n^2). - 선택 정렬(Selection Sort): 배열에서 가장 작은 값을 찾아서 교환하는 방식입니다. 시간 복잡도: O(n^2). - 삽입 정렬(Insertion Sort): 이미 정렬된 부분에 새로운 값을 삽입하여 정렬하는 방식입니다. 시간 복잡도: O(n^2). - 퀵 정렬(Quick Sort): 분할 정복 알고리즘을 사용하여 데이터를 정렬합니다. 평균 시간 복잡도: O(n log n). - 병합 정렬(M.. 2025. 9. 14.
배열(Array) 배열의 특징: 배열은 고정 크기의 연속적인 메모리 공간으로, 동일한 데이터 타입의 여러 값을 저장할 수 있는 자료 구조Java에서 배열은 객체로 취급되며, 특정 데이터 타입의 값들을 저장하는 데 사용 예시코드import java.util.*;public class main { public static void main(String[] args) { arrayTest(); } public static void arrayTest() { int[] arrInt = new int[5]; // 크기 5인 int 배열 생성 arrInt[0] = 10; arrInt[1] = 20; arrInt[2] = 30; arrInt.. 2025. 9. 12.
Java 자료 구조(Collection, Map) Java Playgroundhttps://www.compilejava.net/ Online Java IDE www.compilejava.net Collection interface- 동적 크기: List, Set, Queue와 같은 Collection 구현체들은 동적으로 크기를 조정 가능- 유연한 데이터 처리: Collection은 데이터에 접근하거나 변경할 때 다양한 메서드와 기능을 제공합니다. 예를 들어, 요소 추가, 삭제, 크기 변경 등이 가능- 중복 허용 여부: Set은 중복을 허용하지 않으며, List는 중복을 허용 함- 다양한 컬렉션 타입: Collection은 List, Set, Queue 등 List- LinkedList: 삽입 삭제 등이 빈번할 경우 사용(data 의 순차적 처리가 중요.. 2025. 9. 10.
7) 주요 기능 개발(Back-end) 주요 기능 개발(Back-end)1. 로그인 로그아웃 2. Home body - 최초 진입 시 표시 되는 화면을 위한 기능 - 고객의 유치를 위해 판매가 잘되는 상품들 노출 - 사용가능한 쿠폰 노출 - 추가고려사항 1) 사용자의 접근이 가장 많은 곳 2) 빈번하게 변경되는지 유무 3) 조회되는 data 량 4) 랭킹 로직을 어떻게 구현할 것인가? : 주문량 집계로 간단하게 구현해보자(주문시마다 상품 정보 update) 3. 상품(product) - 간단한 api 개발, 사용자가 상품조회(상품정보, 가격정보, 재고수량) 4. 장바구니(cart) - redis 를 활용한 장바구니 기능 개발 - 상.. 2025. 9. 2.
반응형