GCP Datastream을 걷어내고 자체 CDC 파이프라인을 구축하면서 만난 두 가지 정합성 문제 (feat. AWS Aurora 복제지연)
·
Java & Kotlin
🧐 들어가기전우리팀은 서비스 데이터는 AWS Aurora에서 관리하고, 마케팅 데이터나 외부 데이터의 수집 분석 도구로는 GCP BigQuery를 사용하고 있었다. 서로 다른 클라우드 플랫폼을 쓰다 보니, AWS 쪽 서비스 데이터를 주기적으로 BigQuery로 동기화해줘야 했다. 그리고 이 동기화를 위해 GCP에서 제공하는 Datastream 파이프라인을 이용하고 있었다. 하지만 문제는 비용이었다. Datastream 과금이 데이터 트래픽량에 따라 일별 1만~3만 원씩 빠져나가는 구조였으며, 월 30만~90만 원 사이를 오갔다. 그래서 이러한 비용 부담으로 인해 우리팀은 비용 절감이 필요하다고 판단이 들었고, 이를 위해 Datastream을 걷어내기로 하였다. Datastream을 대체하기 위해 애플리..
[Spring Data JPA] GenerationType.AUTO는 DB 커넥션을 두 개 가진다?
·
Java & Kotlin/JPA
🧐 들어가기전@Entitypublic class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) // 기본 키 생성 전략 지정 private Long id; private String name;}스프링 데이터 JPA를 활용하여 엔티티를 설계할 때 가장 먼저 마주하는 고민 중 하나는 기본 키 생성 전략을 어떻게 설정하느냐이다. 단순히 @Id와 @GeneratedValue를 붙이는 것으로 끝나는 것 같지만, 실제로는 GenerationType에 따라 동작 방식이 달라지고, 성능이나 트랜잭션 처리 흐름에도 영향을 준다. 특히 save() 메서드 호출 시점에 어떤 쿼리가 실행되는지, 그리고 DBCP(Connection P..
[Kotlin + SpringBoot] @Transactional 안에서 외부 API 호출 시 발생하는 문제
·
Java & Kotlin/JPA
🧐 들어가기전@Componentclass ChatFacade( private val threadService: ThreadService, private val chatService: ChatService, private val openAiService: OpenAiService,) { @Transactional fun handleChat( userId: Long, question: String, isStreaming: Boolean?, model: String? ): Chat { val thread = threadService.upsertThread(userId) val previousChats ..
[Kotlin + SpringBoot] Flowise + LLM 에러분석 자동화 적용기
·
Java & Kotlin
🧐 들어가기전개발과 운영의 경계에서 늘 서비스 안정성에 대한 고민은 계속됐다. 특히 예측 불가능한 에러가 발생했을 때, 빠른 인지와 정확한 원인 분석은 장애 시간을 최소화하고 사용자 경험을 보호하는 데 핵심적인 역할을 수행한다. 하지만 매번 발생하는 에러 로그를 일일이 확인하고 그 방대한 데이터 속에서 유의미한 패턴과 근본 원인을 찾아내는 일은 시간과 노력이 소모되는 고된 작업이었다.이 과정 속에서 조금 더 생산성과 효율성을 높이고자 하는 인프라 구축에 대한 필요성을 느꼈다. 그러던 중 최근 토스(Toss) 테크 글을 보게 됐고, "에러를 누군가가 분석해주고 결과와 해결 방법만 제시해서 알림만 오도록 구현할 수 있다면?"이라는 상상이 현실로 실현되는 자동화 구축 사례를 접했다. 해당 글을 참고하며, 우..
[JSP] 서블릿, 서블릿 컨테이너 (feat.톰캣)
·
Java & Kotlin
🧐 들어가기전 최근에 k6로 부하 테스트를 진행하면서, 요청이 몰릴 때 톰캣이 밀리며 응답 속도가 느려지는 현상을 확인할 수 있었다. 현상 자체는 이해가 갔지만, 정작 '톰캣이 밀린다'는 게 정확히 어떤 구조적인 이유에서 비롯된 건지는 잘 모르겠다는 생각이 들었다. 톰캣이 뭔가 처리를 못하고 대기열이 쌓이는 건 알겠는데, 그 안에서 서블릿은 어떤 역할을 하고, 서블릿 컨테이너는 어디까지 책임지는지 등 기본적인 개념이 모호하게 느껴졌다. 그래서 이번 기회에 톰캣의 동작 원리를 중심으로, 그 핵심 구성 요소인 서블릿과 서블릿 컨테이너에 대해 제대로 정리해보려고 한다.🔸Servlet(서블릿)1️⃣ 서블릿이란? 자바 기반의 웹 요청 처리용 서버 사이드 컴포넌트로, HTTP 요청을 받아 처리하고, 그 결과를..
[Spring Data JPA] Offset 기반 Pagination 성능 향상하기 (index 설정, count 쿼리 캐싱)
·
Java & Kotlin/JPA
🧐 들어가기전프로젝트를 진행하면서 Pageable을 활용한 검색 필터링 API를 구현해야 했다. 이 API는 프로젝트의 핵심 자재인 원단을 등록하고 조회할 때 사용되며, 비즈니스 로직의 특성상 원단은 빈번하게 조회해야 하며, 조회 결과를 기반으로 다음 단계의 로직이 수행되기 때문에 조회 성능이 매우 중요한 요소였다. 해당 API는 총 다섯 개의 파라미터를 받는다.page, size, startDate, endDate, 그리고 fabricTypeName이며, 이 중 fabricTypeName만 필수로 입력받고 나머지 값들은 선택적으로 전달된다. JPA Repository에서는 아래와 같이 @Query를 사용하여 JPQL로 조회 조건을 정의하였다: @Query( """ SELECT f F..
J_hzlo
'Java & Kotlin' 카테고리의 글 목록