본문 바로가기

Spring/JPA

(30)
JPA- 즉시 로딩, 지연 로딩 지연 로딩 예를 들어 Member와 Team이 서로 다대일 연관관계 매핑 되어있다고 하자. 이런 상황에서 기본적으로 Member를 조회하게 된다면 Member에 대한 select 쿼리가 나가고 그 안에 Team에 대한 Join 쿼리도 존재할 것이다. 코드로 보자. JpaMain.class public class JpaMain { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.beg..
JPA- 프록시 프록시란 프록시는 가짜 객체를 의미한다. em.find()를 하면 DB나 영속성 컨텍스트에서 실제 엔티티 객체를 찾아서 반환하는 것과는 달리, 프록시는 실제 객체가 아니다. - em.getReference() 프록시를 조회하기 위해선 em.getReference() 메서드를 이용한다. 비교를 위해서 em.find()문 사용시 쿼리를 보자. em.find()로 Member 객체 조회 public class JpaMain { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); EntityManager em = emf.createEntityManager(..
JPA- @MappedSuperClass @MappedSuperClass package hellojpa; import javax.persistence.MappedSuperclass; import java.time.LocalDateTime; @MappedSuperclass // 이 클래스를 상속받는 엔티티들은 공통적으로 이 클래스의 필드를 상속받지만, // 따로 이 클래스에 대한 테이블이 만들어지진 않는다. public class abstract BaseEntity { private String createdBy; private LocalDateTime createdDate; private String modifiedBy; private LocalDateTime modifiedDate; // Getter, Setter public String g..
JPA- 상속관계 매핑 기본적으로 테이블에는 상속관계라는 개념이 존재하지 않는다. 따라서 우리가 객체적으로는 상속관계라고 하더라도 테이블 상에서는 그렇지 않을 수 있는데 이런 것을 가능하게 해주는 것이 @Inheritance 어노테이션이다. 이 또한 상속은 아니고 슈퍼타입, 서브타입을 통해서 상속과 비슷한 역할을 한다. @Inheritance 위의 어노테이션을 사용해서 상속관계에 있는 엔티티들을 테이블상에서 매핑할 수 있다. 예를들어, Item을 상속하는 Album, Movie, Book 클래스가 있다고하자. - @Inheritance 어노테이션을 사용하지 않은 경우 Item.class @Entity @Getter @Setter public abstract class Item { @Id @GeneratedValue privat..
JPA- 다대일, 일대일 연관관계 주인 정리 다대일 연관관계 주인은 외래키를 가지고 있는 객체가 된다. 외래키를 가지는 객체는 多인 엔티티이다. 따라서 여기서는 Member가 多이므로 Member.team이 연관관계 주인이된다. @Entity public class Member { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; @Column(name = "USERNAME", nullable = false) private String userName; @ManyToOne @JoinColumn(name = "TEAM_ID") //연관관계 주인 private Team team; // 연관관계 편의 매소드 public void changeTeam(Team team) ..
JPA- 연관관계 매핑 주의점 상황 Member:Team = N:1의 관계이다. 양방향 연관 관계의 주인은 Member.team이다. 잘못된 경우(연관관계 주인이 아닌 곳에서 값을 입력하는 경우) package hellojpa; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Persistence; public class JpaMain { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityMan..
JPA- 연관관계 매핑 단방향 연관관계 - 외래키 연관관계 지금 MEMBER와 TEAM은 일대다 연관관계이다. 테이블 연관관계를 보면 외래키(FK)는 일대다 중 다에 들어가는 것을 알 수 있다. 각 MEMBER가 자신이 어느 팀인지를 아는 것(TEAM의 외래키를 갖는 것)이 TEAM이 모든 MEMBER들의 키를 갖는 것보다 이치에 맞기 때문이다. 하지만 이런식으로 코드를 짜는 경우 객체 지향적인 설계를 하지 못한다는 단점이 존재한다. package hellojpa; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.pers..
JPA- 중요! 엔티티 매핑 @Entity JPA가 관리하는 클래스를 엔티티라고 한다. 엔티티를 만들기 위해선 클래스의 기본생성자가 필수이다. package hellojpa; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; @Entity public class Member { @Id private Long id; private String name; public Member(){} //기본생성자 필수 public Member(Long id, String name) { this.id = id; this.name = name; } public Long getId() { return id; } public void se..