본문 바로가기
Spring

Spring Day 17 : JPA Query Methods

by 우 석 2024. 2. 14.

Query Methods

Spring Data JPA에서는 아래의 코드처럼 메서드 이름으로 SQL을 생성할 수 있는 Query Methods 기능을 제공한다. 

public interface UserRepository extends JpaRepository<User, Long> {
    Optional<User> findByEmail(String email);
}

 

설명

JpaRepository 인터페이스에서 해당 인터페이스와 매핑되어 있는 테이블에 SQL을 메서드 이름을 사용하여 선언한다. 이렇게 되면 UserRepository 인터페이스가 생성될 때 JpaRepository 인터페이스의 모든 메서드를 자동으로 구현해 준다.

 

다시 말해 JpaRepository 인터페이스의 메서드 즉, Query Methods는 개발자가 이미 정의되어있는 규칙에 맞게 메서드를 선언하면 해당 메서드 이름을 분석하여 UserRepository에서 구현된다.

 

따라서 우리는 인터페이스에 필요한 SQL에 해당하는 메서드 이름 패턴으로 메서드를 선언하기만 하면 따로 구현하지 않아도 사용할 수 있다.

 

쿼리 사용 예시

1.  JpaRepostory를 상속받는 인터페이스를 선언.  도메인 클래스 및 ID 유형은 <(엔티티), (타입)> 

public interface UserRepository extends JpaRepository<User, Long> {}

 

2.  아래 코드와 같이 Query Method를 선언했을 경우 Email에 값을 전달해줘야 하기 때문에 파라미터에 해당 값의 타입과 변수명을 선언한다. email을 파라미터로 받아 해당 이메일과 일치하는 User를 찾아 Optional 타입으로 반환.

-> Optional로 처리한 이유는 값이 있을 수도 있고 없을 수도 있는 객체를 나타내며, 이를 통해 해당 이메일에 해당하는 User가 존재하지 않을 경우에도 예외 처리를 할 수 있다.

public interface UserRepository extends JpaRepository<User, Long> {
    Optional<User> findByEmail(String email);
}

 

3. UserRepository를 주입받아 findByEmail 메서드 사용

@Service
@RequiredArgsConstructor
public class UserService {

    private final UserRepository userRepository;
    
    @Transactional
    public void updateUserInfo(UserDetailsImpl userDetails)
        User user = userRepository.findByEmail(userDetails.getUsername()).orElseThrow(() ->
            new IllegalArgumentException("User가 존재하지 않습니다."));     
        ...
    }
}

 

즉, Query Methods는 메서드의 파라미터를 통해 SQL에 필요한 값을 동적으로 받아 처리할 수 있다.