[Spring/Kotlin] @Transactional 내부 코루틴의 트랜잭션 가시성 문제 - @TransactionalEventListener로 해결하기
@Transactional 메서드 내부에서 코루틴을 실행하면 미커밋 데이터를 읽지 못하는 트랜잭션 가시성 문제가 발생합니다. Spring의 @TransactionalEventListener(AFTER_COMMIT)로 해결하는 과정을 공유합니다.
@Transactional 메서드 내부에서 코루틴을 실행하면 미커밋 데이터를 읽지 못하는 트랜잭션 가시성 문제가 발생합니다. Spring의 @TransactionalEventListener(AFTER_COMMIT)로 해결하는 과정을 공유합니다.
Kotlin Coroutines에서 Spring @Async로 – 대화 요약 비동기화로 API 응답 시간 71% 개선한 이야기 안녕하세요. duurian 팀에서 백엔드 개발을 담당하고 있는 정지원입니다. 이번 글에서는 AI 기반 대화 서비스에서 대화 요약(Conversation Summary) 기능의 비동기 처리 전략을 Kotlin Coroutin...

Spring WebFlux WebClient를 활용한 OpenAI API 호출 최적화 경험을 공유합니다. 커넥션 풀링, 타임아웃, 재시도, gzip 압축, 에러 관리 등 7가지 핵심 개선 사항을 다룹니다.

[MCP] Blog Generator MCP 개발 심층 분석: AI로 기술 블로그 자동 생성 서버 구축기 안녕하세요. 백엔드 개발자 정지원입니다. 현재 AI를 활용한 개발 자동화 도구 개발에 몰두하고 있습니다. 이 글은 Blog Generator MCP의 설계부터 6번의 메이저 버전 업그레이드까지의 여정을 심층적으로 다룹니다. 재미있는 점은, 이 글...

Kotlin 코루틴의 suspend 함수에서 @Transactional을 사용할 때 발생하는 트랜잭션 컨텍스트 유실 문제와 4가지 해결 방안을 알아봅니다.
다수의 보상을 일괄 수령할 때 발생하는 동시성 문제를 해결하고, @Modifying 쿼리 사용 시 영속성 컨텍스트 관리를 통한 데이터 정합성 확보 방법을 알아봅니다.

계기 스프링 프로젝트를 진행하면서 임시 데이터베이스 구현할때, MySQL과 같은 데이터베이스 서버를 사용하지 않고, 임시로 인메모리에 데이터를 저장하는 방식을 구현하였다. 이때, Database 클래스의 맴버 변수로 엔티티 리스트를 저장할 때 static 키워드를 사용하는 예제를 보고 static 키워드의 의미와 언제 사용해야 하는지 정리하였다. ...

Series NestJS와 Socket.io를 통한 실시간 위치 처리 개발기 1 NestJS와 Socket.io를 통한 실시간 위치 처리 개발기 2 썸네일 이미지 출처 : NestJs and Socket.io chat application with data persistence 이전 장에서 MySQL에 geometr...

Series NestJS와 Socket.io를 통한 실시간 위치 처리 개발기 1 NestJS와 Socket.io를 통한 실시간 위치 처리 개발기 2 썸네일 이미지 출처 : Working with geographic features and spatial data in MySQL 8 위급 상황 대응 시스템을 개발하기 위...

이전 프로젝트에서 코치와 사용자간의 1대1 채팅을 구성하였습니다. 코치의 역할과 사용자의 역할이 분명하게 분리되어 있습니다. 따라서 저희는 코치와 사용자의 컬렉션을 분리하여 모델링을 하였습니다. 이로 인해, 채팅의 발송자를 필드에 추가하기 위해선 하나의 컬렉션의 필드에서 여러 컬렉션의 references를 가져야합니다. 또한 채팅을 보낸 유저의 ro...