본문 바로가기

legacy/JPA

(30)
[JPA-Error] fetch join과 new 연산자를 통한 DTO 변환 문제 발생 먼저 정의된 Entity를 먼저 보겠다. Member Entity Team과 N:1 연관관계에 있다. :age and m.username = :username" ) public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "member_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "team_id") private Team team; private String username; private int age; /** * 연관관계 편의 메서드 */ public void changeTeam(Team t..
[JPA] 연관관계에 있는 엔티티 영속화 시키기, CASCADE 엔티티 A와 B가 영속관계에 있을 때 A를 영속화시켰을 때 자동으로 B까지 영속화시키려면 CASCADE를 사용해야 합니다. 사용방법에 대해서 알아보겠습니다. CASCADE란? CASCADE란 영속성 전이라고 합니다. 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶을 때 사용합니다. JPA는 CASCADE 옵션을 제공하여 em.persist()를 사용하지 않아도 엔티티를 영속화시킬 수 있습니다. CASCADE의 옵션은 다음과 같습니다. ALL, 아래에 있는 모든 옵션 적용 PERSIST, 특정 엔티티 영속화 MERGE, 병합 REMOVE, 삭제 REFRESH DETACH 연관관계에 있는 Entity 영속화, Cascade.PERSIST A엔티티를 영속화시킬 때 연관관계에 있..
[JPA-Error] 빌더 패턴을 사용하여 양방향 연관관계를 맺을때 NullPointerException 예외 발생 문제 발생 @ManyToOne 그리고 @OneToMany로 양방향 연관관계를 맺으면 NullPointerException이 발생하였다. Board(게시물)와 View(조회수, 좋아요) Entity 간의 연관관계를 맺었다. Board Entity @Entity @Getter @Builder @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Board { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "board_id") private Long id; private String title; // 제목 private String conte..
[JPA-Error] 게시물 조회 순환참조 stackoverflow 현재 상황 양방향 참조 관계에 있는 Entity를 조회하는 과정에서 StackOverFlow 예외가 발생하였다. 일단 양방향 관계에 있는 Member와 Board Entity이다. Member Entity @Entity @Getter @Builder @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED) @ToString(of = {"loginId", "password", "username", "nickName", "email", "phone"}) public class Member { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "member_id") pr..
[JPA] 벌크연산와 영속성 컨텍스트는 별개다? 벌크 연산 벌크 연산이란 1개 이상의 데이터를 update 할 때 사용합니다. 벌크 연산 사용 X 식별자를 통해 Entity를 조회하여 변경 감지(Dirty Checking)를 사용합니다. 따라서 식별자에 해당하는 1개의 데이터에만 update가 수행됩니다. @Repository @RequiredArgsConstructor public class MemberJpaRepository { private final EntityManager em; public void update(Member member, Team team) { Member findMember = em.find(Member.class, member.getId()); findMember.changeTeam(team); } } 벌크 연산 사용 O..
[JPA-Error] 페이징(Paging) 주의 원인 SpringDataJpa에서 제공하는 페이징 관련 인터페이스를 사용하면서 오류가 발생했다. 내가 생각했던 페이징의 결과와 다른 값이 반환되었다. Repository Member Entity의 age 필드를 기준으로 정렬하기 위하여 Repository에 메서드를 선언하였다. public interface MemberRepository extends JpaRepository { Page findByAge(int age, Pageable pageable); } 내가 페이징 하려는 조건은 다음과 같다. age가 10인 Member를 조회한다 각 페이지에 3개의 데이터를 출력한다 0번이 아닌 1번 페이지부터 출력한다 내림차순으로 정렬한다 위의 4가지 조건을 갖추어서 다음과 같이 코드를 작성하였다. age가..
[JPA] 1:N에서 fetch join의 한계와 해결 N:1과 달리 1:N에서 fetch join을 사용하면 중복 데이터가 조회되는 문제가 발생합니다. 1:N에서만 문제가 발생하는 이유를 알기 위해서는 N:1과 1:N에서 fetch join을 수행하는 과정을 알아야 합니다. Member Entity @Entity @Getter @Setter public class Member { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; private String name; @ManyToOne(fetch = FetchType.LAZY) Team team; } Team Entity @Entity @Getter @Setter public class Team { @Id @GeneratedValue @Co..
[JPA] fetch = EAGER 사용시, JPQL에서 N+1 문제 발생 들어가기 앞서, 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..