본문 바로가기

분류 전체보기

(50)
RabbitMQ와 Kafka 차이에 대한 간단 설명 설계 철학RabbitMQ: 전통적인 메시지 브로커로, 메시지의 안정적 전달과 큐잉에 중점을 둡니다. Kafka: 분산 스트리밍 플랫폼으로, 대규모 실시간 데이터 스트림의 저장과 분석에 중점을 둡니다. 메시지 모델RabbitMQ: 큐(queue)를 중심으로 메시지를 전달합니다. 메시지는 큐에 저장되고, 큐에서 하나 이상의 컨슈머에게 전달됩니다. Kafka: 토픽(topic)을 중심으로 메시지를 저장합니다. 메시지는 토픽의 파티션에 저장되고, 컨슈머는 이 파티션에서 메시지를 읽습니다. 메시지 지속성RabbitMQ: 메시지를 메모리나 디스크에 저장할 수 있으며, 일반적으로 단기 저장을 목표로 합니다. Kafka: 메시지를 디스크에 저장하며, 장기 저장을 목표로 합니다. 데이터 로그는 설정된 기간 동안 보존됩니..
gateway와 각 서버별 circuitbreaker 적용의 이해 문제 정의서버간 circuit breaker 적용의 이해gateway에서 통합적으로 서킷브레이커를 관리할 수 있다는 글을 보긴 했는데, 서킷브레이커에 대한 이해도가 낮아 gateway에서 모든 서비스의 개별 api에 대한 open상태를 감지하여 대응할 수 있는 줄로만 알았습니다. 처음에 이렇게만 생각하고 이것저것 해보다가 결국에는 뭔가 잘못 됐다는 것을 깨달았죠.해결과정제가 궁극적으로 하고 싶었던 목표는 다음과 같습니다.각 서버별 api를 요청했을 때 서킷브레이커 open 상태를 감지하여 gateway 설정으로 간편하게 관리할 수 있다.1번의 방법이 적용되면 각 서버별 api에 서킷브레이커를 적용할 필요가 없으니 팀원들의 시간이 절약된다.이 부분을 생각하고 실행했던건데, 여러가지 해보고 구글링을 해본 결..
@ModelAttribute 매핑 시 null값에 대한 이해 먼저 매핑과 바인딩에 대한 부분이 약간 헷갈렸던 개념이라 이 부분을 간단하게 짚고 넘어가게 된다면, 매핑이란 두 개의 서로 다른 데이터 구조를 서로 연결하는 작업을 말합니다. 예를 들어, 데이터베이스의 테이블과 자바 객체 간의 필드를 연결하는 작업을 "매핑"이라고 합니다. 바인딩이란 변수를 특정 값이나 객체에 연결하거나, 함수 호출 시 인자와 매개변수를 연결하는 행위를 주로 말합니다.  문제 원인프로젝트 진행 시에 Querydsl을 사용하여 여러 값을 쿼리파라미터로 받아 사용하는 api를 구성 후 각 쿼리파라미터를 받을 수 있는 dto를 만들어 @ModelAttribute를 활용해 매핑해주었습니다. 당연히 잘 동작을 할 줄 알고 테스트를 진행하였으나, 매핑되는 값들이 전부 null값을 가지고 들어오게 되..
MSA에서의 swagger 사용 문제 정의MSA에서의 swagger + restdocs적용해결과정다행스럽게도 튜터님께서 MSA에 swagger + restdocs 적용하는 방법을 깔끔하게 알려주셔서 그대로 적용한 결과 잘 되었습니다. 문제는 restdocs 적용을 위한 테스트 코드 작성이었는데, 테스트 코드 작성이 거의 전무한 저에게는 MSA에서 다른 서버로 요청을 보내 값을 받아오는 로직이 포함된 경우 어떻게 할지 고민이 되었죠. 구글링과 챗gpt를 이용한 결과 mock 객체를 만들어서 사용하면 된다고 하더군요. 이 부분을 적용하여 수정에 수정을 거친 결과 정상적으로 테스트가 실행되는 것을 확인했습니다.결과코드user서버에서 다른 서버들로 요청을 보낼 때에 사용한 mock객체에는 @MokitoBean을 붙여서 테스트에 사용하였습니다...
MSA 구성 시 데이터 정합성의 문제 문제 정의MSA 구성 시에 데이터 정합성의 문제유저 서버에서 유저 삭제 API 실행 → 메서드 내에서 동기형식으로 주문, 배송, 허브 순으로 요청을 보내게 됐을 때 주문, 배송까지는 완벽하게 통신을 끝냈지만 허브에서 예외가 발생했을 경우. 이 경우 주문과 배송은 삭제 처리가 됐지만 유저와 허브의 경우 삭제 처리가 안된 경우가 발생하게 될겁니다. 이렇게 되면 데이터 정합성이 어긋나게 되는데 이 문제를 해결하기 위해 어떻게 보상 로직을 구현할 것인지..?해결과정가장 먼저 떠오른 방법은 SAGA 패턴을 적용하여 보상 트랜잭션을 구성하는 것이었습니다. FeignClient로 요청을 보내는 것마다 예외를 따로 만들어, 해당 예외가 발생시 try-catch로 잡아내어 이전에 정상적으로 실행된 서버에 보상 요청을 보..
MSA 구조에서의 요청/응답 불일치 문제 문제정의Spring Cloud Service에서 서버간 데이터를 주고 받을 때 데이터의 일관된 형식을 지키지 않게 되면 서로 주고 받지 못하는 문제 발생해결과정코드받아오는 필드들의 구조와 이름을 정확하게 일치시키는 작업이 필요했습니다. user 서버에서 delivery 서버로 요청을 보내는 경우를 예로 들자면이 부분은 delivery-server의 controller 부분입니다. @GetMapping public ResponseEntity getManagers( @RequestParam(value = "search", required = false) String search, // 배송 담당자 타입 @RequestParam(value = "type", re..
[책] 내가 틀렸을 수도 있습니다. 배경저는 책 읽는 것을 별로 좋아하지는 않습니다. 하지만 한달에 2권 정도는 읽어보려구요. 왜 읽게 됐냐면 저는 개인적으로 페이커 선수를 좋아합니다. 롤을 하지는 않지만, 경기는 가끔씩 챙겨 보긴 해요 ㅎㅎ. 페이커 선수가 책 읽는 것을 좋아하는데 그 중에서도 몇번이나 추천한 책을 최근에 읽었습니다. 도서관에서 빌린거라서 개인적으로 마음에 드는 부분을 글로 조금 남겨보려고 합니다.  내용우리는 모두 각자의 배경과 이력을 지니고 있지만, 내면에서 작용하는 방식은 대체로 비슷합니다. 완벽하게 모든 것을 파악하려고 애쓰지 않아도 괜찮습니다. 실패를 두려워하지 않고 서로에게서 배워가며 살아가는 것이 중요합니다.떠오르는 모든 생각을 믿지 말고, 한 발짝 물러서서 바라보는 연습을 해보세요. 영원한 것은 없으며, 힘..
RestTemplate 사용시 주의점(4xx, 5xx 응답 반환) 배경서버간 데이터를 주고 받을 때 RestTemplate을 사용하는 경우가 있었습니다. 이떄 exchange를 통해 HttpStatus 코드를 Bad_Request로해서 body에 응답 메시지를 함께 넣어주는 테스트를 진행하였습니다. 당연히 이 응답 결과를 잘 받을 줄 알았는데 데이터를 출력되지 않고 예외가 발생했습니다. 도대체 뭐지? 내용RestTemplate은 기본적으로 HttpClientErrorException을 던집니다. 이 때문에 예외가 발생하고, 응답 본문을 정상적으로 읽을 수 없게 됩니다. 요청한 서버에 응답이 되돌아 갔을 때 따로 예외 처리를 해주지 않으면, 400응답으로 넘어온 body부분의 내용을 확인하지 못하는거죠. 예를 들어서 이런식으로 작성을 해야합니다. public class ..