JPA 기초(16)
-
[JPA] 변경감지(dirty checking)
Intro 해당 포스팅에서는 JPA가 제공하는 변경감지 기능을 가볍게 다룹니다. "JPA의 영속성 컨텍스트는 객체의 동등성 뿐만아니라 동일성도 보장한다" 는 내용이 포스팅의 핵심이므로 해당 내용을 잘 아시는 분은 넘어가셔도 좋을 것 같습니다!(지적 환영) Problem 팀원분이 JMeter를 이용해 성능 테스트를 진행하던 중, 병목 현상이 발생하는 부분을 발견하였습니다. https://github.com/prgrms-web-devcourse/Team-DarkNight-Kkini-BE/pull/223 [#221] Store내 병목 현상을 유발하는 코드 제거 by JoosungKwon · Pull Request #223 · prgrms-web-devcourse/Team-Dar 🌱 작업 사항 refactor(..
2023.05.18 -
@CreationTimestamp, @UpdateTimestamp
org.hibernate.annotations Hibernate는 엔티티 객체를 대상으로 INSERT, UPDATE 쿼리가 발생할 때, 현재 시간을 자동으로 저장해주는 어노테이션을 제공한다. @CreationTimestamp INSERT 쿼리를 날릴 때, 현재 시간을 값으로 채운 뒤 쿼리를 생성하게 된다. 따로 생성 시간을 관리하는 수고를 덜어준다. @UpdateTimestamp UPDATE 쿼리를 날릴 때마다 현재 시간을 값으로 채운 뒤 쿼리를 생성한다. 변경 사항이 발생할 때마다 마지막 변경 시간으로 자동 변경되므로 업데이트 할 경우 요긴하게 사용할 수 있다. 용례 @Entity @Getter @Builder public class User { @Id @GeneratedValue(strategy = ..
2022.10.04 -
[JPA] could not initialize proxy - no Session org.hibernate.LazyInitializationException
서비스 계층에서 아래의 modify 메소드를 작성하였고, 두 번째 이미지의 테스트 코드를 작성했다. modify 메소드는, PK로 Board를 가져온 뒤 내용과 제목을 변경한 후 save하는 메소드다. 서비스 계층에는 트랜잭션이 없으므로, 변경감지를 사용하지 않고 save 메소드를 통해 엔티티를 변경하였다. BoardService를 주입받은 뒤 아래의 modifyTest() 메소드를 실행한 결과 could not initialize proxy [com.example.board.entity.Board#2] - no Session org.hibernate.LazyInitializationException: could not initialize proxy [com.example.board.entity.Boar..
2022.09.07 -
JPQL: fetch join - 컬렉션 페치 조인, 페치 조인 특징과 한계, 페이징
컬렉션 페치 조인(데이터 뻥튀기 조심하라) 일대다 관계를 가정해보자. 현재 팀A에 멤버가 두명 속해있다. 이때 테이블을 조인하면 테이블이 아래와 같아진다. 따라서 DB에서 결과가 두줄이 날라온다... SQL을 아는 사람이라면 DISTINCT 요소로 중복을 제거할 수 있을 것이라는 생각이 들 것이다. 근데 SQL의 DISTINCT는 컬럼의 모든 값이 일치해야 중복으로 처리되어 제거된다. 이 경우 Member의 Id와 Name이 다르다. 하지만 JPQL의 DISTINCT는 추가 기능을 제공한다. SQL에 DISTINCT를 추가할 뿐만 아니라 애플리케이션에서 엔티티 중복을 제거한다. 따라서 JPQL에서는 같은 식별자를 가진 Team 엔티티를 퍼올릴때 중복을 제거한다. 페치 조인과 일반 조인의 차이 "selec..
2022.04.04 -
JPQL: fetch join - 페치 조인, N+1의 문제
들어가기 앞서서 페이조인은.. • SQL 조인 종류가 아니다 • JPQL에서 성능 최적화를 위해 제공하는 기능이다. • 연관된 엔티티나 컬렉션을 SQL 한 번에 함께 조회하는 기능이다 • join fetch 명령어로 사용하면 된다 • [ LEFT [OUTER] | INNER ] JOIN FETCH 조인 경로를 지정할 수 있다. 그럼 시작~! 다음과 같은 상황이 있다고 가정하다. 회원과 팀 엔티티가 있는 상황에서, 회원을 조회하면서 연관된 팀도 함께 조회하고 싶다. 회원도 궁금하고 그들의 소속 팀도 함께 보고싶다!!!! 이때 사용하는 것이 페치 조인이다. select m from Member m join fetch m.team select 프로젝션에 m 하나인데, 실제 SQL은 select M.* T.* ..
2022.04.04 -
경로 표현식
용어 정리 • 상태 필드(state field): 단순히 값을 저장하기 위한 필드 (ex: m.username) • 연관 필드(association field): 연관관계를 위한 필드 • 단일 값 연관 필드: @ManyToOne, @OneToOne, 대상이 엔티티(ex: m.team) • 컬렉션 값 연관 필드: @OneToMany, @ManyToMany, 대상이 컬렉션(ex: m.orders) 경로표현식 특징 • 상태 필드(state field): 경로 탐색의 끝, 탐색이 더이상 불가능하다. • 단일 값 연관 경로: 묵시적 내부 조인(inner join) 발생, 탐색이 가능하다. • 컬렉션 값 연관 경로: 묵시적 내부 조인 발생, 탐색이 불가능하다. 컬렉션 값 연관경로는 FROM 절에서 명시적 조인을 통..
2022.04.04