본문 바로가기

728x90

전체 글

머지는 오늘, 공개는 다음 주: 피처 플래그로 배포와 릴리스 분리하기 3주짜리 기능을 개발한다고 하자. 브랜치를 3주 동안 들고 있으면 매일 main과 충돌을 풀어야 하고, 마지막 날의 머지는 리뷰가 불가능한 크기가 된다. 반대로 매일 main에 머지하면 미완성 기능이 운영에 노출된다. 이 딜레마를 푸는 도구가 피처 플래그다. 코드는 매일 운영에 나가되, 기능은 준비될 때까지 꺼 둔다.이 글은 피처 플래그의 개념 정리부터 유형 구분, 점진 공개, 구현 방식, 그리고 가장 많이 무시되는 플래그 부채 관리까지 실무 관점으로 정리한다.배포와 릴리스는 다른 사건이다피처 플래그의 본질은 조건문 하나다.if (featureFlags.isEnabled("new-checkout")) { return newCheckoutService.process(order);}return lega.. 더보기
DB엔 저장됐는데 메시지는 안 나갔다: Transactional Outbox 패턴 이벤트 기반 처리를 설계하다 보면 반드시 한 번은 만나는 문제가 있다. "DB에는 저장됐는데 메시지는 안 나갔다." 회원 상태를 바꾸고 그 사실을 Kafka로 알리는, 흔하디흔한 요구사항에서 시작되는 문제다. 이 글은 그 문제를 푸는 고전적인 해법인 Transactional Outbox 패턴을 정리한 것이다. 패턴의 아이디어부터 동작 흐름, Spring 샘플 코드, 실무에서 반드시 챙겨야 할 것들까지 다룬다.어떤 문제를 푸는가: "두 곳에 따로 쓰기"서비스는 종종 두 가지 일을 동시에 해야 한다.DB에 저장: 예를 들어 회원 상태를 휴면에서 활성으로 변경메시지 발행: "이 회원이 다시 활성화됐다"는 이벤트를 Kafka로 보내, 다른 시스템이 후속 처리문제는 이 둘이 서로 다른 저장소라는 점이다. 둘을 순.. 더보기
코드가 한 줄도 없는 레포부터 만들었다: AI 에이전트를 위한 지식베이스와 하네스 엔지니어링 최근 사내에서 새 화면의 BFF(Backend For Frontend)를 개발하면서, 구현보다 먼저 만든 것이 하나 있다. 코드가 한 줄도 없는 레포, 즉 지식베이스 레포다. 설계 문서·API 계약·코딩 규칙·기능 스펙을 전부 이 레포에 코드처럼 쌓고, AI 에이전트가 이 레포를 읽고 코드를 쓰게 했다. 그리고 에이전트가 쓴 결과물은 사람의 눈이 아니라 결정적(deterministic) 게이트가 먼저 검사한다.이 글은 그 지식베이스 레포의 구조와, 에이전트를 통제하는 하네스(harness) 엔지니어링을 정리한 것이다. 실제 서비스 도메인은 회사 내부 정보라 전부 일반화했고, 여기서 다루는 것은 구조와 패턴 자체다.왜 지식베이스 레포인가AI 에이전트에게 기능 개발을 맡겨 보면 세 가지 문제가 반복된다.컨텍.. 더보기
[DB] 비관적 락, 낙관적 락. Postgres와 MySQL 에서의 차이 /* 비관적 락 vs 낙관적 락, 언제 무엇을 선택해야 할까 */수강신청 시스템, 재고 차감, 정원 1명 남은 강좌 같은 시나리오에서는 반드시 등장한다.나도 실시간 처리, 트랜잭션, 락 전략을 고민하면서 이 두 가지를 계속 비교하게 됐다.단순 정의가 아니라, 언제 써야 하는지까지 정리해본다. /* 비관적 락(Pessimistic Lock) */ 비관적 락은 말 그대로 “어차피 충돌 날 거야”라고 가정한다.그래서 먼저 잠가버린다.대표적인 SQL이 바로 다음이다.SELECT * FROM course WHERE id = 1 FOR UPDATE; 이 순간, 해당 row는 다른 트랜잭션이 수정하지 못한다.DB 레벨에서 직접 잠금을 건다.JPA에서는 이렇게 쓴다.@Lock(LockModeType.PESSIMIST.. 더보기
[Docker] 바인드 마운트 & 볼륨 /* -v 한 줄에 인생이 갈린다 */도커 처음 배울 때 제일 헷갈리는 게 이거다./tmp/greeting 같은 “호스트 경로”를 붙이면 바인드 마운트shared-vol 같은 “이름”을 붙이면 볼륨둘 다 컨테이너에 파일/디렉터리를 붙이는 건 똑같아 보이는데, 운영에서 사고 나는 지점이 완전히 다르다. 아래 예시들로 딱 정리해본다. /* -v 문법부터 통일: 왼쪽이 호스트(또는 볼륨), 오른쪽이 컨테이너 */기본 형태는 이거다.-v :: 소스가 “호스트 경로”면 바인드 마운트소스가 “이름”이면 도커 볼륨(네임드 볼륨) /* 바인드 마운트: 내 PC 폴더를 컨테이너에 그대로 꽂는다 */아래는 호스트 디렉터리 /tmp/greeting/을 컨테이너의 /mnt/에 읽기 전용으로 붙이는 예시다.docker run .. 더보기
[k8s] Master/Worker 노드 /* Master 노드 */주요 : 클러스터 제어 및 관리, 작업 스케줄링 담당Master 노드는 클러스터의 중앙 제어 시스템으로, 클러스터 상태를 관리하고, 워크로드를 스케줄링하며, Worker 노드를 관리하는 역할을 합니다. 여러 주요 컴포넌트로 구성되어 있으며, 이들 컴포넌트가 협력하여 클러스터가 안정적이고 효율적으로 작동하도록 보장합니다. Master 노드가 다운되면 클러스터의 제어 기능에 문제가 발생하며, 특히 단일 Master 노드 구성에서는 클러스터 가용성이 크게 저하됩니다. 이 때문에 프로덕션 환경에서는 일반적으로 다중 Master 노드를 구성하여 고가용성을 보장하고, Master 노드에 문제가 발생해도 클러스터가 지속적으로 운영될 수 있도록 합니다./* 구성 요소 */모든 요청의 중앙 관.. 더보기
[서버] IP 클래스, 서브넷 /* 공부 시작하게 된 계기 */AWS VPC GROUP 를 공부하면서, VPC 설정에 꼭 필요한 IP, 서브넷 설정에서 관련 개념을 정립하기 위해 시작했다./* IP 주소 구성 */IP 주소는 네트워크 상에서 장치를 식별하기 위한 논리적 주소다.IPv4 기준으로 32비트이며, 8비트씩 끊어서 4개의 옥텟으로 표현한다.IP는 일반적으로 192.168.123.132와 같이 마침표로 구분된 4개의 숫자가 있는, 점으로 분리된 10진수 형식으로 표시된다. 이를 2진법으로 표현한다면, 32비트 숫자 1000000.10101000.01111011.10000100 가 된다. IP는 네트워크ID + 호스트ID 로 구성되어 진다. 네트워크ID는 모든 호스트를 관리하기 힘들 기 때문에 한 네트워크의 범위를 지정한 ID이.. 더보기
[알고리즘] 플로이드-워셜 알고리즘 며칠 전 현대오토에버 코딩테스트를 봤다. 거기서 플로이드 워셜 알고리즘이 해결방법 중에 하나라고 해서, 잘 모르는 나는 이번 기회에 공부해서 체득을 하려고한다..!/* 플로이드 워셜 알고리즘 개념 */플로이드-워셜(Floyd-Warshall) 알고리즘은 모든 정점 쌍 간의 최단 경로(All-Pairs Shortest Path, APSP) 를 구하는 알고리즘이다.다익스트라(Dijkstra)는 한 정점에서 다른 모든 정점까지 최단거리를 구할 때 쓰지만, 플로이드-워셜은 그래프의 모든 정점 쌍에 대한 최단 거리를 한 번에 구할 수 있다. 입력그래프의 정점 수 N간선의 가중치 정보 (인접 행렬 dist 형태로 저장, 없는 경로는 INF로 설정)아이디어dist[i][j]: i에서 j까지 가는 최단 거리초기에는 직.. 더보기

728x90