Back-End/JPA
스프링 데이터 JPA - 기본
Meluu_
2024. 7. 29. 10:56
✔️ 공통 인터페이스 설정
JavaConfig 설정- 스프링 부트 사용시 생략 가능
@Configuration
@EnableJpaRepositories(basePackages = "jpabook.jpashop.repository")
public class AppConfig {}
- 스프링 부트 사용시 @SpringBootApplication 위치를 지정(해당 패키지와 하위 패키지 인식)
- 만약 위치가 달라지면 @EnableJpaRepositories 필요
// T : 엔티티 타입
// ID : 식별자 타입 (PK)
public interface XxxRepository extends JpaRepository<T, ID> {
}
- @Repository 애노테이션 생략 가능
- 컴포넌트 스캔을 스프링 데이터 JPA가 자동으로 처리
- JPA 예외를 스프링 예외로 변환하는 과정도 자동으로 처리
✔️ 쿼리 메소드 기능
1. 메소드 이름으로 쿼리 생성
2. 메소드 이름으로 JPA NamedQuery 호출 // 잘 안씀
3. @Query 어노테이션을 사용해서 Repository Interface에 쿼리 직접 정의
public interface MemberRepository extends JpaRepository<Member, Long> {
//스프링 데이터 JPA가 메소드 이름을 분석해서 JPQL을 생성하고 실행
List<Member> findByUsernameAndAgeGreaterThan(String username, int age);
// @Query 어노테이션을 통한 JPQL 쿼리 정의
@Query("select m from Member m where m.username =:username and m.age =:age")
List<Member> findUser(@Param("username") String username, @Param("age") int age);
}
스프링 데이터 JPA에서도 동일하게 DTO 조회가 가능
// DTO 생성 조회시 패키지명을 다 적어줘야한다.
@Query("select new pakage...MemberDto(m.id, m.username, t.name) from Member m join m.team t")
List<MemberDto> findMemberDto();
✔️ 파라미터 바인딩
- 위치 기반 // 위험
- 이름 기반
@Query("select m from Member m where m.id =:id")
Member findMember(@Param("id") int id);
@Param 어노테이션을 사용하여 바인딩
Collection 타입으로 in 절 지원
@Query("select m from Member m where m.username in :names")
List<Member> findByNames(@Param("names") List<String> names);
🔖 학습내용 출처
자바 ORM 표준 JPA 프로그래밍 - 기본편 / 김영한
김영한. (2021). 자바 ORM 표준 JPA 프로그래밍. 에이콘출판사