JPA
-
-
[JPA] 1+N 문제JPA 2025. 4. 26. 15:59
JPA는 ORM을 통해 객체지향적으로 SQL 쿼리문을 다루고 SQL 쿼리문을 우리가 직접 작성하지 않고 코드레벨에서 함수를 정의하면 이게 SQL 쿼리문으로 바꿔주는거잖임.근데 그때 JPA는 JOIN을 비효율적이라고 생각해서 일부러 JOIN을 안쓰고 select를 두 번 하는 상황을 거쳐서 데이터를 주도록 설계되어있어서 N+1 상황이 발생하는거임.N+1이 발생하는 이유 = JPA가 자체적으로 남발적인 JOIN을 사용하지 않도록 설계되어서 일부러 SELECT를 여러번 거치는 경우로 설계된 것이기 때문임. N+1 문제는 JPA가 객체지향적으로 Lazy Loading을 기본 채택하면서, 무분별한 JOIN을 막기 위해 설계된 결과로 생기는 현상이다."JOIN을 남발하지 않기 위해서" + "객체를 필요할 때 불러오..
-
[JPA] 즉시로딩 지연로딩 (FetchType)JPA 2025. 4. 26. 01:37
지연로딩 로딩되는 시점에 Lazy 로딩 설정이 되어있는 Team 엔티티는 프록시 객체로 가져온다. Member findMember = em.find(Member.class, member.getId());System.out.println(findMember.getTeam().getClass()); Member 조회 시 Team 객체의 클래스를 확인해보면 Proxy 객체가 조회됨. class hello.jpa.Team$HibernateProxy$e97rdqZR // 프록시 객체 하지만 팀의 이름을 출력하는 순간에는 실제 Team 엔티티를 참조해야하므로추가적인 쿼리가 나간다.System.out.println("TEAM NAME : " + findMember.getTeam().getName()); 즉 지연로딩..
-
[JPA] orphanRemovalJPA 2024. 9. 10. 22:28
부모 엔티티가 자식 엔티티의 생명주기를 관리하고 1) 부모가 삭제되거나2) 자식 엔티티가 부모와의 연관관계에서 제거될때 해당 자식 엔티티를 자동으로 삭제해주는 기능이다 예를 들어 특정 Product에 해당하는 Product Image들이 있다면해당 Product가 삭제되었을때 해당 Product에 대한 정보를 알려주는 Image들도 같이 삭제해주는게 맞다 이럴때 직접 ImageRepository에서 해당 Product를 외래키로 갖는 Image들을 찾아서 삭제하는 쿼리를 직접 작성하지 않고 orphanRemoval=TRUE를 써주면 알아서 관련된 Image들을 삭제해주는 기능이 orphanRemoval인 것이다 [orphanRemoval은 특정 자식에 대한 부모가 한 명일때만 사용해야한다!!] 특정 엔..
-
[JPA] cascadeTypeJPA 2024. 9. 5. 14:13
엔티티를 영속화할 때 연관된 엔티티도 함께 영속화하는 편리함을 제공한다 cascade 옵션은 부모 엔티티가 단일 소유자일 때, 부모와 자식의 라이프 사이클을 맞추고 싶을때 사용한다ex) 게시글과 댓글 Cascade의 뜻이 ‘폭포수가 흐르다’ 라는 의미도 갖고 있는걸 알면 직관적으로 파악하기 쉽다 cascadeType.PERSIST부모가 persist될때 연관된 자식들도 persist됨부모가 자식의 전체 생명주기를 관리 casacdeType.REMOVE부모가 삭제되면 자식도 삭제됨but부모와 자식의 관계가 끊어졌다고 해서 자식이 삭제되는 것은 아님!관계가 있는 부모가 삭제되면 연쇄적으로 해당 엔티티와 연관된 자식들도 전부 삭제되는거임!cf) orphanRemoval = true 와 잘 구분해야한다! ca..
-
[JPA] @JoinColumn의 이해JPA 2024. 9. 1. 03:22
@JoinColumn에는 상대 Entity 쪽에 있는 내가 Join할 칼럼명을 지정하는게 아니다!! JoinColumn은 대상 엔티티와 "매핑할 외래키의 현재 테이블에서의 변수명"을 지정해주는 것이다!즉, JPA에서 @JoinColumn을 쓸때 이미 매핑할 PK값은 자동으로 정해져있는 것이다! 그래서 아래와 같은 코드를 적으면 2개의 필드에서 같은 칼럼명으로 매핑하려고 해서MappingException 에러가 뜬다!@OneToOne(fetch = LAZY)@JoinColumn(name = "station_id") // ←← 문제의 원인private Station upStation; // 연관 관계 매핑@OneToOne(fetch = LAZY)@JoinColumn(name = "station_id") //..
-
[JPA] JPA의 이해JPA 2024. 7. 28. 01:22
[JPA 동작방식] 1. JPQL(Java Persistence Query Language) 작성 2. JPQL → SQL 변환 (Native Query로의 변환)JPA가 내부에서 JPQL을 분석해서 네가 사용하는 진짜 데이터베이스에 맞는 SQL을 만듦 3. DB에 Native SQL 전송 후 결과 받아옴 [그럼 여기서 JPQL이란?] JPQL은 Entity 기준 (클래스/필드 기준)SQL은 Table 기준 (DB 테이블/컬럼 기준) JPQL은 DB를 몰라도 작성 가능하게 설계된 거고,JPA가 알아서 테이블 구조, 관계를 기반으로 native SQL을 만들어주는 거야. 그래서 이 JPQL을 어떤 Native Query로 작성해서 CRUD 작업을 했는지 확인하려는게 아래 코드이다.application.ym..
-
연관관계 편의 메서드JPA 2024. 7. 8. 00:32
연관관계의 주인인 클래스를 업데이트해야JPA에 의해 DB에도 제대로 반영됨! Team team = new Team();team.setName("Chelsea");em.persist(team);Member member = new Member();member.setName("ColePalmer");member.setTeam(team); // 연관관계의 주인에게 값 설정!em.persist(member); 이렇게 주인쪽 즉 여기선 Member 객체 쪽에서 Team 값을 설정하고 있음이게 맞는 방법임 아래와 같이 Team 쪽에서 Member 값을 설정하는건 안됨! Team team = new Team();team.setName("TeamA");team.getMembers().add(member); // 주인 아..