영속성 컨텍스트와 전혀 관계가 없는 상태이다.영속성 컨텍스트에 저장된 상태, 즉 영속성 컨텍스트에 의해 관리되는 상태이다. 영속성 컨텍스트가 관리하던 영속 상태의 엔티티를 영속성 컨텍스트가 관리하지 않는 상태이다. 즉 1차 캐시에 저장되어 있는 상태를 영속 상태라 하고
JPA는 엔티티들을 영속성 컨텍스트에서 관리하는데, 엔티티를 구분할 수 있는 식별자가 필요하다. 식별자가 되는 필드는 엔티티 클래스에서 @Id 어노테이션을 통해 지정할 수 있다. 그리고 엔티티가 영속성 컨텍스트에 들어가 JPA에 관리되는 시점에는 반드시 식별자로 지정된
정확히 말하면 객체에는 양방향 연관관계라는 것이 없다. 서로 다른 단방향 연관관계 2개를 애플리케이션 로직으로 묶어서 양방향인 것처럼 보이게 할 뿐이다. 회원 -> 팀 연관관계 1개 (단방향)팀 -> 회원 연관관계 1개 (단방향)반면 데이터베이스 테이블은 외래 키 하나
관계형 데이터베이스에는 상속이라는 개념이 없다. 대신 슈퍼타입 서브타입 관계(Super Type Sub Type Relationship)이라는 모델링 기법이 객체의 상속 개념과 가장 유사하다. ORM에서 이야기하는 상속 관계 매핑은 객체의 상속 구조와 데이터베이스의 슈
@Inheritance를 통한 상속 관계 매핑은 부모 클래스와 자식 클래스 모두 데이터베이스 테이블과 매핑했다. 그러나 부모 클래스는 테이블과 매핑하지 않고, 자식 클래스만 매핑하고 싶은 경우 @MappedSuperclass를 사용하면 된다. @MappedSupercl
1. 프록시 1-1. 프록시 JPA에서 식별자로 엔티티를 조회할 때는 EntityManager.find()를 사용한다. 이 메소드는 영속성 컨텍스트에 엔티티가 없으면 데이터베이스를 조회한다. 즉 조회한 엔티티를 실제 사용하든, 사용하지 않든 데이터베이스를 조회한다.
특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶으면 영속성 전이 기능을 사용하면 된다. JPA는 CASCADE 옵션으로 영속성 전이를 제공한다. 예를 들어 다음과 같이 부모와 자식이 일대다 관계로 정의되어 있다고 하자.만약 부모 1명에
JPA의 데이터 타입을 크게 분류하면 엔티티 타입과 값 타입으로 나뉠 수 있다. 엔티티 타입은 @Entity로 정의하는 객체이고, 값 타입은 int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체를 말한다. 엔티티 타입은 식별자를 통해
준영속 엔티티란? 영속석 컨텍스트가 더는 관리하지 않는 엔티티를 말한다. 준영속 엔티티를 수정하는 방법으로는 변경 감지 또는 병합(merge)을 사용하는 방법이 있다. 이때 book 엔티티는 준영속 엔티티이다. 즉 임의로 만들어낸 엔티티이더라도 기존 식별자를 가지고 있
1. JPQL이란? JPA는 복잡한 검색 조건을 사용해서 엔티티 객체를 조회할 수 있는 다양한 쿼리 기술을 지원한다. JPA가 지원하는 검색 방법은 다음과 같다. JPQL(Java Persistence Query Language) Criteria 쿼리: JPQL을 편
JPQL에서 사용하는 경로 표현식과 경로 표현식으로 인한 묵시적 조인을 알아보자.경로 표현식은 .(점)을 찍어서 객체 그래프를 탐색하는 것이다. 상태 필드는 단순히 값을 저장하기 위한 필드이다. 경로 탐색의 끝으로 더는 탐색할 수 없다.단일 값 연관 필드는 조회 대상이
1. 엔티티 조회시 성능 최적화 주문 정보(Order)를 조회할 때 연관된 회원 정보(Member)와 배송 정보(Delivery)를 같이 조회하는 예제를 통해 조회 성능을 최적화해보자. 이때 Order와 Member는 일대다(OneToMany) 관계이고, Order와
주문 정보(order)를 조회할 때 연관된 회원 정보(member), 배송 정보(delivery), 주문 상품 정보(orderItem), 상품 정보(item)를 조회해보자. 이때 엔티티 연관관계는 다음과 같고, 특히 일대다 관계인 컬렉션 조회에 주목하여 컬렉션 조회시
1. 페치 조인 대상에는 별칭을 줄 수 없다 JPA 표준에서는 페치 조인 대상에 별칭을 주는 것을 지원하지 않지만 하이버네이트를 포함한 몇몇 구현체들은 지원한다. 페치 조인 대상에 별칭을 허용하지 않는 이유 페치 조인의 대상은 where 절에서 사용되면 안된다. 따라
게시판 프로젝트를 진행하던 중 좋아요 순으로 게시글을 정렬하려고 했으나, 막히게 되었고 그 해결방법으로 @Formula라는 것을 알게 되어서 기록하고자 한다.게시글(Article) 엔티티는 다음과 같다.게시글 좋아요와 관련해서 매핑은 다음과 같이 되어있다.article
기존에는 서비스 계층에서 정렬 조건인 order를 받아서, order가 latest인지, like인지, comment인지를 구분하여, 그에 맞는 리포지토리 메서드를 호출했다.그리고 리포지토리 메서드는 정렬(order by)을 위해 @Query를 사용하여 직접 JPQL을
순수 JPA를 사용한 벌크 연산 쿼리는 다음과 같다.스프링 데이터 JPA를 사용한 벌크성 수정 쿼리는 다음과 같다.이때 쿼리는 getResultList()를 사용하는게 아니라 executeUpdate()를 사용한다. 즉 벌크 연산은 하나의 엔티티를 수정하여 변경 감지로
스프링 데이터 JPA가 제공하는 기능으로 정의 가능한 쿼리, 메서드는 JpaRepository를 상속하는 (1)MemberRepository 인터페이스에 정의한다.동적 쿼리 같은 복잡한 쿼리는 (2)사용자 정의 리포지토리에 정의하거나, (3)별도의 클래스를 만들어 JP
상속 관계 매핑은 부모 클래스와 자식 클래스 모두 데이터베이스 테이블과 매핑된다. 부모 클래스는 테이블과 매핑되지 않고, 자식 클래스에서 매핑 정보만 제공하고 싶으면 @MappedSuperclass를 사용하면 된다. @MappedSuperclass가 붙은 클래스는 실제
스프링 데이터 JPA는 편리한 페이징과 정렬을 위한 기능을 제공한다. Sort : 정렬 기능Pageable: 페이징 기능(내부에 Sort 포함)Pageable은 인터페이스로, 실제 사용할 때는 PageRequest 객체를 사용한다.페이징과 관련해서 다음과 같은 반환 타
프로젝트 진행중 JPA와 관련된 문제 발생과 그 해결 과정을 기록하고자 한다.하나의 상품에는 여러개의 상품 이미지가 있을 수 있다. 즉 Product와 ProductImage는 일대다 관계이다. 그리고 Product 엔티티의 List<ProductImage>는 영