Spring 82

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..

web/Spring 2020.12.26

[번역] 2-2. Domain 모델 (Enum, UUID, Date, Attribute, Generated Properties)

2.3.7 Enums 매핑 Hibernate는 기본값 유형으로써 다양한 방법으로 Java Enum의 매핑을 지원한다. @Enumrated 기본적인 JPAdml enums의 매핑 방법은 @Enumrated 또는 @MapKeyEnumrated 애노테이션을 통해 javax.persistence.EnumType에 표시된 두 가지 전략 중 하나에 따라 enum 값이 저장된다는 원칙에 따라 동작한다. ORDINAL - java.lang.Enum#ordinal에 기재된대로 Enum 클래스 내에서 Enum값의 순서에 따라 저장된다 STRING - java.lang.Enum#name 방식에 기재에 따라 Enum값의 이름에 따라서 저장된다. 아래 예시로 PhoneType이라는 Enum이 있다고 가정해보자. public e..

WebFlux에서 Mono, Flux에 Map 또는 flatMap을 사용할 때 null을 리턴하는 경우

WebFlux로 구성되어 있는 프로젝트에서 Mono, Flux stream에서 map이나 flatMap을 사용해서 특정 데이터를 매핑하는 과정에서 특정한 경우에 대해서 null을 리턴하고 다음 파이프라인에서 filter로 Objects의 nonNull을 사용해서 컨텐츠를 필터링 하려고 했다. 작성하려고 한 코드의 일부 예시를 만들어서 작성해봤다. 만약 resultData를 통해 전달받은 데이터가 예상 대로라면 map과정에서 500보다 큰 5189값만 정상 반환하고 나머지는 null을 반환한 후 filter를 통해 정상적으로 하나의 데이터만 남을 것이라고 예상했다. @Test @DisplayName("map 과정에서 반환된 null이 정상적으로 필터링 되었는지 확인하는 테스트") void mono_null..

web/Spring 2020.10.30

Spring Boot version 2.1.x에서 2.2.x (spring frame 5.2 이상)으로 버전업 진행 시 Spring Cloud AWS SnsAutoConfiguration 에서 TypeNotPresentExceptionProxy 가 발생하며 실행안되는 문제

문제 발생 평소 문제가 많았던 webflux 부분 수정을 위해 spring boot 2.1.3에서 2.2.7버전으로 업그레이드를 진행하기 위해 gradle에서 spring boot version을 2.2.7로 변경하고 애플리케이션을 실행 시켰다. 그런데 평소에는 자주본적이 없던 TypeNotPresentExceptionProxy 에러가 발생했다. org.springframework.beans.factory.BeanDefinitionStoreException: Failed to process import candidates for configuration class [com.baemin.bmart.search.BmartSearchAdminApplication]; nested exception is java..

web/Spring 2020.08.21

Spring reactor 2.1.2 (netty 0.8.4) Mono.zip readTimeoutException 문제

Mono zip 각 Mono 처리 스레드를 병렬로 실행하고 이를 묶어서 사용할 수 있는게 Mono.zip이다. 근데 Mono zip에서 병렬로 실행되는 작업 중 하나가 empty 또는 error가 발생 되면 바로 error 또는 complete를 내뱉게 되어있다. 하지만 각 Mono 구독 작업에 error와 empty 발생 시 문제에 대해 fallback 처리를 해주면 에러가 발생하더라도 그 로직을 타게 되어있다. 하지만 2.1.2(netty 0.8.4) 버전을 사용하고 있을 때 호출 체인에서 첫 번째 요청의 실패 이후에 두 번째 요청이 정상적으로 이루어 지지 않아서 readTimeout이 발생되는 문제를 경험하였습니다. 이 문제를 해결하기 위해서 알아보던 중 2.1.2버전에 문제가 있는 것을 알게 되어..

web/Spring 2020.07.12

Spring boot2 resilience4j를 이용한 circuit breaker 사용

fault tolerance library (장애 허용 시스템) fault tolerance library는 무엇인가? 간단하게 이야기해보자. MSA 환경에서 한 개의 서비스에서 다른 api를 호출 할 때 일시적으로 에러가 발생하고 있다고 가정해보자. 만약 이 시기에 요청이 계속 들어오면 계속 500에러를 내보내게 된다. 그럼 사용자들은 이 서비스에 대해서 신뢰를 잃어 버리게 되고 안좋은 인식을 만들 수 있다. 그래서 특정 api 호출과 같은 작업에 에러가 발생했을 때, 그 횟수를 정해놓고 그 횟수 이상 에러를 초과하면 기존에 설정해 놓은 fallback에 맞게 동작하게 하고 일정 시간 후에 다시 시도하여 진행하는 등에 작업이 필요하다. 이게 바로 fault tolerance library (장애 허용 ..

web/Spring 2020.02.23

spring cloud resilience4j 사용시 CircuitBreakerConfiguration 에러

CircuitBreaker 테스트를 위해서 Resilience4j를 사용했다. 버전은 1.3.0을 사용하려고 했다. //Resilience4J compile("io.github.resilience4j:resilience4j-spring-boot2:1.3.0") compile("io.github.resilience4j:resilience4j-reactor:1.3.0") compile("io.github.resilience4j:resilience4j-timelimiter:1.3.0") 그런데 분명 1.3.0을 사용한다고 명시하였고 gradle도 clean하고 사용하는 denpendency도 확인하였는데 계속해서 다음과 같이 1.1.0 라이브러리를 사용하려고 해서 문제가 발행했다. Cannot resolve ..

web/Spring 2020.02.23

Spring BootJunit5 테스트 (백기선님 인프런 강의)

Junit 5 테스트 Junit4를 잘 알고 있던건 아니지만 새로 입사한 회사에서 Junit5를 사용하여 테스트 코드를 짜기때문에 더 잘 알고 싶어 공부하게 되었다. 그 중 백기선님의 Junit5 테스트 코드 관련 인강을 인프런에서 듣게 되었다. 내용이 너무 좋았고 그동안 몰랐고 정리가 되지 않았던 부분을 많이 알게 되었다. 이를 아주 간략하게만 정리해봤다. 가격이 그리 비싸지 않기 때문에 한번쯤은 꼭 보는걸 추천한다. https://www.inflearn.com/course/the-java-application-test/# 소개 Junit5는 Junit3, 4에서 사용하던 Junit Platform 구현체 Vintage대신 Jupiter를 사용해서 TestEngine Api를 사용하는 test 프레임워..

web/Junit 2019.12.23

RestHighLevelClient를 사용하여 search after 기능 구현하기

https://wedul.site/541에서 search after 기능을 사용해서 검색을 하는 이유를 알아봤었다. 그럼 spring boot에서 RestHighLevelClient를 이용해서 search after를 구현을 해보자. 1. Mapping 우선 index가 필요한데 간단하게 상품명과 지역 가격정보들을 가지고 있는 wedul_product 인덱스를 만들어 사용한다. { "settings": { "index": { "analysis": { "tokenizer": { "nori_user_dict": { "type": "nori_tokenizer", "decompound_mode": "mixed", "user_dictionary": "analysis/userdict_ko.txt" } }, "ana..

web/Spring 2019.11.14 (1)