분류 전체보기 27

[Redisson] default codec 사용은 지양하자

현업에서 사용하던 redisson 버전을 올렸는데, 직렬화/역직렬화 관련 오류를 만나신 적 있나요?오늘은 redisson 버전을 올리면서 default codec 관련 이슈를 겪은 경험을 기반으로 관련된 유의사항을 공유하고자 합니다.Redisson 의 default codec은 종종 바뀐다redisson changelog 에서 살펴보면 3번이나 default codec이 바뀐 것을 볼 수 있습니다.[참고] redisson changeloghttps://github.com/redisson/redisson/blob/master/CHANGELOG.md3.10.0 : changed to FSTCodec3.13.0 : changed to MarshallingCodec3.19.0 : changed to Kryo5C..

개발자 포포 2025.02.16

[Hibernate] 쓰기 지연(write-behind) 동작 순서와 예외 케이스

Hibernate의 쓰기 지연하이버네이트의 “쓰기지연” 을 제공합니다. 쓰기지연은 다음과 같이 동작합니다.하이버네이트는 영속성 컨텍스트에 변경이 발생했을때, 즉시 쿼리를 DB로 날리지 않고, ActionQueue 라는 내부 구조에 쿼리 수행정보를 저장flush 시점에 ActionQueue 저장된 SQL 쿼리들을 실행이를 통해 애플리케이션과 DB 간 효율적인 네트워크 통신과 최적화된 실행의 장점이 있습니다.jdbc batch를 이용해 쿼리들을 건건이 DB에 보내지 않고 합쳐서 전송동일 엔티티, 동일 필드에 대한 여러 변경사항이 하나의 트래젝션 내에서 이뤄진 경우, 중간에 불필요한 update 쿼리는 제외하고 마지막 상태에 대한 update 쿼리만 전송이런 쓰기 지연에는 내부적으로 동작 순서가 있습니다.동작..

개발자 포포 2025.01.05

[Hibernate] Lazy Loading이 포함된 Response 유의

이 글은 과거에 운영하던 블로그에서 옮겨온 글 입니다. (2021.11.21. 작성됨)요약jackson 라이브러리로 하이버네이트 프록시 객체를 serialize 할 경우 오류가 발생합니다.1) 프록시 객체를 가져오지 않도록 join fetch를 사용하거나 2) 엔티티는 DTO로 모두 변환하여 Response body로 전달하면 문제를 피할 수 있습니다.이번 포스팅에서는 Lazy Loading이 포함된 엔티티를 ResponseEntity 응답 정보로 사용할때 유의 해야할 점을 다루어보려 합니다. No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor and no properties discovered to c..

개발자 포포 2024.09.17

[Hibernate] Collection 타입은 PersistentBag 타입으로 래핑된다.

이 글은 과거에 운영하던 블로그에서 옮겨온 글 입니다. (2022.01.15. 작성됨)요약하이버네이트에서는 컬렉션 타입을 org.hibernate.collection.internal.PersistentBag 인스턴스로 래핑하여 사용합니다.이 때문에 Collection 타입에서 orphanRemoval 옵션 사용시 주의 해야합니다.이와 관련 하여 실제 문제를 격은 사레는 다음 포스팅에서 다뤄져 있습니다.2024.09.17 - [개발자 포포] - [Hibernate] orphanRemoval 옵션 사용시 Collection 참조를 변경하지 말자 JPA 관련 공부를 하던 중, 컬렉션 타입은 org.hibernate.collection.internal.PersistentBag 인스턴스로 래핑된다는 놀라운 사실을..

개발자 포포 2024.09.17

[Hibernate] orphanRemoval 옵션 사용시 Collection 참조를 변경하지 말자

이 글은 과거에 운영하던 블로그에서 옮겨온 글 입니다. (2021.11.19. 작성됨)요약orphanRemoval 옵션으로 설정된 컬렉션을 연관관계로 가지는 경우, 컬렉션이 empty가 아닐때 참조 인스턴스를 변경하면 오류가 발생합니다. 이번 포스팅에선, JPA One-to-Many 연관관계를 사용하며 경험한A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance오류에 대해 공유하고자 합니다.문제 발생 배경도메인에 대해 간략히 말씀드리면, 지하철 노선(Line)은 여러 개의 구간으로 이루어져 있고 구간(Section)은 상행역(Station)과 하행역(Station), 구간 거리로 ..

개발자 포포 2024.09.17

[Spring] Spring Batch Chunk 단위 처리 결과를 ThreadLocal로 저장해보기

이 글은 과거에 운영하던 블로그에서 옮겨온 글 입니다. (2022.02.05. 작성됨)요약싱글톤 객체(ex. 스프링 빈의 싱글톤 방식 생성)를 멀티스레드가 사용하는 경우, 각 스레드 별 관리하고 싶은 정보는 ThreadLocal을 사용하자.이번 포스팅에서는 Chunk 단위로 처리 결과를 로깅하기 위해 스레드 로컬을 사용한 것을 공유하고자 합니다. 예시로 다루고자 하는 Spring Batch 기반 프로그램에서는 다음과 같은 실행 흐름이 있습니다.첫번째 API 호출을 통해 totalCount를 읽어와서한번에 200건씩 가져오는 것으로 설정하여 page 개수를 계산합니다. (page 개수 = totalCount / 200)이 때, 한번 API를 호출하여 200건을 가져오는 것을 하나의 Chunk 단위로 잡았습..

개발자 포포 2024.09.17

[library] XSSFWorkbook 객체 생성 시 InputStream과 File 전달 차이

이 글은 과거에 운영하던 블로그에서 옮겨온 글 입니다. (2022.01.12. 작성됨) 이번 포스팅에서는 apache.poi 라이브러리의 XSSFWorkbook 객체 생성 시, InputStream 객체를 전달하는 경우와 File 객체를 전달할 경우의 차이에 대해 공유 해보고자 합니다.요약apache.poi의 XSSFWorkbook 객체를 생성할 땐, InputStream 대신 File 객체를 전달하자.Apache POIApache POI는 Java에서 Microsoft 문서를 다루기 위해 아파치 재단에서 만든 API 입니다. apache.poi 라이브러리 사용하기java에서 빌드도구로 gradle을 사용하시는 경우, 다음 설정을 통해 apache.poi 의존성을 추가하실 수 있습니다.(빌드 도구로 ma..

개발자 포포 2024.09.17

[Spring MVC] 인터셉터에서 response body 로깅하기

이 글은 과거에 운영하던 블로그에서 옮겨온 글 입니다. (2022.02.11. 작성됨)요약HTTP 메시지의 응답 body를 필터나 인터셉터에서 로깅 하기 위해선 ContentCachingResponseWrapper를 이용하여 HttpServletResponse 객체를 래핑해야 합니다. 이번 포스팅에서는 웹 API를 개발하면서 HTTP response의 body를 로깅하는 과정에서 겪은 경험을 공유하고자 합니다. 서비스를 운영할 때 클라이언트의 요청에 대해 응답이 반환되었는지 확인해보고 싶은 경우가 있습니다.아래와 같이 로깅 인터셉터를 만들어서 "response 객체의 body를 어떻게 추출하는 방법이 있지 않을까?" 로 접근할 수 있을 텐데요, HttpServletResponse의 기본 구현체(Respo..

개발자 포포 2024.09.17

[Java] Compiling Switches : tableswitch 와 lookupswitch

이 글은 과거에 운영하던 블로그에서 옮겨온 글 입니다. (2021.12.07. 작성됨) 지난 포스팅에서는 if와 switch의 실제 동작 차이를 비교해보며 switch가 LOOKUPSWITCH 로 변경되는것을 확인해보았습니다.지난 포스팅은 다음을 참고해주세요.2024.09.17 - [개발자 포포] - [Java] if, switch 누가 더 빠를까? 하지만 실제로는 자바 컴파일러가 상황에 따라 switch 구문은 세부적으로 TABLESWITCH, LOOKUPSWITCH 둘 중 효율적이라 생각하는 전략을 취합니다.TABLESWITCHtableswitch는 switch의 조건 값의 범위를 인덱싱하여 jump table을 구성하고, 해당하는 인덱스의 실행지점으로 바로 점프합니다. [예제 자바코드]int cho..

개발자 포포 2024.09.17

[Java] if, switch 누가 더 빠를까?

이 글은 과거에 운영하던 블로그에서 옮겨온 글 입니다. (2021.12.06. 작성됨) 조건에 따라 실행 흐름을 분기해야 하는 경우 우리는 조건문을 사용합니다.Java에는 if-else / switch 두가지 조건문이 있습니다.이 중 어떤 방식이 더 효율적인지, 무엇을 쓰는게 좋을지 비교해보고자 합니다.동일한 로직을 두 방법으로 구현하여 변환된 바이트 코드를 비교해보며 차이를 알아보겠습니다.if자바코드public class ConditionTest1Main { void doIfStatement() { int number = 5; if (number == 1) { method1(); } else if (number == 2) { ..

개발자 포포 2024.09.17