[면접 대비] Kafka를 썼는데 왜 Outbox까지 필요했을까?
·
면접 대비
DB와 메시지 발행 사이에서 생기는 정합성 문제 실시간 이상거래 탐지 시스템을 만들면서 결제 Webhook으로 들어온 거래를 Kafka를 통해 비동기로 처리하는 구조를 사용했다. 처음 구조는 단순했다. 거래를 DB에 저장한 뒤 Kafka에 메시지를 보내고 Consumer가 해당 메시지를 받아 이상거래 여부를 판단하는 방식이다.처음에는 이 구조면 충분하다고 생각했다. Kafka가 Producer와 Consumer 사이에서 메시지를 전달해 주고 Consumer에서 문제가 발생하면 재시도나 DLQ를 이용하면 된다고 생각했기 때문이다. 그런데 구현하면서 한 가지 문제가 눈에 들어왔다.DB 저장은 성공했는데 Kafka 메시지 발행에 실패하면 어떻게 될까?이 질문에서 Transactional Outbox를 적용하게..
[프로그래머스] 노란불 신호 (Level 1), 파이썬
·
알고리즘
https://school.programmers.co.kr/learn/courses/30/lessons/468371 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 문제 요약도로에 있는 n개의 신호등이 각각 고유한 주기로 초록불 → 노란불 → 빨간불 순서로 반복됩니다.모든 신호등은 1초에 동시에 초록불 상태로 시작합니다. 이때, 모든 신호등이 동시에 노란불이 되는 가장 빠른 시각(초)을 구하는 문제입니다. 정답 코드import mathdef solution(signals): N = len(signals) max_time = 1 for signal in signals: time ..
[프로그래머스] 중요한 단어를 스포 방지 (Level 1), 파이썬
·
알고리즘
https://school.programmers.co.kr/learn/courses/30/lessons/468370 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 문제 요약문자열로 구성된 메시지 안에서 특정 구간들이 '스포일러'로 지정됩니다.이 메시지를 단어 단위로 쪼개어서 어떤 단어가 스포일러인지 판별하고 최종적으로 특정 조건을 만족하는 단어의 개수를 세어야 합니다. 핵심 규칙단어의 정의: 공백( )으로 구분된 문자열 뭉치입니다.스포일러 단어의 정의: 단어가 차지하는 인덱스 범위중 단 한 칸이라도 주어진 spoiler_ranges의 구간과 겹친다면 그 단어는 스포일러가 됩니다.중복 제거 로직:동일한 단어가 메..
[백준] 2325 개코전쟁 (플래티넘 5), 파이썬
·
알고리즘
https://www.acmicpc.net/problem/2325import sysimport heapqinput = sys.stdin.readlineN, M = map(int, input().split())graph = [[] for _ in range(N+1)]dist = [float('inf')] * (N+1)prev = [0] * (N+1)for i in range(M): a, b, c = map(int, input().split()) graph[a].append((c, b)) graph[b].append((c, a))def dijkstra(start, end): dist = [float('inf')] * (N+1) heap = [(0, 1)] dist[1] = 0..
MCP : AI 모델과 외부 시스템을 연결하는 표준 프로토콜
·
TIL
AI 모델이 점점 “도구를 사용하는 존재”로 확장되고 있다.단순히 질문에 답하는 것을 넘어 파일을 읽고, 데이터베이스를 조회하고, GitHub 이슈를 생성하고, Slack에 메시지를 보내는 수준까지 발전했다. 문제는 여기서 시작된다.모델마다 연동 방식이 다르면, 도구를 하나 추가할 때마다 모델별로 코드를 다시 작성해야 한다.Claude용 구현, GPT용 구현, 또 다른 모델용 구현이 각각 필요하다면 유지보수 비용은 기하급수적으로 증가한다. 이 문제를 해결하기 위해 등장한 개념이 MCP(Model Context Protocol)다.MCP는 AI 모델과 외부 시스템 간 통신을 표준화하는 오픈 프로토콜이다.Anthropic이 주도하여 개발했으며, 다양한 AI 애플리케이션이 데이터 소스와 도구에 일관된 방식으로..
Self-RAG : 검색을 “무조건” 하지 않는 지능형 RAG 아키텍처
·
TIL
기존 RAG는 단순했다. 질문이 들어오면 무조건 검색부터 수행한다. 하지만 모든 질문에 검색이 필요한 것은 아니다.간단한 계산, 일반 상식, 모델 내부 지식으로 충분한 질문에도 임베딩 검색과 벡터 DB 조회를 수행한다면 비용과 지연이 발생한다. 이 문제를 해결하기 위해 등장한 개념이 Self-RAG(Self-Reflective RAG)다. Self-RAG는 단순 검색-생성 구조가 아니라,검색 필요성 판단 → 문서 품질 평가 → 답변 생성 → 자기 검증까지 포함하는 지능형 파이프라인이다.기존 RAG의 구조와 한계전통적인 RAG는 다음과 같은 흐름을 가진다.질문 입력무조건 벡터 검색문서 상위 k개 선택LLM에 전달답변 생성이 구조는 단순하지만 비효율적이다. 예를 들어 이런 질문을 생각해보자.“15 곱하기 1..
Graph RAG : 다중 홉 추론과 지식 그래프 기반 검색
·
TIL
RAG(Retrieval-Augmented Generation)는 LLM의 한계를 보완하기 위한 대표적인 아키텍처다.외부 문서를 검색해 컨텍스트로 제공하고, 그 위에서 LLM이 답변을 생성한다. 하지만 기존 RAG는 “문서 단위 검색”에 기반한다.문서 간 관계를 깊이 이해하지는 못한다. 이 한계를 보완하기 위해 등장한 개념이 Graph RAG다.Graph RAG는 전통적인 RAG에 지식 그래프(Knowledge Graph)를 결합한 구조다.핵심은 “문서 유사도”가 아니라 엔티티 간 관계를 따라가며 정보를 찾는 것이다.기존 RAG의 한계기존 RAG는 다음과 같이 동작한다.문서를 청킹한다.임베딩으로 벡터화한다.유사도 검색으로 관련 문서를 찾는다.LLM에 전달한다.이 방식은 단순 질문에는 강하다.예를 들어“마..
Spring WebFlux : 이벤트 루프와 논블로킹 서버 모델
·
TIL
Spring WebFlux는 “빠른 서버”를 만드는 기술이 아니다.정확히 말하면, 많은 요청을 효율적으로 처리하기 위한 서버 모델이다. 처음 접하면 Mono, Flux, 논블로킹, 이벤트 루프 같은 용어 때문에 어렵게 느껴지지만, 핵심 개념은 생각보다 단순하다.이 글에서는 WebFlux가 왜 등장했는지부터, 내부 동작 방식, Kafka와의 차이, 그리고 언제 사용해야 하는지까지 정리해본다.Reactive Programming이란 무엇인가Reactive Programming은 데이터 흐름(Stream) 중심의 비동기 프로그래밍 패러다임이다. 기존 동기 방식에서는 요청이 오면 스레드가 해당 작업이 끝날 때까지 기다린다.DB 조회나 외부 API 호출이 2~3초 걸리면, 그 시간 동안 스레드는 아무 일도 하지 ..