본문 바로가기

전체 글

(359)
Springboot - @CacheEvict 사용시 주의점, Spring cache(@Cacheable,@CacheEvict) 오늘 다루어볼 내용은 spring cache를 이용할때, 쉽게 놓쳐 실수 할 수 있는 @CacheEvict이다. @CacheEvict는 캐시 되어 있는 내용을 refresh, 정확히는 삭제하는 어노테이션인데 명시적으로 캐시 키값을 명시해주지 않으면 발생할 수 있는 실수 있다. 바로 예제를 살펴본다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 package com.example.cache; import lombok.RequiredArgsConstructor; import org.springframework..
Springboot - junit을 이용한 DB관련 테스트 작성하는 방법, embedded mongo를 이용한 테스트 오늘 다루어볼 내용은 테스트 코드에서 DB관련된 테스트를 작성하는 방법이다. 사실 지금까지 여러가지 유닛테스트를 짜면서 로직에 대한 검증을 하긴 했지만, 데이터베이스와 관련된 테스트 작성은 조금 꺼려하기는 했다. 이유는 여러가지이지만, 귀찮은 설정들이 필요하고 사실 외부 환경에 따라 테스트가 실패할 가능성도 있기 때문이다. 하지만 계속 미룰수는 없는 법.. 오늘은 간단하게 데이터베이스관련 된 테스트를 Junit으로 만들어볼 것이다. 환경 springboot mongodb junit 다루어볼 예제는 정말 간단한 User 객체에 대한 생성,수정,조회 등을 테스트해볼 것이다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 ..
Kubernetes - Kubernetes 로깅 운영(logging), Fluentd 오늘 다루어볼 내용은 쿠버네티스 환경에서의 로깅운영 방법이다. 지금까지는 쿠버네티스에 어떻게 팟을 띄우는지에 대해 집중했다면 오늘 포스팅 내용은 운영단계의 내용이 될 것 같다. 사실 어떻게 보면 가장 중요한 내용중에 하나라고 볼 수 있는 것이 로깅이다. 물리머신에 웹을 띄울 때는 파일로 로그를 날짜별로 남기고, 누적 일수이상된 파일은 제거 혹은 다른 곳으로 파일을 옮기는 등의 작업을 했을 것이다. 하지만 쿠버네티스에서는 파일로 로그를 남기지 않으며 조금 다른 방법으로 로깅운영을 진행한다. 컨테이너 환경에서 로그를 운영하는 구체적인 방법을 설명하기 전에 컨테이너 환경에서 로그가 어떻게 생성되는지 알아본다. 비컨테이너 환경의 애플리케이션에서는 보통 로그를 파일로 많이 남기고 한다. 이에 비해 도커에서는 로그..
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초가 걸렸다면? 이런 상황에서 발생하는 것이..
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..
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..
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@..
TODO - 앞으로 정리해야할 기술 1) Spring Webflux 2) Opentracing 3) Kubernetes, Argo, Kustermize, Helm 등 ... 기억나지 않는 것도 있지만, 정리할 내용이 너무 많다. 천천히 하나하나 정리해야겠다.