Open Session In View: 하이버네이트Open EntityManager In View: JPA→ 관례상 둘다 OSIV 라고 한다. spring.jpa.open-in-view: true (기본 default 값) OSIV 전략은 트랜잭션 시작처럼 최초 데이터베이스 커넥션 시작 시점부터 API응답이 끝날 때 까지 영속성 컨텍스트와 데이터베이스 커넥션을 유지한다. 그래서 View Template 혹은 API컨트롤러에서 지연 로딩이 가능하다. 지연 로딩은 영속성 컨텍스트가 살아있어야 가능하고, 영속성 컨텍스트는 기본적으로 데이터베이스 커넥션을 유지한다. 주의할점은 OSIV 전략이 너무 오랜시간동안 데이터베이스 커넥션 리소스를 사용하기 때문에, 실시간 트래픽이 중요한 애플리케이션에서는 커텍션이 모..
페치 조인의 특징과 한계 페치 조인 대상에는 별칭을 줄 수 없다. 하이버네이트는 가능하지만 가급적 사용하지 않는다. 둘 이상의 컬렉션은 페치 조인 할 수 없다. 컬렉션을 페치 조인하면 페이징 API를 사용 할 수 없다. .setFirstResult(), .setMaxResults() 사용 불 가능 이러한 한계에도 불구 하고 연관된 엔티티들을 SQL 한 번으로 모두 가져올 수 있기 때문에 좋은 성능을 내기 위해서 사용하고 있다. 따라서 성능 최적화가 필요한 곳은 페치 조인을 적용한다. fetch join 정리 모든 것을 페치 조인으로 처리할 수 는 없다. 페치 조인은 객체 그래프를 유지할 때 사용하면 효과적이다. 여러 테이블을 조인해서 엔티티가 가진 모양이 아닌 전혀 다른 결과를 내야 한다면, 페치 조인보..
JPQL fetch join SQL 조인 종류가 아니다. JPQL에서 성능 최적화를 위해 제공하는 기능으로 연관된 엔티티나 컬렉션을 SQL 한 번에 함께 조회하는 기능이다. join fetch 명령어를 사용한다. ex) 회원을 조회하면서 연관된 팀도 같이 조회하고 싶다. JPQL 쿼리 → select m from Member m join fetch m.team 실제 동작하는 SQL 쿼리 → SELECT M.*, T.* FROM MEMBER M INNER JOIN TEAM T ON M.TEAM_ID=T.ID 컬렉션 페치 조인 일대다 관계, 컬렉션 페치 조인 JPQL 쿼리 → select t from Team t join fetch t.members where t.name = ‘팀A' 실제 동작하는 SQL ..
JPQL (Java Persistence Query Language) 객체지향 쿼리 언어이기 때문에 테이블을 대상으로 쿼리 하는 것이 아니라 엔티티 객체를 대상으로 쿼리 한다. JPQL은 SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다. JPQL은 결국 SQL로 변환된다. select_문 :: = select m from Member as m [where_절] [groupby_절] [having_절] [orderby_절] update_문 :: = update m [where_절] delete_문 :: = delete m [where_절] 엔티티와 속성은 대소문자를 구문하고 JPQL 키워드는 대소문자를 구분하지 않는다. 테이블의 이름이 아닌 엔티티의 이름을 사용하고 별칭(m)은 필수로 사용한..
JPA는 다양한 쿼리 방법을 지원한다. JPQL (대부분 이 방식을 사용) JPA Criteria QueryDSL 네이티브 SQL JDBC API 직접사용, MyBatis, SpringJdbcTemplate 함께 사용 JPQL 가장 단순한 조회 방법 EntityManager.find() 객체 그래프 탐색 a.get() 기타 등등 ... 하지만 특별한 조건을 포함한 데이터를 알고 싶다면? EntityManagerFactory emf = Persistence.createEntityManagerFactory("Test"); EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(); try..
JPA 데이터 타입 분류 엔티티 타입 @Entity로 정의하는 객체 데이터가 변해도 식별자로 지속해서 추적이 가능하다. 값 타입 int, Integer, String 처럼 단순 값으로 사용하는 자바 기본 타입이나 객체. 식별자가 없고 값만 있으므로 변경시 추적이 불가능하다. 값 타입 분류 1. 기본값 타입 자바 기본타입(int, double) 래퍼 클래스(Integer, Long) String → 생명주기는 엔티티에 의존한다. 값 타입은 공유하면 안된다. (다른 저장공간을 갖는다) 2. 임베디드 타입 (복합 값 타입) 새로운 값 타입을 직접 정의할 수 있음 JPA는 임베디드 타입(embedded type) 이라고 부른다 int와 String 처럼 값 타입이라는 것이다. → 변경하면 끝 3. 컬렉션 값 타..
JPA에서 가장 중요한 2가지 객체와 관계형 데이터 베이스 매핑 (Object Relational Mapping)영속성 컨텍스트웹 어플리케이션 개발시 EntityManager Factory가 고객의 요청에 따라서 EntityManager 를 생성하고 EntityManager를 통해서 데이터를 관리하게 된다. 영속성 컨텍스트 엔티티를 영구 저장하는 환경 : EntityManager.persist(entity); (눈에 보이는 개념은 아니다) 엔티티의 생명주기비영속(new/transient): 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태영속(managed): 영속성 컨텍스트에 관리되는 상태준영속(detached): 영속성 컨텍스트에 저장되었다가 분리된 상태삭제(removed): 삭제된 상태 ◆ 비영속 ..
준영속 엔티티를 수정하는 2가지 방법준영속 엔티티: 영속성 컨텍스트가 더는 관리하지 않는 엔티티를 의미. 변경 감지 기능 사용(Dirty Checking)트랜잭션 안에서 엔티티를 다시 조회, 변경할 값 선택하고 수정한다. 이후 트랜잭션 commit 시점에 변경 감지 기능(Dirty Checking)이 동작해서 JPA가 자동으로 데이터 베이스에 UPDATE 쿼리를 날려준다. 병합(merge) 사용merge 함수 호출을 통해 값을 변경: 준영속 엔티티의 식별자 값으로 영속 엔티티를 조회한후 영속 엔티티의 값을 준영속 엔티티의 값으로 모두 교체한다. 이후 트랜잭션 commit 시점에 변경 감지 기능이 동작해서 데이터베이스에 UPDATE 쿼리를 날려준다. 변경 감지 기능과의 차이점으로 인한 단점 → 부분수정이..