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 프로그래밍. 에이콘출판사