전체 글(363)
-
Springboot - Webflux WebClient Cancelled가 나는 상황("The subscription was cancelled")
오늘 다루어볼 내용은 Webflux에서 사용되는 WebClient가 onCancel이 호출되는 시점이다. 이번에 애플리케이션을 개발하면서 많은 서비스가 통신을 하는데, 필자가 개발한 애플리케이션의 jaeger 로그를 보니 WebClient가 cancelled("The subscription was cancelled") 되었다는 로그가 찍혀있었다. 무슨 이유로 이러한 로그가 남는지 확인했더니, 아래와 같은 이유였다. "AServer -> BServer ->CServer" 이렇게 3개의 서버가 통신하는 상황인데, AServer의 Client는 ReadTimeOut이 3초이고, BServer는 ReadTimeOut이 5초이다. 그런데 CServer가 응답을 주는데 4초가 걸렸다면? 이런 상황에서 발생하는 것이..
2020.02.20 -
Spring - Spring Data Reactive mongo MongoCustomConversions 예제
기본적으로 MongoDB는 ObjectId라는 유니크한 primary id를 갖는다. 하지만 @Id 어노테이션을 특정 Class로 매핑시키기 위한 방법은 없을까? 예를 들어 아래와 같은 상황이다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 @Document @Data @AllArgsConstructor @NoArgsConstructor public class DocumentData { @Id private CustomId id; private String value; @Data @AllArgsConstructor(staticName = "of") @NoArgsConstructor public static class CustomId implements Serializa..
2020.02.03 -
Netty - 네티 개념과 아키텍쳐
오늘 다루어볼 포스팅 내용은 Netty의 개념과 아키텍쳐에 대한 대략적인 설명이다. Netty에 대해 알아보기 전에 AS-IS 자바의 네트워킹 동작 방식에 대해 먼저 다루어본다. 자바의 네트워킹 순수 자바로 네트워크 통신을 하기위해서 생긴 최초의 라이브러리는 java.net 패키지이다. 해당 소켓 라이브러리가 제공하는 방식은 블로킹 함수만 지원했다. 해당 라이브러리를 이용한 서버코드를 간단히 보면 아래와 같다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 public void blockCall() throws IOException { ServerSocket serverSocket = new ServerSocket(8080); Socket clien..
2020.02.01 -
Java - Lombok 사용시 주의점
다들 알고 있는 내용일 수 있겠지만, 이번에 개발하면서 알게된 Lombok 사용시 이슈 사항이다. 해당 이슈사항은 boolean, Boolean 타입을 사용하면서 prefix가 isXX인 필드를 사용할때이다. 12345678@Datapublic class Test { private boolean isBoolean; private void test() { this.isBoolean(); this.setBoolean(); }}cs 사실 네이밍이 잘못된 것 일수도 있다. 하지만 필자는 get가 isIsBoolean()으로 나올 것을 기대했지만, 위의 결과는 is를 생략한 isBoolean으로 getter를 생성한다. setter도 마찬가지이다. 이번에는 래퍼타입의 Boolean일 경우이다. 123456789@..
2020.01.28 -
TODO - 앞으로 정리해야할 기술
1) Spring Webflux 2) Opentracing 3) Kubernetes, Argo, Kustermize, Helm 등 ... 기억나지 않는 것도 있지만, 정리할 내용이 너무 많다. 천천히 하나하나 정리해야겠다.
2020.01.10 -
Java - CopyOnWriteArraySet 클래스
크기가 일반적으로 작고 읽기 전용 작업이 변경 작업보다 훨씬 많을 때 사용하면 좋은 라이브러리이다. iteration 중, 스레드 간의 간섭이 없어야 할때 사용하기 좋다. 즉, 스레드 안전하다. 하지만 변경 작업 같은 경우(add, set, remove) snapshot(복제본)을 이용하여 변경작업을 하기 때문에 비용이 비싸다. 내부적으로 object lock, synchronized 등이 사용되기 때문에 읽기 작업이 많고 변경작업이 적은 경우에 사용하는 것이 좋다. 그리고 해당 라이브러리는 iteration 중 remove를 지원하지 않는다. 해당 라이브러리가 스레드 안전한 이유는 iteration을 사용할때, iteration을 새로 생성하지 않는 이상 내부적으로 가지고 있는 List의 스냅샷에 의존..
2019.12.19