JPA 기초(16)
-
[JUnit] org.junit.runners.model.InvalidTestClassError
필자는 JUnit4를 사용했는데, JUnit5에서 제공되는 클래스를 혼용했다. junit5에서는 @RunWith 어노테이션을 지원하지 않는다. 대신 @ExtendWith 어노테이션을 지원한다. 따라서 org.junit.jupiter.api.Test 을 사용할 경우에는 @ExtendWith를 사용해야 한다. 참고로 필자처럼 JUnit4를 사용중이라면 org.junit.jupiter.api.Test이 아니라 import org.junit.Test; 으로 변경해야 한다. 이 변경으로 해결했다. 결론 임포트를 잘하자(전에도 겪은 실수를 반복해서 포스팅하였음)
2022.04.02 -
영속성 전이: CASCADE, 고아 객체
• 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶을 때! • 예: 부모 엔티티를 저장할 때 자식 엔티티도 자동으로 em.persist(). • 영속성 전이는 연관관계를 매핑하는 것과 아무 관련이 없음 • 엔티티를 영속화할 때 연관된 엔티티도 함께 영속화하는 편리함을 제공할 뿐이다. CASCADE의 종류 • ALL: 모두 적용 • PERSIST: 영속 • REMOVE: 삭제 고아객체(orphanRemovel) 만약 고아 객체(orphanRemovel = true)로 설정되었다면, 부모 엔티티와 연관관계가 끊어지면 자식 엔티티가 자동으로 삭제된다. 예를들어, Listlist에서 remove(0)을 실행하면 index가 0번인 Child 엔티티에 DELETE 쿼리가 날라간다...
2022.03.31 -
JPA proxy - Lazy, Eager loading
Member Entity를 DB에서 조회할 때, Team도 함께 조회해야 하는가? 프록시는 이를 loading방식으로 선택할 수 있게끔 해준다.(뒤에 설명하겠지만 반.드.시 lazy Loading을 하자. 사실 선택 할 수 없음..) 1) 프록시 기초 em.find() vs em.getReference() • em.find(): 데이터베이스를 통해서 실제 엔티티 객체 조회 • em.getReference(): 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회 em.find(Member.class, member.getId())의 방식으로 Member를 조회하면, JPA는 여지없이 Member Entity를 데려온다. 하지만 em.getReference()의 방식을 사용하면 JPA는 Member E..
2022.03.30 -
JPQL 페이징 쿼리 & 서브쿼리, 조건식, 기본 함수
JQPL은 페이징을 다음과 같이 지원한다. 코드부터 보자! String jpql = "select m from Member m order by m.name desc"; List resultList = em.createQuery(jpql, Member.class) .setFirstResult(10) .setMaxResults(20) .getResultList(); JPA는 페이징을 다음 두 API로 추상화한다. • setFirstResult(int startPosition) : 조회 시작 위치(0부터 시작) -> 몇번째부터 • setMaxResults(int maxResult) : 조회할 데이터 수 -> 몇개를 가져올거야! 이 두가지 API로 손쉽게 페이징 쿼리를 날릴 수 있다. JQPL 서브쿼리 JQPL..
2022.03.29 -
JPQL 파라미터 바인딩, 프로젝션
JPQL은 파라미터 바인딩을 두가지 방법으로 할 수 있음 1) 이름 기준 -- 권장 2) 위치 기준 -- 권장X 이름 기준 SELECT m FROM Member m where m.username=:username query.setParameter("username", usernameParam); 위치 기준 SELECT m FROM Member m where m.username=?1 query.setParameter(1, usernameParam) 위치 기준이 권장되지 않는 이유는, 카운팅 중간에 다른 쿼리가 들어와야 하는 경우, 그 숫자부터 줄줄이 밀려 전부 변경해야 한다. 가급적이면 이름 기준으로 파라미터를 바인딩 하자. 프로젝션 : SELECT 절에 조회할 대상을 지정하는 것 프로젝션 대상: 엔티티,..
2022.03.28 -
JPQL 기본 문법
JPA는 다양한 쿼리 방법을 지원한다. JPA Criteria, QueryDSL, 네이티브 SQL, Mybatis 등 다 같이 사용할 수 있다. 단, 영속성 컨텍스트를 적절한 시점에 강제로 플러시 필요하다. 영속성 컨텍스트에서 DB로 commit이나, 중간에 flush() 호출이 없으면 DB에는 아직 반영이 안되어있는 상태이기 때문이다. JPQL은 쿼리를 날리기 전에 flush가 동작한다. 이후 쿼리가 실행된다. JPQL은 강제로 수동 flush()를 해줄 필요가 없다. 가장 기본이 되는 방법은 JPQL인데, 이거 잘하면 QueryDSL도 뚝딱이라고 한다. 얼른 쿼리문 짱고수 되고싶다.. 먼저, JPA를 사용하면 엔티티 객체를 중심으로 개발해야 한다. 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로..
2022.03.28