본문 바로가기

Backend21

[Spring] Redis ShedLock 이론과 구현 스케줄러로 API를 요청해 데이터를 받아오고 있었는데, 다중 서버 환경에서 스케줄러가 각 노드마다 개별 동작하여 동일한 API 요청이 서버 대수만큼 중복 발생하는 문제가 있었다. 이로 인해 다음과 같은 현상이 발생했다. 거의 동시에 응답이 왔을 때 redis에 저장되어 있는 응답의 개수가 덮어씌워져(Lost Update) Loki와의 데이터 정합성 문제가 발생API 요청 성공유무를 보여주는 화면 UI에 중복된 상태값이 표시되고, 서버 개수에 따라 관리자에게 보여지는 API 요청 개수가 달라지는 등 부정적인 사용자 경험을 유발외부 서버(PHIS)와 내부 리소스(Redis, Loki)의 불필요한 부하를 초래이러한 멀티 노드 간 중복 작업을 차단하여 파생되는 문제를 방지하기 위해 스케줄러 분산 락 매커니즘(S.. 2026. 1. 16.
[Spring] TaskScheduler 이론과 구현 0. 개요외부 API에 보낸 요청의 상태를 모니터링하는 기능을 개발하던 도중, 기존의 polling 방식이 서버에 불필요한 부하를 만들고 있었음을 파악했다. Polling 했던 목적이 클라이언트(관리자)가 스케줄러를 통한 API 요청에 대한 응답이 잘 오고 있는지 확인하기 위함이었다. 요청 이후 30초안에 응답이 오지 않으면 '지연', 50초 안에 응답이 오지 않으면 '초과'임을 클라이언트에게 전달해주어야 했기에 이를 위해 최대한 빠르게 문제 상황을 전달해 주기 위해서는 짧은 주기의 polling이 요구되었다. 하지만, 이벤트 발생 시에만 클라이언트에게 정보를 전달해주면 되었기에 SSE를 고려하게 되었고, 서버 측에서 정해진 특정 시점에만 확인 후 이벤트를 발생시키면 되었기에 방법을 찾아보았다. Task.. 2026. 1. 15.
SSE 동작 원리 네트워크 단까지 파해쳐보자! 프로젝트에서 SSE를 적용하게 될 것 같아 공부해보았다. 아래의 자료들을 참고했다. https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-ann-async.html#mvc-ann-async-ssehttps://www.baeldung.com/spring-server-sent-events1. SSE란 무엇일까? 클라이언트의 요청으로 인해 서버와 클라이언트가 TCP 연결을 맺고, 해당 연결을 유지하며 서버가 클라이언트에게 단방향으로 여러차례 스트림 데이터를 전달(스트리밍)하는 것이다. 이를 통해 클라이언트의 지속적인 요청 없이도 서버에 변화가 생기면 즉시 클라이언트에게 전달할 수 있다는 특징이 있다. ResponseBodyEmitter라는 반.. 2025. 9. 2.
[Python] MySQL 대규모 데이터 삽입 로직 고도화: 비동기, Bulk Insert, 멀티스레드 적용기 프로젝트에서 나스닥에 상장되어있는 약 만개의 종목들에 대해 날짜별로 종가, 시가, 고가, 저가의 최소 60년치의 데이터를 필요로 했다. API가 주지 않는 일부분의 데이터를 감안하고 생각해봤을 때 약 1억 4천개의 데이터를 삽입해야했고, 매일매일 만개의 레코드씩을 추가로 삽입해야 했다. 그래서 이김에 대규모 데이터 삽입 로직을 좀 열심히 만들어봤다.  먼저 내가 겪었던 로직 고도화 단계는 다음과 같다.*()안에 적힌 값은 한달 단위 데이터들을 넣을때 소요되는 시간이다. 1. 단일 쓰레드, Batch 미사용 (97m)2. INSERT IGNORE 사용하여 중복 데이터 무시 (80~100m)3. 비동기처리 통한 동시 작업과 executemany 통한 네트워크 오버헤드 감소 (50m)4. Bulk Insert.. 2025. 1. 25.
[Spring Data Jpa] 3가지 방법으로 N+1 문제 해결해보기 (Fetch Join, Batch Fetching, EntityGraph) JPA N+1 문제란? JPA의 N+1문제는 연관관계가 설정된 엔티티를 조회할 경우에, 조회된 데이터 개수(N)만큼 연관관계의 조회 쿼리가 "추가로" 발생하는 현상이다.  즉, 조회시 쿼리 1개를 생각하고 설계를 했는데, 예상치 못한 쓸모가 없는 N개의 조회 쿼리가 더 발생하는 문제이다. 이렇게 비효율적인 쿼리가 실행되게 되면, 트랜잭션 응답 속도가 느려지고, 데이터베이스 부하가 커지며, 시스템 성능이 급격히 저하 될 수 있어 해결해야 한다.  가장 대표적인 예로는 게시판과 댓글 엔티티가 있고, 1대 n으로 매핑되어 있을때, 게시글을 조회한 후 게시글마다 댓글을 조회하기 위해 추가 쿼리가 발생하는 경우이다. 댓글이 10개 달린 게시글 하나를 조회할 때 총 11개의 쿼리(게시글 조회 1개 + 각 게시글 댓.. 2025. 1. 16.
[Spring] Spring DB 연동: JDBC vs JPA '초보 웹 개발자를 위한 스프링 5 프로그래밍 입문' 챕터 8을 읽고 정리한 내용입니다.  스프링 애플리케이션에서 데이터베이스에 접근하는 방법에는 크게 JDBC와 JPA가 있다.JDBC(Java Database Connectivity)Java 애플리케이션이 데이터베이스와 상호 작용하기 위해 제공되는 표준 API이다. SQL을 직접 작성하고 실행해야 하며, Connection, Statement, ResultSet 등의 객체를 통해 데이터를 처리한다.JPA(Java Persistence API)ORM(Object-Relational Mapping) 기술의 표준 사양이다. 엔티티(Entity) 객체를 중심으로 데이터베이스를 다룰 수 있도록 해주며, SQL 대신 엔티티 중심의 코딩에 집중할 수 있다.일반적으로.. 2024. 12. 14.