spring 9

[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

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

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

개발자 포포 2024.09.17

[Spring] graceful shutdown 처리

Spring은 기본적으로 graceful shutdown을 지원합니다.spring은 기본적으로 graceful shutdown을 제공합니다.외부 환경에서 SIGTERM 과 같은 signal을 받게되면, JVM shutdown process 가 진행되고, spring은 JVM shutdown hook을 구현하여 spring container의 자원들이 적절히 종료될 수 있도록 구현되어 있습니다.OS에서 SIGTERM(kill -15 pid) 을 보내며 애플리케이션 종료 요청JVM에서 등록된 shutdown hook 호출 Runtime.getRuntime().addShutdownHook()Spring은 JVM shutdown hook 을 받아서 ApplicationContext close 처리를 시작이 과정..

개발자 포포 2024.09.15

[Spring] shutdown 과정에서의 "Singleton bean creation not allowed while the singletons of this factory are in destruction" exception

Spring Batch 로 만든 job 에서 다음과 같은 오류가 간혈적으로 리포팅 되었습니다.Singleton bean creation not allowed while the singletons of this factory are in destruction무슨 오류일까?위 오류는 ApplicationContext가 이미 closed 된 상황에서 새로운 bean을 생성하려거나 접근하려는 경우 발생하는 오류입니다.위와 같은 오류가 항상 발생하는 거라면, ApplicationContext close 이후 명시적으로 lazy 하게 bean을 생성하거나 destory된 bean을 접근하는게 있을 수 있습니다.하지만, 간혈적으로 발생하는 거라면 외부 환경으로 인해 shutdown이 발생했고, 이에 따라 예상치 못하..

개발자 포포 2024.09.15

[Hibernate] Hibernate6 업그레이드시 MySQL Field 함수 변환 오류

이 글은 과거에 운영하던 블로그에서 옮겨온 글 입니다. (2023.12. 작성됨) 이번 포스팅에서는 Hibernate6로 업그레이드 하면서 mysql의 field function 사용에 오류가 발생한 케이스를 공유하고자 합니다.DB에서 데이터를 정렬해서 가져올때, 일반적으로는 특정 칼럼의 오름차순/내림차순 혹은 어떤 연산을 하고 그 값을 기준으로 데이터를 정렬하는 방식을 많이 사용합니다. 하지만 경우에 따라, 실무에서 비즈니스 로직을 구현하다 보면 외부에서 이미 특정 정렬 기준을 세워놓고 해당 순서로 필드 정렬이 필요한 경우들이 있습니다. 그럴때에 MySQL에서는 Field 함수를 이용할 수 있습니다. order by field(기준 column, 값1, 값2, 값3) Spring Boot 3.0 으로 ..

개발자 포포 2024.09.07