WooLam

Vector DB 완전 정복: 개념부터 실무 활용까지

들어가면서 최근 LLM(Large Language Model) 기반 AI 서비스가 빠르게 늘면서, 그 핵심 기술의 하나인 Vector DB가 크게 주목받고 있습니다. 저도 백엔드 개발을 하면서 키워드 기반 검색으로는 풀기 어려운 문제를 자주 만났고, ‘의미’를 이해하는 검색이 필요하다고 느꼈습니다. 예를 들어 “환불”, “돈 돌려받기”, “금액 반환...

WebSocket, STOMP, 그리고 인증: 실시간 서비스의 복잡성을 해결하는 여정

들어가면서 현대 웹 서비스에서 실시간 통신은 선택이 아닌 필수가 되었습니다. 채팅 애플리케이션, 실시간 알림, 협업 도구, 온라인 게임 등에서 사용자들은 즉각적인 정보 업데이트를 기대합니다. 하지만 웹의 근간을 이루는 HTTP 프로토콜에는 이런 실시간 요구사항을 충족하기 어려운 구조적 한계가 있습니다. 이 글에서는 HTTP의 한계부터 WebSocke...

MySQL 인덱스, 무작정 추가하기 전에 알아야 할 것들

들어가면서 백엔드 개발을 하다 보면 “쿼리가 느린데 인덱스 하나 걸어보죠”라는 말을 자주 듣게 됩니다. 하지만 인덱스를 추가한다고 해서 모든 문제가 해결되는 것은 아닙니다. 오히려 잘못 설계된 인덱스는 데이터 삽입이나 수정 성능을 떨어뜨리고 관리 비용만 높이기도 합니다. 처음 인덱스를 접했을 때는 단순히 ‘빠른 검색을 위한 사전’ 정도로만 생각했습...

Spring Cache: 캐시 Key 설계부터 동기화, RedisTemplate 동작 원리까지

들어가면서 Spring 애플리케이션에서 성능 최적화를 이야기할 때 캐시는 빠지지 않습니다. 데이터베이스 부하를 줄이고 응답 속도를 끌어올리는 데 특히 효과가 큽니다. 하지만 @Cacheable 어노테이션 하나 붙이는 것만으로는 부족합니다. 캐시 키를 어떻게 설계할지, 데이터가 바뀔 때 캐시를 어떻게 동기화할지, RedisTemplate이 내부적으로 ...

JPA와 QueryDSL: Q타입, Repository 역할, 동적 쿼리, 연관관계 설계까지 정리하기

들어가면서 JPA로 엔티티와 리포지토리를 다루는 데 익숙해질 무렵, 문득 이런 고민이 들었습니다. “단순한 CRUD는 JpaRepository로 충분한데, 검색 조건이 복잡해지면 어떻게 해야 할까?” 처음에는 메서드 이름 쿼리나 JPQL을 활용했지만, 검색 조건이 늘어나고 동적으로 변해야 할 때마다 코드가 지저분해지고 유지보수가 어려워지곤 했습니다....

PortOne 결제 연동에서 배운 보상 트랜잭션 설계

들어가며 최근 ‘Commerce Payment System’이라는 결제 시스템 프로젝트를 마무리했습니다. 일반적인 상품 주문부터 외부 PG(PortOne) 연동, 포인트 복합 결제, 부분 환불, 정기 구독, 그리고 웹훅 처리까지, 결제 도메인에서 마주하는 온갖 요구사항을 하나의 시스템에 녹여내는 과정이었습니다. 시니어 개발자로서 시스템을 설계할 때...

PG는 최종 진실: 결제 상태 동기화, 왜 웹훅만으로는 부족할까?

들어가며 백엔드 개발자라면 한 번쯤은 결제 시스템을 설계하거나 구현하는 일에 참여하게 됩니다. 이때 가장 중요한 것 중 하나가 결제 상태의 정확성과 일관성입니다. “사용자가 결제 완료 페이지에 도달하면 결제가 성공한 것”이라고 단순하게 생각했다가는 실제 운영 환경에서 예상치 못한 문제에 부딪힙니다. 이번 글에서는 실제 결제 시스템 프로젝트 경험을 바...

Agent OS를 넘어선 AI 개발 워크플로우 자동화: 설계 의사결정 중심의 회고

1. 문제 인식: AI 코드 생성, 그 이상의 자동화가 필요하다 최근 AI 코딩 도구들은 개발 생산성을 크게 끌어올리고 있습니다. Cursor, Codex, Claude Code, Gemini CLI 같은 도구들이 코드 생성과 디버깅, 문서화를 거들며 개발자의 일상에 깊숙이 파고들었죠. 저도 이 도구들을 적극 활용하면서 개발 속도가 빨라지는 걸 체감...

Flyway를 활용한 DB 스키마 관리: ddl-auto=validate와 defer-datasource-initialization의 함정

1. 왜 Flyway가 필요한가? 개발 환경과 배포 환경의 DB 스키마 관리 개발 초기 단계에서는 JPA의 ddl-auto 옵션을 update로 설정하여 엔티티 변경에 따라 데이터베이스 테이블을 자동으로 수정하는 편리함을 누릴 수 있습니다. 하지만 이러한 방식은 실제 배포 환경에서는 매우 위험합니다. 예를 들어 엔티티 필드명이 바뀌거나 컬럼 타입이...