HwangHub

[JPA] Data JPA 기초 본문

DEV-STUDY/Spring

[JPA] Data JPA 기초

HwangJerry 2023. 6. 30. 01:36

주요 메서드 정리

  • save(s) : 새로운 엔티티는 저장하고, 이미 있는 엔티티는 병합한다.
  • delete(s) : 엔티티 하나를 삭제한다. 내부에서 EntityManager.remove()호출한다.
  • findById(id) : 엔티티 하나를 조회한다. 내부에서 EntityManager.find()호출한다.
  • getOne(id) : 엔티티를 프록시로 조회한다. 내부에서 EntityManager.getReference()호출한다.
  • findAll() : 모든 엔티티를 조회한다. 정렬(sort)이나 페이징(paging) 조건을 파라미터로 제공할 수 있다.

 

메서드 이름으로 쿼리 생성

(전체 데이터 JPA 기술 원리를 같이 이해해야 함)

 

정해진 규칙에 따라 메서드 이름을 설정하면, 스프링 데이터 JPA가 JpaRepository 인터페이스를 상속한 레포지토리 인터페이스를 확인한 뒤, 애플리케이션 로딩 시점에 해당 인터페이스의 해당 메서드도 구현체에 포함되게 생성하여 레포지토리 구현 클래스를 만들면서 애플리케이션에 주입한다. 이때, 주입 과정에서 proxy class가 주입된다.

 

네임드쿼리

(실제 실무에서는 이를 적용하기 위해 넓은 영역을 건드려야 하므로 유지보수성이 좋지 않아 잘 쓰이진 않음)

 

이는 엔티티에 @NamedQuery 어노테이션을 통해 특정 이름과 쿼리를 선언해 두면, 이를 사용할 수 있도록 하는 방법으로, JPA에서 제공하는 하나의 방법이다. 이는 현실적으로 많이 쓰이진 않지만, 만약 파라미터 등이 잘못 입력된 경우, 일반적으로 JPA를 날것으로 활용하여 em.createQuery를 사용할 때에는 적힌 쿼리문은 그저 문자열에 불과하여 오타가 나있다 하더라도 컴파일 타임에는 문제가 발견되지 않고, 런타임에서 해당 메서드를 호출 시에 쿼리문이 잘못되어 있음에 따라 에러가 터지게 되는데, 네임드쿼리의 경우에는 컴파일 타임에서 문제가 있음을 감지할 수 있다는 것이 가장 큰 장점이다. 하지만 누차 말한대로, 현실적으로는 DataJpa Repository 클래스 모듈에서 @Query() 어노테이션을 이용하여 JPQL을 직접 입력하는 방식이 더욱 간결하고 가독성이 좋아 유지보수성 측면에서 더욱 많이 선택된다.

Comments