JPA(7)
-
[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 -
JPA 에러: save the transient instance before flushing
개인 프로젝트의 테스트 코드에서 위와 같은 에러가 발생했다. 오브젝트가 저장되지 않은 인스턴스를 참조하고 있다는 메시지로 보인다. 검색 결과 FK 로 사용되는 컬럼에 값이 없는 상태에서 데이터를 넣으려다 발생한 에러인 듯 싶다. 예를 들어 멤버(id, name, team_id), 팀(id, name)의 테이블에서 팀의 데이터가 없는 채로 멤버의 데이터를 넣으려고 하면 위의 에러가 발생한다는 뜻이다. 이 경우 멤버를 영속상태로 만들때 팀도 자동으로 영속화해주는 Cascade 옵션을 사용해 해결이 가능하다. 상품(Item) 1 : N ItemCategory N : 1 카테고리(Category) 의 테이블에서 @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType..
2022.06.07 -
No entity found for query 에러
서비스 계층에서, 회원 가입 시 입력한 아이디와 같은 ID를 사용중인지 체크하고자 한다. 위의 코드는 리포지토리에서 작성한 코드인데, No entity found for query 에러가 발생했다. 이는 쿼리문이 잘못되었다기 보다는 동일한 ID를 가진 엔티티가 없어서, getSingleResult()에서 에러가 발생한 것으로 보인다. getSingleResult()는 결과가 null일 경우 따로 처리를 해주어야 한다. Optional을 사용하는 것이 null체크 코드보다 깔끔하므로 아래와 같이 코드를 수정했다. public Optional findMemberByLoginId(String loginId){ List members = em.createQuery("select m from Member m wh..
2022.06.01 -
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