Spring
S3Mock을 사용한 S3 테스트 방법
s3를 로컬에서 테스트 진행하기 위해서는 별도의 mock 서버가 필요하다. 이를 대신해서 AWS s3에서 사용하는 api 구현체를 제공해주는 s3Mock이라는 라이브러리가 있어 사용해봤는데 괜찮아서 정리해본다. Gradle Import https://github.com/findify/s3mock GitHub - findify/s3mock: Embedded S3 server for easy mocking Embedded S3 server for easy mocking. Contribute to findify/s3mock development by creating an account on GitHub. github.com dependencies{ api 'org.springframework.cloud:spr..
만들면서 배우는 아키텍처 그리고 매핑 프레임워크 MapStruct를 사용한 매핑
만들면서 배우는 아키텍처 (Get Your Hands Dirty on Clean Architecture) 요새 읽던 책중에 'Get Your Hands Dirty on Clean Architecture' 책이 인상 깊었다. 원서로 팀원들과 스터디 하고 나서 인상깊어서 '만들면서 배우는 아키텍처'라는 번역으로 다시 한번 봤다. 원서는 구어체로 되어있어 내용은 좋았지만 친절하지 못한 느낌이었다면 번역본은 깔끔하게 정리되어있어서 너무 맘에 들었다. 인상깊었던 몇 부분을 정리하면 첫번째로 육각형 아키텍처에서 포트-어댑터 패턴을 사용하여 호출 당하는쪽은 호출하는쪽을 몰라도 되고 port interface로 통신하는 부분이 인상 깊었고 interface가 만드는쪽에서만 명세(설계도)를 알 수 있다는 장점만을 생각했..
Redis pub/sub 기능을 이용한 여러 서버 메시지 관리
지금까지 SimpleMessageBroker, Stomp등 기본적인 것들에 대해 많이 공부를 했다. 그럼 실제 사례를 가정해보고 코드를 만들어 보자. 사례 고객이 주문을 하고 배달 시작을 누르면 기본시간을 받고 변경된 시간을 주기적으로 업데이트 받으며 같은 id로 로그인한 다른 디바이스에서도 subscribe시 같은 배달 예상시간을 안내받을 수 있도록 하고 배달이 종료되면 alert을 내려주는 코드를 만들어보자. 1. client에서 stomp서버로 connect를 한다. 2. user별 메시지를 받을 수 있는 /user/topic/data, 모든 broadcast message를 받을 수 있는 /topic/message를 subscribe한다. 3. 초기에 connect(주문시작)되면 redis에 저장..
Spring WebSocket Stomp 메시지 보내기 - 2. specific user
이전 글에서 broadcast로 메시지를 보내는 것에 대해 공부해봤다. 그럼 이제 특정 유저에게 메시지를 보낼 수 있는 방법에 대해 알아보자. https://wedul.site/694 Spring WebSocket Stomp 메시지 보내기 - 1. broadcast @Controller public class GreetingController { @MessageMapping("/hello") // simple broker를 사용하려면 Broker 설정에서 사용한 config에 맞는 값을 사용해야한다. @SendTo("/topic/greetings") public Greet.. wedul.site 설정 우선 messgeBroker를 통해서 특정 유저와 메시지를 주고 받을 수 있는 prefix 설정이 필요하..
Spring WebSocket Stomp 메시지 보내기 - 1. broadcast
@Controller public class GreetingController { @MessageMapping("/hello") // simple broker를 사용하려면 Broker 설정에서 사용한 config에 맞는 값을 사용해야한다. @SendTo("/topic/greetings") public Greeting greeting(HelloMessage message) { return new Greeting("Hello! " + HtmlUtils.htmlEscape(message.getName())); } } 이전 공부에서 SimpleBroker관련해서 알아봤다.(https://wedul.site/693) SimpleBroker로 알아보는 WebSocket Massage Broker Simple Mes..
SimpleBroker로 알아보는 WebSocket Massage Broker
Simple Message Broker simple broker는 클라이언트에서 전달 받은 subscription을 메모리에 저장하고 연결된 client에게 메시지를 보내는 역할을 한다. 하지만 문서에 보면 알수 있듯이 제공하는 일부의 기능만 있으며 간단한 메시지 전송 루프에 의존하며 클러스터링에 적합하지 않다. 이에 대한 대한으로 RabbitMQ와 같은 여러 message broker를 사용할 수 있다. The simple broker is great for getting started but supports only a subset of STOMP commands (it does not support acks, receipts, and some other features), relies on a si..
Spring webSocket with stomp 기본 개념 정리
웹 소켓 관련하여 정리가 필요하여 spring document 내용을 발췌 하여 필요한 부분만 정리했다. 공유용 보다는 개인적인 정리용으로 크게 도움이 되지 않을 수 있다. 출처 : https://docs.spring.io/spring-framework/docs/5.2.6.RELEASE/spring-framework-reference/web.html#websocket 웹 소켓 소개 웹소켓 프로토콜은 웹 애플리케이션을 위한 새로운 기능으로써 클라이언트 양방향 통신의 오랜 역사를 가지고 있다. HTTP와는 다른 TCP 프로토콜이지만 HTTP에서 동작가능하게 디자인 되었고 80, 443 포트를 사용하며 방화벽규칙을 재사용할 수 있도록 되어있다. 일반 HTTP 요청에 Upgrade 헤더를 포함한 reqeust를..
Java Lowlevel client bulk api에서 filter_path 사용하기
https://wedul.site/690 Bulk Index 진행 시 search api 느려지는 현상 해결 방법 리서치 현재 회사에서 하고있는 프로젝트에 경우 Elasticsearch를 사용해서 데이터를 제공하고 있다. 서비스 특성상 초당 받는 데이터 업데이트 요청이 많고 real time engine이 아닌 elasticsearch에 거의 리얼타 wedul.site 이전글에서 작성하였듯이 계속해서 쓰기 작업 시 발생할 수 있는 순단을 줄이기 위해서 여러가지 방법을 찾고 있다. 그중 쓰기 작업이 많이 발생할 때 불필요한 response를 줄이기 위해서 filter_path를 적용해보고자 한다. Filter Path rest api 작업 시 필요한 응답값만 받을 수 있는 기능이다. 하지만 Java Hig..
elasticsearch metric 수집 방법
Elasticsearch metric 정보 수집관련해서 요근래 질문을 받았었다. 처음에는 java application이라면 기본적으로 생각하는 JMX metric을 고려했었으나 그때 당시에 이 community를 보고 직접 aggregation해서 influxdb에 수집하는 방법을 선택했던게 생각난다. (실제로 내 입장에서는 jmx로 metric 정보를 보는게 너무 불편했다.) 또 aggregation할 때 spring actuator micrometer를 사용하려 했으나 이곳에서 모으는 데이터를 정제해서 보고자 하는 데이터 형태로 influxdb에 넣는건 좋지 못한 방법이었다. 그래서 결국 pooling방식으로 얻고자 하는 클러스터에 직접 stats관련된 http api를 요청해서 잘 조립해서 inf..
Spring Webflux url length 제한 413 에러 해결 방법
프로젝트에서 사용되는 특정 api에 request param의 길이가 길어지는 api가 현재 구조상 어쩔 수 없이 존재하게 되었다. 그렇게 조심스럽게 운영하다가 request param의 길이가 너무 길어져서 api에서 413에러를 내뱉으면서 결과를 반환 받지 못하는 문제가 생겼다. 우선 nginx에 있는 request param 길이 관련 설정이 문제를 유발하는지 확인해봤다. 우선 테스트를 위한 api를 하나 만들었다. 단순하게 요청을 받고 바로 반환하는 api package com.wedul.reactivetest; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annot..