[DEV] 기록 165

[elasticsearch] Limit of total fields [1000] in index has been exceeded

개요 logstash를 통해 elasticsearch에 로그를 저장하는데 필드가 1,000개가 넘지 않는데도 불구하고 간헐적으로 아래와 같은 에러 메시지가 발생했습니다. Limit of total fields [1000] in index has been exceeded 원인 로그로 쌓는 데이터 중 HashMap 형태의 데이터들이 있었는데 해당 field에 대한 매핑 정보를 그대로 저장할 경우 map에 포함된 각각의 key가 필드로 매핑되어 파라미터의 개수와 필드 개수가 정비례하면서 발생하는 문제였습니다. 해결 방법 굳이 Map 형태로 로그를 쌓을 필요가 없어 toString 메서드를 오버로딩하여 문자열 형태로 저장하는 방식으로 해결했습니다. 물론 아래와 같이 필드 제한 개수를 늘리는 방법을 선택할 수도 ..

[DEV] 기록 2023.09.11

[Jackson 라이브러리] @JsonBackReference

개요객체 간 순환 참조를 방지하기 위해 추가한 @JsonBackReference가 @JsonIgnore 애노테이션과 비슷한 역할을 하여 ObjectMapper의 writeValueAsString() 메서드에서 해당 필드가 무시되는 현상이 발생했습니다. 생각보다 해당 문제를 다루는 문서가 없는 것 같아 @JsonBackReference 어노테이션의 역할과 위 문제를 어떻게 해결했는지 이번 포스팅에서 작성해 보겠습니다. @JsonBackReference란?Jackson 라이브러리의 @jsonbackReference는 Java 객체 간 양방향 참조를 다룰 때 사용됩니다. 해당 어노테이션은 주로 JSON Serialization(직렬화) 및 Deserialization(역직렬화) 프로세스에 사용되며 객체 간 순..

[DEV] 기록 2023.09.07

[Spring Data Jpa] java.lang.StackOverflowError

개요 JPA 객체를 저장하는데 아래와 같은 에러가 발생했습니다. java.lang.StackOverflowError: null at com.ecomhunt.entities.Order.hashCode(Order.java:15) ~[classes/:na] at java.base/java.util.AbstractSet.hashCode(AbstractSet.java:124) ~[na:na] at com.ecomhunt.entities.Customer.hashCode(Customer.java:11) ~[classes/:na] at com.ecomhunt.entities.Order.hashCode(Order.java:15) ~[classes/:na] at java.base/java.util.AbstractSet.h..

[DEV] 기록 2023.09.04

[javascript] common-lang3의 ObjectUtils.isEmpty()와 같은 코드를 작성하고 싶다면?

개요 useEffect React Hook을 통해 특정 객체가 비어있을 때만 업데이트하는 로직을 작성하려는데 common-lang3의 ObjectUtils.isEmpty()와 같은 동작을 하는 코드가 있으면 좋겠다 싶어 비슷하게 구현한 코드를 찾았습니다. 코드 object가 확인하고 싶은 객체라고 할 때 코드는 아래와 같습니다. Object.keys() 메서드는 object 객체의 배열 또는 모든 키를 반환합니다. 그리고 반환된 값의 길이를 확인하여 빈 개체인지 여부를 확인할 수 있습니다. 출처 https://stackoverflow.com/questions/48353471/checking-if-a-state-object-is-empty Checking if a state object is empty I..

[DEV] 기록 2023.08.31

[Spring Batch] ForbiddenClassException

개요 Marshaller, Unmarshaller 바인딩 기능을 제공하는 오픈소스인 Xstream을 이용해 StaxEventItemReader 코드를 작성하는데 아래와 같은 에러가 발생했습니다. com.thoughtworks.xstream.security.ForbiddenClassException 원인 Xstream 1.4.18 버전은 역직렬화 진입 시점에 공격을 방지하기 위한 설정이 기본적으로 설정되어 있습니다. You need to configure the security framework in XStream. It is designed to prevent attacks to your deserialization entry point. 해결 방법 두 가지 해결 방법이 있습니다. 첫 번째는 아래와 같이..

[DEV] 기록 2023.07.26

[Java] Long, Integer 값 비교는 ==이 아닌 equals로 해야하는 이유

개요 리스트를 Long 타입 id 기준으로 필터링하는데 id 값이 둘 다 203으로 동일한데도 불구하고 빈 리스트가 돌아오는 버그가 발생했습니다. 반면 id 값이 127 이하일 때는 id 값이 같으면 해당 id가 포함된 리스트가 반환되었습니다. 원인 기본적으로 ==은 메모리 주소값을 비교하기 때문에 값이 같더라도 메모리 위치가 다르면 false를 반환합니다. id 값이 127 이하일 때는 equals가 아닌 ==으로 비교해도 정상적으로 동작한 것은 Java에서는 -128부터 127까지의 범위 내에 있는 Integer와 Long 객체를 캐싱하여 동일한 객체로 취급하기 때문입니다. 위와 같이 동작하는 이유는 JVM에서 성능 향상을 위해 수행되는 옵티마이제이션을 진행하기 때문입니다. 해결 방법 제목에서도 명시..

[DEV] 기록 2023.06.23

[SpringBoot 2.6.X] QueryDSL Unable to load class 'com.mysema.codegen.model.Type'

개요 SpringBoot 2.7.12 버전에 QueryDSL 디펜더시를 추가한 후 QClass 생성을 위해 compileQuerydsl 명령을 호출하니 아래와 같은 에러가 발생했습니다. QueryDSL Unable to load class 'com.mysema.codegen.model.Type' External Libraries에 추가된 라이브러리 목록은 아래와 같습니다. 원인 SpringBoot 2.6.X 버전 이상부터는 build.gradle에 QueryDSL 버전을 직접 명시해야 하고, querydsl-jpa 및 querydsl-apt를 추가하도록 변경이 되었습니다. 해결 방법 아래 build.gradle 파일과 같이 querydsl 세팅을 변경하면 정상적으로 compileQuerydsl 명령이 실..

[DEV] 기록 2023.06.20

[ssh] WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

개요 ssh 접속을 시도했는데 아래와 같은 오류가 발생했습니다. 원인 내용을 해석하자면 원격 호스트 식별 정보 즉, RSA 키가 변경되었기 때문에 위와 같은 오류가 발생한 것입니다. 이는 극단적으로 해석하자면 man-in-the-middle attack에 의해 발생했을 수도 있고 등록된 호스트 정보 외 다른 호스트에서 접근을 시도해서 발생했을 수도 있습니다. 저 같은 경우 local에서 docker로 실행된 서버에 접속하려고 하는 도중 발생한 오류였기 때문에 후자였습니다. 해결 방법 해당 경고를 제거하기 위해서는 /root/.ssh/known_hosts에 올바른 Host Key를 추가하거나 기존 Host Key를 제거하면 됩니다. local에서 작업한다면 Window 기준 C:\Users\USER\.ss..

[DEV] 기록 2023.06.20