트러블슈팅 (3) 썸네일형 리스트형 대용량 데이터 삽입 시 JPA를 JDBC로 교체한 성능 최적화 사례 문제상황 기존에 대량의 데이터를 데이터베이스에 저장할 때, JPA의 saveAll 기능을 사용하고 있었습니다. 하지만 많은 양의 데이터를 처리할 때 성능 이슈가 발생하여, 보다 효율적인 방법이 필요했습니다. 특히, 한 번에 수천 건의 데이터를 삽입하는 경우, JPA의 saveAll은 예상보다 느린 성능을 보였습니다. 이를 해결하기 위해 JDBC 기반의 batchInsert 방식으로 코드를 개선했습니다. 수정코드 public List bulkInsertSmsMsgSendDetail(SmsQueueDto smsQueueDto, String msgGroupId) { String sql = "INSERT INTO table (msg_id, msg_group_id, recv_no, user_seq, sen.. Redis를 이용한 예약 메세지 시스템 개선: RabbitMQ의 FIFO 한계를 극복한 방법 문제상황 기존 예약 메세지 시스템은 RabbitMQ의 지연 큐를 이용해 메시지의 전송 시간을 TTL(Time To Live)로 설정한 후 메시지를 예약하는 방식으로 구현되었습니다. 이 방식은 선입선출(FIFO) 구조의 특성 때문에 다음과 같은 문제가 발생했습니다:FIFO로 인한 대기 현상: 예를 들어, 3시간 뒤에 전송할 메시지가 먼저 큐에 걸린 경우, 그 이후 1분 뒤에 전송할 메시지가 들어와도 3시간이 지나야 큐에서 빠져나가게 되어, 1분 뒤에 전송되어야 할 메시지가 지연되는 현상이 발생.지연된 예약 메시지: 이로 인해 여러 메시지들이 제때 처리되지 않으면서 예약 메시지 시스템이 올바르게 동작하지 않는 문제가 발생했습니다.해결책 이 문제를 해결하기 위해 Redis의 notify-keyspace-eve.. WebClient를 이용한 백프레셔 적용하기 문제상황 제가 개발하고 있는 SMS 발송 서비스에서, 데이터 발행자가 수신자가 처리할 수 있는 양을 넘는 데이터를 전송하는 문제가 발생했습니다. 즉, 수신자가 감당할 수 없는 속도로 데이터가 쏟아지면서 시스템에 과부하가 걸리는 상황이었습니다. 이런 경우, 발행자가 데이터를 보내는 속도와 수신자가 처리할 수 있는 속도를 조율하는 백프레셔가 필요합니다. 기존코드private void bizppurioSendMsg(CompletableFuture token, MessageReqDto messageReqDto, SmsReqDto smsReqDto) { token.thenAccept(tokenResDto -> { WebClient.builder() .baseUrl(bi.. 이전 1 다음