[JPA] 변경 감지와 병합(Merge)
2023. 4. 22. 22:27
데이터베이스/JPA
준영속 엔티티를 수정하는 2가지 방법 ⭐️준영속 엔티티란? JPA에서 영속성 컨텍스트에서 분리된 엔티티 즉, 영속성 컨텍스트가 더는 관리하지 않는 엔티티를 말한다. 영속성 컨텍스트는 JPA가 엔티티를 관리하는 곳으로, 영속 상태(Persistent)인 엔티티는 영속성 컨텍스트에 저장되어 관리된다. 영속 상태인 엔티티가 영속성 컨텍스트에서 분리되면 준영속 상태(Detached)가 된다. 준영속 상태의 엔티티는 더 이상 영속성 컨텍스트에서 관리되지 않으며, 영속성 컨텍스트에서 분리된 이후에는 엔티티를 수정하더라도 JPA는 이를 인식하지 못한다. 준영속 엔티티를 수정하는 방법은 변경 감지 및 병합 사용하는 방법이 있다. 변경 감지 영속성 컨텍스트에서 엔티티를 다시 조회한 후에 데이터를 수정하는 방법으로 트랜잭..
[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] 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..
[JPA] JPA 대해서
2022. 6. 29. 11:40
데이터베이스/JPA
ORM이란… ⭐️ ORM은 Object Relational Mapping 의 약어로서, 객체와 DB간의 관계를 매핑해주는 도구입니다. 개발자는 서로를 각각의 특색에 맞게 설계하여 ORM을 통해 추가적인 코드, 설계 없이 각각을 매핑시킬 수 있습니다. ORM 사용을 간단하게 표현한 그림 SQL 쿼리를 사용할 줄 알아도 왜 굳이 ORM 프레임워크를 이용하는 것이 좋은지에 대해 짚고 넘어가야할 것 같습니다. 장점 생산성이 증가합니다. ⭐️ 간단한 SELECT(조회)를 사용하더라도 SQL 쿼리를 프로그래밍 언어에서 사용한다면 자바로는 메소드를 만들어서 쿼리문을 작성하여 그것을 리턴해주고 그것을 SQL 쿼리에서 받아 DB에서 그에 맞는 데이터를 가져오고 그 데이터를 또다시 객체로 매핑하여 받아오는 아주 귀찮은 일..