Spring Data JPA - JPA NamedQuery

2022. 7. 29. 22:39·공부/JPA
반응형

Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다.

 

JPA NamedQuery

쿼리 메서드 기능 3가지

  • 메서드 이름으로 쿼리 생성
  • 메서드 이름으로 JPA NamedQuery 호출
  • @Query 애노테이션을 사용해서 레파지토리 인터페이스에 쿼리 직접 정의

 

JPA NamedQuery

  • @NamedQuery 애노테이션으로 Named 쿼리 정의
  • 실무에서 거의 사용할 일이 없다.
  • JPA를 직접 사용해서 Named 쿼리 호출

 

관련 포스팅

 

JPA 객체지향 쿼리 언어(JPQL) - Named 쿼리

JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다. Named 쿼리 정적 쿼리 미리 정의해서 이름을 부여해두고 사용하는 JPQL 정적 쿼리만

devhan.tistory.com

 

예제

  • Member.class에 @NamedQuery 추가
@Entity
@Getter @Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@ToString(of = {"id", "username", "age"})
@NamedQuery(
        name="Member.findByUsername",
        query="select m from Member m where m.username = :username"
)
public class Member {
  • MemberJpaRepository.class
public List<Member> findByUsernames(String username) {
    return em.createNamedQuery("Member.findByUsername", Member.class)
            .setParameter("username", "회원1")
            .getResultList();
}
  • MemberJapRepositoryTest.class
@Test
public void testNamedQuery() {
    Member m1 = new Member("AAA", 10);
    Member m2 = new Member("BBB", 20);
    memberJpaRepository.save(m1);
    memberJpaRepository.save(m2);

    List<Member> result = memberJpaRepository.findByUsernames("AAA");
    Member findMember = result.get(0);
    assertThat(findMember).isEqualTo(m1);
}


// 출력 로그
    select
        member0_.member_id as member_i1_0_,
        member0_.age as age2_0_,
        member0_.team_id as team_id4_0_,
        member0_.username as username3_0_ 
    from
        member member0_ 
    where
        member0_.username=?

위의 코드가 꽤 많이 작성된다. 한마디로 귀찮은 과정이 많다! 그래서 스프링 데이터 JPA에서는 NamedQuery를 쉽게 사용할 수 있는 방법을 제공한다.

 

  • MemberRepository.interface
@Query(name = "Member.findByUsername") // 생략 가능
List<Member> findByUsername(@Param("username") String username);
  • MemberRepositoryTest.class
@Test
public void testNamedQuery() {
    Member m1 = new Member("AAA", 10);
    Member m2 = new Member("BBB", 20);
    memberRepository.save(m1);
    memberRepository.save(m2);

    List<Member> result = memberRepository.findByUsername("AAA");
    Member findMember = result.get(0);
    assertThat(findMember).isEqualTo(m1);
}

스프링 데이터 JPA에서는 MemberRepository에 적어주었던 @Query 애노테이션을 생략할 수 있다. 이유는 JpaRepository의 제네릭 중 앞의 엔티티 타입이 들어가 있기 때문에 일단 그 타입에 들어가서 해당 메서드가 있나 찾아본다. 그래서 있으면 생성하고, 없으면 메서드 이름으로 쿼리를 생성한다. 이 우선순위는 변경이 가능하지만 되도록 변경하지 않는 것이 좋다. 어차피 우선순위를 변경할 이유가 별로 없기도 하다..

 

! 이 기능은 컴파일 오류를 발생시켜 개발자가 오류를 잡는 것이 편하긴 하지만 실무에서 잘 사용하지 않는다.

 

반응형
저작자표시 비영리 변경금지 (새창열림)
'공부/JPA' 카테고리의 다른 글
  • Spring Data JPA - @Query, 값, DTO 조회하기
  • Spring Data JPA - @Query, 리포지토리 메서드에 쿼리 정의하기
  • Spring Data JPA - 메서드 이름으로 쿼리 생성
  • Spring Data JPA - 공통 인터페이스
데부한
데부한
어차피 할 거면 긍정적으로 하고 싶은 개발자
    반응형
  • 데부한
    동동이개발바닥
    데부한
  • 전체
    오늘
    어제
    • 분류 전체보기 (307)
      • 방통대 컴퓨터과학과 (27)
        • 잡담 (9)
        • 3학년1학기 (17)
      • 프로젝트 및 컨퍼런스 회고 (1)
        • 프로젝트 (4)
        • 한이음 프로젝트 (0)
        • 회고 (3)
      • 공부 (165)
        • Spring (37)
        • JPA (71)
        • 인프런 워밍업 클럽_BE (10)
        • Java (6)
        • React.js (27)
        • 넥사크로 (11)
        • 기타 (3)
      • 알고리즘 (85)
        • 알고리즘 유형 (10)
        • 알고리즘 풀이 (57)
        • SQL 풀이 (18)
      • 에러 해결 (13)
      • 잡담 (7)
        • 국비교육 (2)
        • 구매후기 (5)
        • 진짜 잡담 (0)
  • 블로그 메뉴

    • Github
    • Linkedin
    • 홈
    • 방명록
    • 글쓰기
    • 관리
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    코딩테스트
    기출문제
    스프링부트
    자바스크립트
    방통대
    Java
    react
    JPA
    에러해결
    개발자
    SQL
    프론트엔드
    egov
    넥사크로
    토이프로젝트
    SpringBoot를 이용한 RESTful Web Service 개발
    QueryDSL
    인프런
    Spring
    토비의스프링부트
    백준
    알고리즘
    전자정부프레임워크
    운영체제
    MSA
    IT
    RESTful
    oracle
    springboot
    프로그래머스
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
데부한
Spring Data JPA - JPA NamedQuery
상단으로

티스토리툴바