JPA (15) 썸네일형 리스트형 프록시 만약, 멤버 클래스와 팀 클래스가 연관관계로 매핑되어 있다고 가정하자. 이때, 조회는 아래와 같이 3가지의 경우의 수가 있다. 멤버만 조회 팀만 조회 멤버와 팀 모두 조회 하지만, 팀과 멤버는 연관관계 매핑이 되어있어, 우리는 멤버 혹은 팀 하나만 조회하고 싶은데, 항상 한번에 양 쪽을 모두 select 쿼리를 날려 가져온다. //1. member 생성 후, 저장 Team team = new Team(); Member member = new Mmeber(); member.setName("son"); member.setTeam(team); em.persist(member); em.flush(); em.clear(); //2. member만 조회 Member member = em.find(Member.cla.. JPA - 연관관계 주인(feat. mappedBy) jpa에서는 양방향 연관관계를 설정할 때, 외래키를 관리하는 "연관관계의 주인"을 설정해주어야 한다. 그리고, 연관관계 주인만이 외래키를 관리(등록, 수정)할 수 있다. (이때, 주인이 아닌 쪽은 읽기만 가능하다.) 연관관계 주인 설정 연관관계의 주인이 아닌쪽에 mappedBy 옵션을 넣어주면 된다. 아래는 멤버(N) - 팀(1)의 관계에서의 코드이다. //Member @Entity public class Member { ... @ManyToOne //Member는 연관관계의 주인이다.= private Team team; ... } //Team @Entity public class Team{ ... @OneToMany (mappedBy = "team") // Team은 Member에 의해 매핑되어 있다!.. 영속성 컨텍스트! JPA의 동작 방식 EntityManagerFactory에서 고객 요청에 대한 EntityManager 생성 Request1 ➡️ EntityManagerFactory에서 EntityManager1 생성 Request2 ➡️ EntityManagerFactory에서 EntityManager2 생성 영속성 컨텍스트란? Entity Manager = 영속성 컨텍스트 Entity 객체들을 관리 및 영구 저장하는 환경(논리적인 영역) 영속성 컨텍스트의 역할 Entity 객체의 생명주기 관리 데이터베이스와의 상호작용을 추상화 ➡️ 개발자가 DB와 직접 상호작용 할 필요가 없음 Entity의 영속성을 보장 Entity 객체의 변경을 감지 DB와 동기화 담당 EntityManager를 통해 영속성 컨텍스트에 접근 E.. 자바의 트랜잭션 자바에서 트랜잭션은 아래의 과정으로 수행된다. EntityManagerFactory 생성 EntityManagerFactory로 EntityManager 생성 EntityManager로부터 트랜잭션 호출 트랜잭션의 4단계 수행 (https://dogandbird-foot.tistory.com/101) import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Persistence; public class Main { public static void main(String[] args) {.. 엔티티 매니저와 영속성 컨텍스트 정리 엔티티 매니저란? (Entity Manager) 데이터 베이스에 접근하기 위해 사용되는 객체 ➡️ 엔티티 매니저를 통해 DB 조회 / 등록 / 수정 / 삭제 작업 수행 엔티티 매니저 종류 애플리케이션에서 관리하는 엔티티 매니저 애플리케이션을 시작하면서 EntityManagerFactory를 초기화 필요할 때, Entity Manager 생성 후 사용 사용이 끝난 Entity Manager는 close() 사용이 끝난 EM은 바로바로 **close 해주지 않으면 자원 누수 발생** 가능 컨테이너(JEE)에서 관리하는 엔티티 매니저 컨테이너가 제공하는 EntityManager를 사용(@PersistenceContext) 영속성 컨텍스트(Persistence Context) 일종의 캐시 저장소 엔티티 타입, .. 1. JPA의 등장 HTML 삽입 미리보기할 수 없는 소스 SQL 중심 개발의 문제점 무수히 반복되는 쿼리문 ➡️ 쿼리문 작성하는데 소요하는 시간이 길다. 객체 ➡️ SQL 변환 ➡️ RDB 상속의 어려움 RDB에 상속관계의 데이터를 저장할 경우, 상위 객체와 하위 객체 데이터 모두 필요하기 때문에, join으로 각 객체들을 생성해야한다. ➡️상속 관계를 안쓰게 된다. 개발 언어와 SQL 간 차이 객체 : 참조 (Member.getTeam()) SQL 테이블 : 외래 키(JOIN ON M.TEAM_ID = T.TEAM_ID) 객체에서 getTeam()과 같은 자신과 연관된 객체를 테이블에 저장할 수 없고, 팀의 ID값을 저장 후 getTeamId와 같은 형식으로 개발하게 된다.(테이블에는 TEAM_ID 값으로 저장해야한다... [JPA] N+1문제 N+1 문제란 ? 요청이 1개의 쿼리로 처리 되길 기대했지만, N개의 추가 쿼리(하위 엔티티들 조회 쿼리)가 발생하는 현상 예시 JPA에서 "팀(1개) - 팀원(5명)" 과 같은 1대 N의 연관관계가 Lazy Fectch로 존재할 경우, 팀의 팀원을 조회하면 총 6번의 쿼리가 실행된다. 먼저, 처음 팀을 조회하는 쿼리가 발생하고, 해당 팀의 팀원들에 대한 쿼리가 5개 실행되어 총 6번의 쿼리분이 발생하기 때문이다. 원인 JPA에서 FetchType을 Lazy Fetch Loading으로 설정할 경우, 처음 팀을 조회 시 팀원 데이터를 함께 가져오지 않고, 팀원에 대한 Proxy 객체만 가져온다. 이후, 조회한 팀에서 팀원을 조회할 때, JPA의 1차 캐시에서 팀원에 대한 데이터가 있는지 확인 후 쿼리를 .. 이전 1 2 다음