분류 전체보기
-
올해 삘 꽂혀서 PS를 시작한지 거의 1년이 되어가네요 근데 뭐 새로 시작한건 아니고 작년 상반기에 바짝하다가 작년 하반기에 좀 쉬고 올해 다시 시작했습니다 여러 주제를 풀고 있는데요, 갑자기 새로 배운 주제인 펜윅트리에서 아이디어가 하나 떠올랐습니다 저희 캠퍼스 실시간 정보 거래 서비스에서는 서비스 지역을 S2 셀로 나누어 관리하는데요 기존에 이 셀당, 혹은 현재 전체 셀 안에 있는 사용자들의 수를 파악하는 기능은현재 유저 위치를 저장하는 레디스에 직접 요청을 넣어 다 가져오는 방식이었습니다 그럼 레디스에 셀별 개별 요청을 반복적으로 넣어 전체 사용자 수를 집계해야 하니까 많은 호출과 부하로 인해 응답 지연, 서버 과부하 등의 문제가 생깁니다 그럼 여기서 두 가지 개선점이 필요해보입니다.1. 전체 집계..
PS 하길 잘했다! 펜윅트리로 실시간 유저 집계하기올해 삘 꽂혀서 PS를 시작한지 거의 1년이 되어가네요 근데 뭐 새로 시작한건 아니고 작년 상반기에 바짝하다가 작년 하반기에 좀 쉬고 올해 다시 시작했습니다 여러 주제를 풀고 있는데요, 갑자기 새로 배운 주제인 펜윅트리에서 아이디어가 하나 떠올랐습니다 저희 캠퍼스 실시간 정보 거래 서비스에서는 서비스 지역을 S2 셀로 나누어 관리하는데요 기존에 이 셀당, 혹은 현재 전체 셀 안에 있는 사용자들의 수를 파악하는 기능은현재 유저 위치를 저장하는 레디스에 직접 요청을 넣어 다 가져오는 방식이었습니다 그럼 레디스에 셀별 개별 요청을 반복적으로 넣어 전체 사용자 수를 집계해야 하니까 많은 호출과 부하로 인해 응답 지연, 서버 과부하 등의 문제가 생깁니다 그럼 여기서 두 가지 개선점이 필요해보입니다.1. 전체 집계..
2025.11.19 -
안녕하세요. 문제는 그렇게 시작됐습니다. 드디어 Mockito를 완전히 이해해 버린 도등어, 테스트 작성할 때 애매하다 싶으면 바로 Mockist가 되어버리고 있습니다. 오늘의 테스트 중인 코드는@Componentpublic class AuthUserResolver implements HandlerMethodArgumentResolver { @Override public boolean supportsParameter(MethodParameter parameter) { return parameter.hasParameterAnnotation(Login.class) && parameter.getParameterType().equals(AuthUser.class..
Mockito에서만난에러때문에제네릭이해가쏙쏙되잖아안녕하세요. 문제는 그렇게 시작됐습니다. 드디어 Mockito를 완전히 이해해 버린 도등어, 테스트 작성할 때 애매하다 싶으면 바로 Mockist가 되어버리고 있습니다. 오늘의 테스트 중인 코드는@Componentpublic class AuthUserResolver implements HandlerMethodArgumentResolver { @Override public boolean supportsParameter(MethodParameter parameter) { return parameter.hasParameterAnnotation(Login.class) && parameter.getParameterType().equals(AuthUser.class..
2025.11.03 -
안녕하세요 이번 추석에 레빗 엠큐를 딥하게는 아니고 아주 살짝 맛만 봤습니다 'RabbitMQ' 카테고리의 글 목록 dockerel.tistory.com 근데 레빗 엠큐 이거 좀 맛도리더라구요 제일 맘에 드는건 데드레터 처리하고 자동 재시도 그래서 제가 한 프로젝트 중에 이걸 어디에 한번 적용해보아야 할까 생각하다가 Redis Pub/Sub 기반으로 구현했던 실시간 알림 기능에 한번 도입을 해봤습니다 근데 이걸 왜 함? 사실 그 당시에는 레디스를 인증 파트에서 refresh token 관리를 위해 사용하고 있었기에 다른 메시지 큐와 같은 새로운 기술 스택을 도입하지 않아도 레디스 선에서 커버칠 수 있다는 생각에 도입했습니다 근데 문제는 그렇게 발생했습니다 웹 서버를 배포할 때 다중 인스턴스로 배포해버린..
RabbitMQ를 적용하며 발생한 풍부한 버그와 다양한 삽질의 향연안녕하세요 이번 추석에 레빗 엠큐를 딥하게는 아니고 아주 살짝 맛만 봤습니다 'RabbitMQ' 카테고리의 글 목록 dockerel.tistory.com 근데 레빗 엠큐 이거 좀 맛도리더라구요 제일 맘에 드는건 데드레터 처리하고 자동 재시도 그래서 제가 한 프로젝트 중에 이걸 어디에 한번 적용해보아야 할까 생각하다가 Redis Pub/Sub 기반으로 구현했던 실시간 알림 기능에 한번 도입을 해봤습니다 근데 이걸 왜 함? 사실 그 당시에는 레디스를 인증 파트에서 refresh token 관리를 위해 사용하고 있었기에 다른 메시지 큐와 같은 새로운 기술 스택을 도입하지 않아도 레디스 선에서 커버칠 수 있다는 생각에 도입했습니다 근데 문제는 그렇게 발생했습니다 웹 서버를 배포할 때 다중 인스턴스로 배포해버린..
2025.10.17 -
이번에는 메시지 단위의 트랜잭션 처리에 대해 알아보겠습니다. 이전에 백기선님의 예외와 트랜잭션에 관한 영상을 본 적이 있습니다. 그 당시에 볼 때는 이게 무슨 소리지 했었지만공부를 제대로 안했나 봅니다.이제는 무슨 소리인지 알죠. 간단히 설명드리자면 모든 블로그에서 언체크드 예외와 체크드 예외에 대해 무조건 롤백을 한다 / 롤백을 하지 않는다 로 작성해 놓은 글에 대해 비판하시는 영상이었는데요, 그 이유는 트랜잭션에는 DB 트랜잭션만 있는것이 아니고 그리고 설사 DB 트랜잭션을 의미하는 것일지라도 기본적으로 런타임 계열의 언체크드 예외는 롤백, 그 외에 체크드 예외에는 롤백을 하지 않고 커밋되는 것이 맞지만 이것도 사실 rollbackFor 혹은 try-catch 등의 처리를 통해 충분히 롤백할 수 있다..
RabbitMQ에서 Transaction 처리는?이번에는 메시지 단위의 트랜잭션 처리에 대해 알아보겠습니다. 이전에 백기선님의 예외와 트랜잭션에 관한 영상을 본 적이 있습니다. 그 당시에 볼 때는 이게 무슨 소리지 했었지만공부를 제대로 안했나 봅니다.이제는 무슨 소리인지 알죠. 간단히 설명드리자면 모든 블로그에서 언체크드 예외와 체크드 예외에 대해 무조건 롤백을 한다 / 롤백을 하지 않는다 로 작성해 놓은 글에 대해 비판하시는 영상이었는데요, 그 이유는 트랜잭션에는 DB 트랜잭션만 있는것이 아니고 그리고 설사 DB 트랜잭션을 의미하는 것일지라도 기본적으로 런타임 계열의 언체크드 예외는 롤백, 그 외에 체크드 예외에는 롤백을 하지 않고 커밋되는 것이 맞지만 이것도 사실 rollbackFor 혹은 try-catch 등의 처리를 통해 충분히 롤백할 수 있다..
2025.10.09 -
메시지들이 발행되고 ready에서 제대로 처리되지 못한 경우 unacked 상태가 되는데 만약 클라이언트에서 메시지 처리를 성공한 경우 ack 그 외에는 nack 혹은 reject 상태가 됩니다. 이렇게 메시지가 nack, reject 상태가 되거나 ttl 만료, 길이 초과 그리고 큐 설정 초과 등 특정 Dead Letter 조건이 충족한 경우 DLQ(Dead Letter Queue)로 이동됩니다.@Beanpublic Queue orderQueue() { return QueueBuilder.durable(MAIN_QUEUE) .withArgument("x-dead-letter-exchange", DLX) .withArgument("x-dead-letter-routing-ke..
DeadLetterQueue와 Retry로 재처리하기 참 쉽죠?메시지들이 발행되고 ready에서 제대로 처리되지 못한 경우 unacked 상태가 되는데 만약 클라이언트에서 메시지 처리를 성공한 경우 ack 그 외에는 nack 혹은 reject 상태가 됩니다. 이렇게 메시지가 nack, reject 상태가 되거나 ttl 만료, 길이 초과 그리고 큐 설정 초과 등 특정 Dead Letter 조건이 충족한 경우 DLQ(Dead Letter Queue)로 이동됩니다.@Beanpublic Queue orderQueue() { return QueueBuilder.durable(MAIN_QUEUE) .withArgument("x-dead-letter-exchange", DLX) .withArgument("x-dead-letter-routing-ke..
2025.10.08 -
안녕하세요. 이전 포스팅에서 용어들을 좍 정리해봤습니다. RabbitMQ 시작하기추석을 맞아 인프런의 향로님께서 추석 완강 챌린지를 열어주셨습니다. 그래서 이참에 관심있었던 강의 하나를 완주해보기로 했습니다. 바로 메시지큐 라이브러리인 RabbitMQ입니다. 사실 예전dockerel.tistory.com이제 그럼 코드로 몸통박치기 해봐야겠죠? 1. 단순 메시지 전송간단하게 하나의 큐에서 메시지를 주고 받는 과정을 보겠습니다. 메시지 전송 측은@Component@RequiredArgsConstructorpublic class Sender { private final RabbitTemplate rabbitTemplate; public void send(String message) { ..
RabbitMQ 코드로 몸통박치기안녕하세요. 이전 포스팅에서 용어들을 좍 정리해봤습니다. RabbitMQ 시작하기추석을 맞아 인프런의 향로님께서 추석 완강 챌린지를 열어주셨습니다. 그래서 이참에 관심있었던 강의 하나를 완주해보기로 했습니다. 바로 메시지큐 라이브러리인 RabbitMQ입니다. 사실 예전dockerel.tistory.com이제 그럼 코드로 몸통박치기 해봐야겠죠? 1. 단순 메시지 전송간단하게 하나의 큐에서 메시지를 주고 받는 과정을 보겠습니다. 메시지 전송 측은@Component@RequiredArgsConstructorpublic class Sender { private final RabbitTemplate rabbitTemplate; public void send(String message) { ..
2025.10.07