Java

[JPA] Query Method(쿼리 메소드) 사용 방법

15호의 개발자 2022. 2. 25. 21:24
반응형

[JPA] Query Method(쿼리 메소드) 사용 방법

 

이전 글

 

JPA 연관관계 설정 구체적인 방법 (fetch 타입 종류: LAZY, EAGER)

JPA 연관관계 설정 구체적인 방법 (fetch 타입 종류: LAZY, EAGER) 이전 글 [JPA] entity와 repository 생성 (+ JUnit Test 실행 방법) [JPA] entity와 repository 생성 (+ JUnit Test 실행 방법) 이 게시..

unit-15.tistory.com

 


 

QueryMethod(쿼리메소드)는 JPA에서 검색하는 방법 중 한 가지이다.

 

 

public class UserRepositoryTest extends StudyApplicationTests {

    @Test
    @Transactional
    public void read() {
    
        // select * from user where id = ?
        Optional<User> user = userRepository.findById(1L);

        user.ifPresent(selectUser -> {
            // list형태로 상품이 반환됨. list이므로 stream을 통해 forEach를 돌림
            selectUser.getOrderDetailList().stream().forEach(detail -> { 
                
                Item item = detail.getItem();
                System.out.println(detail.getItem()); // ID 1인 사람의 detail에 있는 Item 객체를 출력
           
           });
        });
    }
    
}

위의 findById 메소드를 사용한 부분을 쿼리문으로 풀어보면 아래와 같다

select * from user where id = ?

 

나의 경우는 실제 데이터베이스를 보면서 id=1에 해당하는 데이터가 존재한다는 것을 미리 알고있는 상황이므로 findById(1L)을 사용한 것이다. 하지만 실제로는 id값은 모르는 상태에서, user의 account나 email를 알고 있어야지 조회를 할 수 있다. 이를 UserRepository에 반영해보자.

 

@Repository
public interface UserRepository extends JpaRepository<User, Long> {

    // select * from user where account = ?
    Optional<User> findByAccount(String account);

    Optional<User> findByEmail(String email);
    
}

 findByAccount 부분을 쿼리문으로 작성하면 다음과 같다.

select * from user where account = ?

 

 

이제 UserRepositoryTest 코드를 바꿔보자.

public class UserRepositoryTest extends StudyApplicationTests {

    @Test
    @Transactional
    public void read() {
    
        // select * from user where account = ?
        Optional<User> user = userRepository.findByAccount("TestUser01");

        user.ifPresent(selectUser -> {
            // list형태로 상품이 반환됨. list이므로 stream을 통해 forEach를 돌림
            selectUser.getOrderDetailList().stream().forEach(detail -> { 
                
                Item item = detail.getItem();
                System.out.println(detail.getItem()); // ID 1인 사람의 detail에 있는 Item 객체를 출력
           
           });
        });
    }
    
}

기존과 달라진 점이라면, findById로 조회하던 것을 findByAccount로 바꾸었다. 

 

 

여러 가지로 검색하고 싶은 경우에는 아래와 같이 And로 연결하면 된다. 이는 쿼리문에서 and를 사용하는 것과 똑같은 방식이다.

// select * from user where account = ? and email = ?
Optional<User> findByAccountAndEmail(String account, String email);

 

JPA에서는 findBy까지만 보고 이것이 select문임을 인식한 후, 그 뒤에 오는 문자(Account)를 보고 매칭시킨다. 이것이 JPA에서 쿼리 메소드가 동작하는 원리이다. 마치 쿼리문을 메소드 형태로 작성한다고 해서 쿼리 메소드(Query Method)라고 부른다.

 


 

다음 글

 

[어드민 페이지 만들기] ERD 설계 & Table 생성 & Entity 생성

[어드민 페이지 만들기] ERD 설계 & Table 생성 & Entity 생성 ERD 설계하기 이제 본격적으로 쇼핑몰 어드민 페이지를 만들어보자. 우선 어드민 페이지를 만들기 전에 ERD 설계부터 해야 한다. 다음과

unit-15.tistory.com

 

 

 

(출처: 패스트캠퍼스 Java & SpringBoot로 시작하는 웹 프로그래밍)

반응형