Backend/JPA

    영속성 전이 (Cascade), 고아 객체

    영속성 전이 (Cascade), 고아 객체

    영속성 전이(Cascade) 특정 엔티티를 영속 상태로 만들 때 연관 관계에 있는 엔티티도 함께 영속 상태로 만들고 싶은 경우 사용한다. @Entity public class Parent { @Id @GeneratedValue private Long id; private String name; @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL) private List childList = new ArrayList(); ... } @Entity public class Child { @Id @GeneratedValue private Long id; private String name; @ManyToOne @JoinColumn(name ="parent_id..

    즉시 로딩과 지연 로딩

    즉시 로딩과 지연 로딩

    지연 로딩을 통해 연관관계 데이터를 실제 조회 시점에 가져오는 것이 가능하다. fetch = FetchType.LAZY @ManyToOne(fetch = FetchType.LAZY) // 지연 로딩으로 세팅 @JoinColumn(name = "TEAM_ID") private Team team; 연관 관계 엔티티를 지연 로딩으로 세팅하면 프록시로 가져온다. 지연 로딩으로 가져온 엔티티는 실제 값을 사용하는 시점에 프록시를 초기화한다. Member member1 = new Member(); member1.setUsername("zayson1"); member1.setTeam(team); // Team의 데이터는 프록시로 가져온다. (Team 조회 쿼리 안날아감) Member member = em.find(M..

    프록시

    프록시

    연관관계가 있는 엔티티를 조회 시에 상황에 따라 한번에 연관관계 데이터까지 가져오거나 조회를 원한 특정 엔티티만 조회하고 싶은 경우가 있다. 회원과 팀이 연관관계가 있는 경우 회원 정보를 조회하면서 회원이 속한 팀의 정보도 함께 조회하고 싶은 경우 회원과 팀이 연관관계가 있는 경우 회원 정보만 조회하고 팀의 정보는 조회하고 싶지 않은 경우 JPA는 이러한 상황을 해결하기 위해 프록시와 지연로딩을 통해 해결해준다. 프록시 기초 em.getReference() : 데이터베이스 조회를 미루는 프록시(가짜) 엔티티 객체를 가져온다. 따라서 쿼리가 실행되지 않는다. Member findMember = em.getReference(Member.class, member.getId()); System.out.print..

    상속관계 매핑

    상속관계 매핑

    객체지향은 상속관계가 존재하지만 RDB는 상속 관계가 없다. RDB에는 슈퍼타입/서브타입 관계같은 상속 관계와 비슷한 모델링 기법이 있다. 물품을 RDB 논리 모델링을 진행하는 경우 물품 > 음반, 영화, 책 → 공통된 데이터를 물품이 갖는다 (슈퍼타입 / 서브타입) 슈퍼타입/서브타입 → 객체 상속관계 변환 방법 조인 전략 : 슈퍼타입용 테이블과 서브타입 테이블을 따로 구성하고, 슈퍼타입 테이블에 구분 컬럼을 둔다. 정규화가 잘 된 테이블 전략이다. 단일 테이블 전략 (Default) : 서브타입 테이블 컬럼을 슈퍼타입 테이블 하나에 모은다. 구분 컬럼을 둔다. 성능적인 측면에서 장점이 있다. 구현 클래스 별 테이블 전략 : 슈퍼타입의 공통 데이터를 서브타입 테이블에 컬럼으로 넣어 사용한다. 조인 전략 ..

    엔티티 설계의 주의사항 간단 정리

    엔티티 설계의 주의사항 간단 정리

    "김영한 강사님의 JPA 활용편 1을 듣고 필요한 부분 간단하게 정리하기" 엔티티에는 Setter를 사용하지 않는 것이 좋다. 모든 연관관계는 지연로딩으로 설정한다. 즉시로딩은 회원이랑 주문이 연관관계 있는 경우 회원을 조회하면 주문도 한번에 조회가 되는것을 말함 예측이 어렵고 어떤 SQL이 실행될지 모를 수 있다. 지연 로딩 (LAZY)로 설정하고 Fetch Join을 이용해 데이터를 가져온다. JPQL을 실행할 때 N(연관된 회원 조회 100번) + 1 (주문 쿼리 한번) 문제의 발생 XtoOne관계는 모드 EAGER가 default로 되어있다 → 반드시 LAZY 설정 컬렉션 필드는 초기화를 한다. List orders = new ArrayList(); NPE에 대해 안전해진다. 하이버네이트가 엔티티..