안녕세계

1차 캐시 작동 조건JPA의 1차 캐시는 엔티티를 메모리에 임시로 저장하여 불필요한 DB 쿼리를 줄이고 성능을 향상시키는 중요한 기능입니다. 1차 캐시는 EntityManager가 관리하는 영속성 컨텍스트(persistence context) 내에서 엔티티를 보관하는 저장소로, 주로 트랜잭션 범위 내에서 작동합니다. 즉, 한 트랜잭션 내에서 처음 조회한 엔티티는 두 번째부터 DB에 접근하지 않고 1차 캐시를 통해 데이터를 가져올 수 있게 됩니다. 1차 캐시가 제대로 작동하기 위해서는 몇 가지 조건이 필요합니다. 영속성 컨텍스트 존재1차 캐시는 영속성 컨텍스트 내부에 있으므로, 영속성 컨텍스트가 반드시 존재해야합니다.각 영속성 컨텍스트는 독립적인 1차 캐시를 가지므로, 다른 영속성 컨텍스트에서는 동일 엔티..

JPA에서 논리적 삭제(Soft Delete)를 구현할 때 자주 사용하는 방법으로 Hibnerate의 @Where와 @SQLRestriction 어노테이션이 있습니다. 두 어노테이션 모두 특정 컬럼 값을 기준으로 데이터를 자동으로 필터링할 수 있도록 지원합니다. 하지만, 각 어노테이션은 Hibernate 버전에 따라 지원 여부와 동작 방식에 차이가 있으며, 특히 Hibernate 5.x의 @Where는 JOIN 연산 시 전역 조건이 제대로 적용되지 않는 한계가 있습니다. 본 글에서는 실제 테스트 사례를 통해 @Where 어노테이션의 한계를 분석하고, 이를 해결할 수 있는 Hibernate 6.x의 @SQLRestriction 어노테이션을 소개합니다.@Where 어노테이션과 한계@Where는 엔티티 클래스..

JPA 엔티티의 생명주기JPA를 제대로 활용하려면, 단순히 save()나 delete()를 호출하는 걸 넘어서 엔티티가 어떤 과정을 거쳐 상태가 변경되고, 언제 DB에 반영되는지를 이해할 필요가 있습니다. 이를 이해하는 데 핵심이 되는 개념이 바로 JPA 엔티티의 생명주기(Entity Life Cycle)입니다. 엔티티 객체는 “생성된 상태”에서 시작해, “영속성 컨텍스트에 저장되고”, “변경되며”, “삭제되는” 흐름을 하나의 생애 주기로 관리 됩니다. 이 흐름을 제대로 파악하여 불필요한 쿼리를 방지하고, 의도하지 않은 오류를 막을 수 있습니다.엔티티 상태Transient(비영속 상태)Transient 상태는 엔티티가 생성만 된 상태로, 데이터베이스와 아무런 관계가 없는 상태입니다. 즉, new 키워드로..
들어가기 전에API 요청과 응답에는 entity를 사용하지 않고, API 스펙에 따라 별도의 DTO를 만드는 것을 권장합니다.🙅♀️ 요청/응답에 entity를 사용하면? 특정 API 전용의 DTO가 아니기 때문에 어떤 요청이 넘어올지 알기 어렵습니다.entity 정의가 바뀌면 API 스펙이 변경되어 API가 깨집니다.🙆♂️ 요청/응답에 DTO를 사용하면? entity와 presentation layer를 분리할 수 있습니다.entity는 DB에서 사용되는 데이터 구조를 정의하고 DB와 상호작용하는 클래스입니다.persentation layer는 클라이언트가 요청한 데이터를 받아 그 데이터를 가공하여 응답하는 역할을 합니다.예제 entity 정의@Entity@Table(name = "orders")..