[JPA] 변경 감지와 병합(Merge)
2023. 4. 22. 22:27
데이터베이스/JPA
준영속 엔티티를 수정하는 2가지 방법 ⭐️준영속 엔티티란? JPA에서 영속성 컨텍스트에서 분리된 엔티티 즉, 영속성 컨텍스트가 더는 관리하지 않는 엔티티를 말한다. 영속성 컨텍스트는 JPA가 엔티티를 관리하는 곳으로, 영속 상태(Persistent)인 엔티티는 영속성 컨텍스트에 저장되어 관리된다. 영속 상태인 엔티티가 영속성 컨텍스트에서 분리되면 준영속 상태(Detached)가 된다. 준영속 상태의 엔티티는 더 이상 영속성 컨텍스트에서 관리되지 않으며, 영속성 컨텍스트에서 분리된 이후에는 엔티티를 수정하더라도 JPA는 이를 인식하지 못한다. 준영속 엔티티를 수정하는 방법은 변경 감지 및 병합 사용하는 방법이 있다. 변경 감지 영속성 컨텍스트에서 엔티티를 다시 조회한 후에 데이터를 수정하는 방법으로 트랜잭..
[JPA]@Formula
2023. 2. 5. 16:20
데이터베이스/JPA
Hiberante에서 제공하는 @Formula 어노테이션을 사용하면 가상 컬럼을 만들수 있다고 한다. 가상컬럼이라는 것은 JPA 상에는 존재하지만 DB에는 생성되지 않는 칼럼을 말한다. 주의해야 할 점은 하이버네이트 문서에도 언급되어 있지만 네이티브 SQL을 사용한다는 것이다. 때문에 RDBMS의 종류를 교체하는 경우 호환성에 문제 가 있을 수도 있다. 언제 사용하는가? 예제들을 보면 댓글 개수구하기, 좋아요 개수구하기, 글자수 구하기등 무언가를 카운팅할 때 주로 사용하는 것으로 보인다. 사용법 사용법은 매우 간단하다 Entity 필드에 @Formula(쿼리)를 달아주면 된다. //댓글 개수 @Formula("(SELECT count(1) FROM reply r WHERE r.boardId = id)")..
[JPA] Entity Lifecycle Events
2022. 12. 31. 11:53
데이터베이스/JPA
@PrePersist 선언된 것이 뭔지도 모르고 @PrePersist가 선언된 메소드를 실행 후 Repository.save(객체) 를 해버린 부끄러움을 잊지 않기위해.....ㅎㅎ Entity Event?? https://www.baeldung.com/jpa-entity-lifecycle-events 문서에 보면 아래와 같이 적혀있다. JPA는 다음과 같은 7개의 선택적 수명 주기 이벤트를 지정합니다. - 새로운 엔티티에 대해 persist가 호출되기 전에 – @PrePersist - 새로운 엔티티에 대해 persist가 호출된 후 – @PostPersist - 엔티티가 제거되기 전 – @PreRemove - 엔티티가 삭제된 후 – @PostRemove - 업데이트 작업 전 – @PreUpdate - 엔..
[JPA] JPQL @Query에 각 DB function() 사용해보기
2022. 12. 31. 11:19
데이터베이스/JPA
JPQL에서 기본적으로 지원하는 function만으로는 비지니스의 조회를 해결하기는 한계가 존재한다. nativeQuery를 사용하여 fetch까지 할 수 있는 방법을 찾다가 function() 을 찾게되었다. function을 쓰게 된 이유 AccountUser의 엔티티는 회원을 생일을 LocalDate로 저장되어 있다. @Getter @Setter @Entity public class AccountUser { @Id private Long id; @NotNull private LocalDate birth; } 회원 목록 조회시 생년월일 중 월만 맏아서 조회를 하게 되는 기획이 있다. MSSQL을 사용하고있어서 SUBSTRING(CONVERT(VARCHAR(8), birth, 112), 5, 2)) C..
[JPA] Pageable과 countQuery 사용한 Spring-Data FETCH JOIN
2022. 11. 24. 13:37
데이터베이스/JPA
시도 아래와 같이 DB에서 페이징으로 정보를 가져와한다 .하지만 N+1 문제가 발생해 @Query 로 쿼리를 직접 적어 fetch join을 시도했다. userRepository.findAll(pageable) 문제발생 Pageable를 사용한 조회시 n+1문제가 발생해 @Query("SELECT S FROM ADMIN S LEFT JOIN FETCH....") 를 사용하여 문제를 해결하려고 했다. 하지만 아래와 같은 에러가 발생. Caused by: java.lang.IllegalArgumentException: org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was n..
[JPA] Fetch 전략과 @EntityGraph로 n+1 해결하기(2)
2022. 8. 4. 21:03
데이터베이스/JPA
지난 번에는 Fetch전략인 LAZY와 EAGER에 대해 알아봤다. 하지만 조회된 테이블의 연관관계 된 테이블까지 써야한다면 @EntityGraph를 사용하는게 좋다. 이 글에서는 @EntityGraph에 대해서 다뤄볼 예정입니다. n+1이 뭔지 Fetch전략에 대해서 잘 모르신다면 아래 링크를 먼저 읽어보는 것도 좋을 것 같습니다. 2022.08.03 - [데이터베이스/JPA] - [JPA] Fetch 전략과 @EntityGraph로 n+1 해결하기(1) [JPA] Fetch 전략과 @EntityGraph로 1+n 해결하기(1) JPA를 사용하기전 Mybatis를 사용할 때는 xml로 객체를 SQL에 매핑하는데 시간을 썼지만 JPA는 자동으로 쿼리를 만들어줘서 편하게 사용하고 있었다. 하지만 편한 만큼..
[JPA] Fetch 전략과 @EntityGraph로 n+1 해결하기(1)
2022. 8. 3. 22:12
데이터베이스/JPA
JPA를 사용하기전 Mybatis를 사용할 때는 xml로 객체를 SQL에 매핑하는데 시간을 썼지만 JPA는 자동으로 쿼리를 만들어줘서 편하게 사용하고 있었다. 하지만 편한 만큼이나 나도 모르게 1 + n 쿼리가 실행되고 있었다. 이것만 잘 컨트롤 해줘도 성능이 좋아지고 JPA이해도가 높아지는 것 같다. 이번 글에는 Fetch Join과 Fetch 전략을 사용해서 n+1을 개선할 것이다. n+1 이란? Car 라는 클래스와 그 차의 주인인 Master라는 클래스가 있습니다. 아시다시피 차 주인은 여러 대의 차를 가질 수 있으니 차와 주인의 관계는 N : 1 관계입니다. @Entity public class Master { @Id @GeneratedValue(strategy = GenerationType.I..
[JPA] JPA로 Pageable사용해서 페이징 처리하기
2022. 6. 29. 11:40
데이터베이스/JPA
목적 HTML단에 페이징처리를 하고싶은데 서버에서 JPA와 Pageable를 이용해 간단하게 데이터를 가공할 수 있다고 해서 정리를 해보았다. Controller Pageable를 파라메타로 선언해준다. @GetMapping("/") public String blogView(Model model, @PageableDefault(size = 6, sort = "createDate", direction = Sort.Direction.DESC) Pageable pageable, @RequestParam(value = "currentPage", defaultValue = "1") int page) { model.addAttribute("pageable", blogRepository.findAll(pageable..