본문 바로가기

분류 전체보기29

[출하 정보 연동 프로젝트] ObjectRecord, StringRedisSerializer를 통한 Redis Stream 구현 목차1. 서론2. MapRecord와 ObjectRecord 비교3. ObjectRecord를 활용한 Redis Stream 구현4. 직렬화 방식: StringRedisSerializer 선택서론Spring Redis를 활용하여 Redis Stream 기반의 발행/구독 시스템을 구현한 경험을 공유합니다.본 글에서는 MapRecord와 ObjectRecord의 차이를 분석하고, ObjectRecord를 사용하여 커스텀 DTO 객체를 처리한 것을 설명합니다. 사용된 DTO는 타입 세이프(Type Safety)와 프로퍼티의 명시적인 확인(Explicit Property Access)을 보장하기 위해 선택되었습니다.Redis Stream은 이진 형식으로 데이터를 저장하므로 직렬화와 역직렬화가 필수이며, 이를 위.. 2025. 5. 11.
[출하 정보 연동 프로젝트] Listener 연결시 TIME_WAIT 발생 목차TIME_WAIT 발생 원인LettuceConnectionFactory + commons-pool2로 connection을 관리하자 TIME_WAIT 발생 원인지속적인 TIME_WAIT 발생처음 StreamMessageListenerContainer와 관련된 기능 테스트를 진행했을 때는 단순히 poll time out 100m/s로 설정해서 TIME_WAIT이 발생한다 생각했습니다. 그래서 poll time out 시간을 계속해서 늘려보았지만.. 결론은 TIME_WIAT의 갯수가 100 > 80 > 50 .. 으로 줄어들 뿐 근본적인 해결책이 되지 않았습니다. 이에 해당 문제에 대해 선배 개발자와 함께 이야기를 나누다 연결 후 TIME_WAIT이 나오는 것은 비정상적인 종료일 경우 발생할 수 있는 문.. 2025. 4. 24.
[출하 정보 연동 프로젝트] Keyset Pagination을 통한 조회 기능 구현 목차Keyset Pagination은 무엇인지?Keyset Pagination을 선택한 이유 keyset pagination은 무엇인지?rownum을 이용한 page read 방식 SELECT T2.*FROM ( SELECT ROWNUM AS ROW_NUM T.* FROM ( SELECT * FROM temp_table ORDER BY id DESC ) T WHERE ROWNUM = 1이 방식의 쿼리는 전통적인 page read 방식으로 rownum을 이용한 조회 방식입니다. rownum을 이용해 쿼리를 조회할 때는 처음에 temp_table을 full table scan후 id로 오름차순을 진행합니다... 2025. 4. 22.
[출하 정보 연동 프로젝트] Redis Stream을 도입하기까지 목차Spring Batch 비동기 전송의 한계MOM(Message Oriented Middleware)의 도입 Spring Batch 비동기 전송의 한계기존 로직기존엔 데이터를 위의 순서대로 Target System에 전달해야만 데이터가 정상적으로 저장되는 구조였습니다. 문제는 송장 정보와 위치 정보의 차량 상태가 일치하지 않는 문제가 있었습니다. 문제의 원인은 각 도메인을 4분간격으로 전송을 하다보니 송장 I/F의 차량 상태와 I/F 위치 정보의 차량 상태가 시간차이로 데이터가 불일치 한다는 것이었습니다. 변경된 로직그래서 I/F 위치 정보만 별개로 진행할 수 있게끔 변경하였습니다.또한 평소에 위치 정보가 너무 실시간성이 떨어진다는 의견이 있어 10초 단위로 전달을 하게 되었습니다. 서비스 속도 저하.. 2025. 4. 21.