JPA에서 쿼리를 실행하는 방법에는 4가지가 있다. 가장 중요한 JPQL과 QueryDSL이 있고, Criteria, 네이티브 쿼리 기능도 존재한다. JPQL 테이블 기준이 아닌 엔티티를 기준으로 쿼리를 작성하며, 실행 시점에 DB쿼리로 변환된다. JPQL은 실행 시점에 1차 캐시를 조회하지 않고 바로 플러시되는 특징이 있고, 조회된 객체는 1차 캐시에 저장되어 영속된다. 엔티티는 객체이기 때문에 선언을 해줘야 컨트롤 할 수 있다. 따라서 m이라는 별칭을 꼭 써주어야한다. SELECT m FROM Member m WHERE m.id = 1; 패치 조인 JPA에서 성능 최적화를 위해 제공하는 기능으로 연관된 엔티티나 컬렉션을 한번의 SQL로 함께 조회가 가능하다. 일반 조인을 사용할 경우 지연 로딩과 프록..
값 타입은 복잡한 객체를 단순하게 다루기 위한 개념으로 기본 값 타입, 임베디드 타입, 컬렉션 값 타입 세 가지가 있다. 기본 값 타입 엔티티에서 int, String과 같은 기본 타입과 래퍼 클래스이다. 기본 값 타입은 참조가 아니기 때문에 변경 시 깊은 복사로 값만 변경되어 추적이 불가능하다. 참조를 이용하는 값 타입은 변경 시 다른 엔티티의 필드도 바뀔 수 있어서 공유해서는 안되고, 불변 객체여야한다. 하지만 기본 값 타입은 안전하다. 래퍼 클래스는 객체이기 때문에 공유가 가능하지만, 불변 객체이기 때문에 안전하다. 임베디드 타입 새로운 값 타입을 직접 정의할 수 있다 = 엔티티 클래스 내부에 다른 클래스 타입을 가진 필드를 사용할 수 있다 좌표나 주소 같은 비슷한 성격의 필드를 클래스로 분리함으로..
프록시 EntityManager에는 getReference()라는 메서드가 있다. find()와 같이 객체를 조회하는 메서드이지만, getReference()는 반환 타입이 Proxy이다. Proxy는 보통 전달하는 역할을 할 때 자주 등장하는 단어인데 여기서도 같은 의미로 사용된다. Proxy 객체는 실제 객체와 같은 모양에 Id 값만 들어있는 빈 객체이다. 프록시 객체를 사용하는 이유 연관관계 매핑에서 객체를 조회하면 연관된 객체도 같이 조회하게 된다. 이때 연관된 객체는 사용하지 않더라도 같이 조회되는 문제가 있다. 이런 문제를 해결하기 위해서 실제 연관객체를 사용하는 시점에 쿼리를 보내 데이터를 넣어주게되고, 연관 객체를 가져오기 전까지는 null이 아닌 빈 껍데기 객체를 넣어두어 NPE도 방지하..
영속성 전이 연관관계 매핑에서 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 영속 상태로 만드는 방법이다. 연관관계 어노테이션의 cascade 옵션을 통해 설정할 수 있으며, 연관관계 매핑과는 무관하게 단순히 영속의 편리함을 제공하는 기능이다. Member와 이 cascade 되어있다면, Member가 영속될 때 Team도 같이 영속된다. 즉, Team이 삭제되면 Member도 삭제된다. 편리한 기능이지만, 안전성을 위해 REMOVE는 지양하고, PERSIST와 ALL 옵션을 권장한다. 고아 객체 고아 객체란 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 뜻하며, 자동으로 삭제된다. 예를 들어 Team의 MemberList에서 Member를 삭제하면 삭제된 Member 객체는 고아 객체가 되며 de..