전체 글
-
[JPA] fetch = EAGER 사용시, JPQL에서 N+1 문제 발생legacy/JPA 2024. 1. 13. 01:39
들어가기 앞서, Proxy와 지연로딩의 개념을 알아야 합니다. 여기를 참고해 주세요! N + 1 문제란? JPQL을 사용하여 Entity를 조회할 때, 연관관계에 있는 Entity를 같이 조회할 때 발생하는 문제입니다. 연관관계에 있는 Entity를 즉시로딩(fetch = EAGER)로 조회하면 추가적인 쿼리문이 발생합니다. 즉, 조회된 Entity에 연관된 N개의 Entity를 조회하는 쿼리문이 N번 발생합니다. 예를 들어, Member Entity와 Order Entity가 존재합니다. Member Entity와 Order Entity는 1:N 관계라고 가정합시다. Member Entity @Entity @Getter @Setter public class Member { @Id @GeneratedVa..
-
[JPA] Proxy와 연관관계, 지연로딩을 이용한 최적화 (new)legacy/JPA 2024. 1. 8. 16:27
주문 Entity 주문 Entity가 가지고 있는 필드는 다음과 같습니다. 연관관계에 있는 Entity를 집중해 봅시다. 주문 Entity는 회원(Member), 주문 상픔(OrderItem), 배송 정보(Delivery) Entity와 연관관계에 있습니다. @Entity @Table(name = "orders") @Getter @Setter public class Order { @Id @GeneratedValue @Column(name = "order_id") private Long id; @ManyToOne @JoinColumn(name = "member_id") private Member member; @OneToMany(mappedBy = "order", cascade = CascadeType...
-
[Spring] API 통신시 Entity에 직접 접근하지 말자legacy/Spring 2024. 1. 7. 16:02
뷰템플릿을 사용하여 통신할 수도 있지만, 프론트 또는 앱과 API 통신을 통해 데이터를 주고받기도 한다. 이때 API 스펙을 작성하여 요청 정보와 응답 정보를 작성하게 된다. API마다 요청과 응답 정보가 다르기 때문에 Entity에 직접 접근해서는 안 된다. 그 이유를 알아보자. 다음은 회원에 대한 Entity이다. 고유 번호, 이름, 주소, 주문 정보 필드를 가지고 있다. @Entity @Getter @Setter public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; private String name; @Embedded private Address address; @OneToMany(mapped..
-
[JPA] 변경감지(Dirty Checking)과 병합(Merge)legacy/JPA 2024. 1. 4. 17:10
영속성 컨텍스트에는 변경 감지(Dirty Checking)와 병합(Merge) 기능이 존재합니다. Entity의 필드값을 수정한다는 공통점이 있으나, 주의해야 할 차이점 또한 존재합니다. 이 글에서는 준영속 상태의 Entity에 접근하는 관점에서 설명합니다. 변경 감지(Dirty Checking) 변경 감지란 영속성 컨텍스트가 관리하는 영속 상태의 Entity의 필드 값을 수정합니다. (영속 상태라 함은 Entity가 식별자 값(ID)을 가지고 있음을 말합니다) 영속성 컨텍스트를 Flush하는 시점에 Entity와 SNAPSHOT을 비교하여 변경된 값을 추적합니다. 변경된 필드가 존재한다면 수정 쿼리를 작성하여 쓰기 지연 SQL 저장소에 보관하였다가 Flush 시점에 DB에 업데이트됩니다. 변경 감지..
-
[JPA] 비영속 엔티티 -> 영속 엔티티 변경 과정 (old1)legacy/JPA 2023. 12. 28. 23:21
EntityManager를 통해 비영속 상태의 Entity를 영속 상태의 Entity로 변경할 수 있습니다. 이때 사용되는 메서드는 merge()입니다. 그렇다면 비영속 -> 영속 상태로 변경하는 과정은 어떻게 될까요? 차근차근 알아봅시다. 준영속 상태 준영속 상태란 EntityManager가 관리하지 않는 Entity라고 생각하면 됩니다. 관리되지 않기 때문에 해당 엔티티의 값을 변경하더라도 DB에 반영되지가 않습니다. 준영속 상태의 특징은 다음과 같습니다. 비영속 상태에 가깝다 영속성 컨텍스트에 의해 관리되지 않으므로 1차 캐시, 쓰기 지연 SQL, 변경 감지 등을 지원하지 않습니다 식별자 값을 가지고 있다 준영속 상태가 되기 전에 영속 상태이었기 때문에 식별자 값을 가지고 있습니다. 이 식별자 값은..
-
[Spring-Error] java.sql.SQLException: Generated keys not requested.legacy/Spring 2023. 11. 5. 13:09
원인 DB에서 기본키를 자동으로 증가하는 전략을 사용할 때, 서버에서 DB에 등록된 키를 가져오지 못해서 발생하는 오류 코드 public Long enrolBoard(BoardEnrolDto boardEnrolDto) { KeyHolder keyHolder = new GeneratedKeyHolder(); jdbcTemplate.update(connection -> { PreparedStatement stmt = connection.prepareStatement("INSERT INTO Board(title, name, content, created_date, view_cnt) VALUES(?, ?, ?, ?, ?)"); stmt.setString(1, boardEnrolDto.getTitle()); st..