Back-End/JPA
-
JPA의 연관관계에 대한 고찰Back-End/JPA 2022. 11. 18. 13:58
JPA의 XtoOne 관계를 설정할 때, fetchType 옵션은 기본적으로 eager로 설정되어있다. 따라서, 따로 Lazy 타입으로 설정을 하지 않는 경우 자신과 연관관계가 있는 엔티티를 호출하는 쿼리가 자동으로 나가게 되고 성능상으로 굉장한 손해가 온다(고 한다). 이론상으로만 배워왔기에 매번 헷갈리는 경우가 많았고, 따라서 한 번 실습을 진행 해 보면서 실제로 쿼리가 동작하는 것을 관찰 해 보려고 한다. 또한, eager로 fetch된 엔티티와 연관관계가 있는 또 다른 entity가 있고, 이들 또한 eager로 설정이 되어있다면 어떻게 query가 나가게 되는지를 관찰 해 보려 한다. 먼저, 예시 Entity를 만들기 위해, 다음과 같이 Entity 관계를 설정하였다. 만들고 나니 굉장히 이진트..
-
JPA Auditing과 MappedSuperClass 활용Back-End/JPA 2022. 9. 14. 15:03
프로젝트에서 리뷰, 리뷰 답변 등의 Entity를 설계할 때 생성일자와 수정일자 등의 필드가 공통적으로 들어가게 되었다. 또한 이러한 값들의 경우 매번 insert 및 update 시 값을 설정 해 주어야 한다. 이 때, JPA의 Auditing 기능과 MappedSuperClass 기능을 활용하면 이를 간단히 해결할 수 있다. 공식문서를 보면, JPA Auditing은 다음과 같이 정의되어 있다. In the context of ORM, database auditing means tracking and logging events related to persistent entities 현재 프로젝트에서는 생성 시간과 수정 시간만이 필요하므로 이를 Spring JPA Data의 @CreatedAt, @La..
-
JPA에서, Many To One 관계의 Post 요청에서 주의할 점Back-End/JPA 2022. 8. 25. 11:27
Review 테이블이 있고, 리뷰와 함께 보여질 리뷰이미지를 의미하는 ReviewImage 테이블이 있다고 하자. 하나의 리뷰에 여러 개의 이미지를 달 수 있으므로, 이들은 1 대 다 관계이다. 리뷰를 post하는 서비스의 RequestDto는 다음과 같다. { "title" : "맛있어요", "content" : "또 가고 싶습니다.", "reviewImages" : [{ "url" : "https://naver.com" }] } postReview 서비스는 다음과 같다. @Transactional public UUID postReview(CreateReviewRequestDto dto){ Review review = Review.ReviewBuilder() .title(dto.getTitle()) ...
-
JPA의 entity update는 어떻게 이루어질까?Back-End/JPA 2022. 5. 3. 10:04
spring-data-JPA에서, entity에 대해 save 메서드는 있지만 update에 대한 메서드가 따로 없다. 이유는 JPA는 '변경감지'라는 기능을 활용하기 때문이다. 엔티티를 영속 상태로 만들 때, 처음 엔티티의 정보에 대한 스냅샷을 저장을 해 둔다. 이 후, 트랜잭션이 끝날때 까지 해당 정보를 유지하다가, 트랜잭션이 종료될 때(혹은 flush를 날릴 때) 해당 엔티티의 변화를 스냅샷과 비교한 뒤 이를 감지하여 update 쿼리를 자동으로 생성하여 DB에 날리게 된다. @Transactional public void update(Long id, String name){ Member member = memberRepository.findById(id); member.setName(name); ..