JPA에서 Specification 인터페이스를 사용하면 동적 쿼리를 작성할 수 있습니다. 동적 쿼리란, 실행 시점에 조건을 추가하여 쿼리를 생성하는 방식입니다. Specification 인터페이스를 사용하면 쿼리를 작성할 때마다 조건을 추가할 필요 없이, 메서드 호출만으로 조건을 추가할 수 있습니다.
다음은 Specification 인터페이스를 사용한 JPA 코드입니다.
예를 들어, Customer 엔티티를 검색할 때, 이름과 이메일 주소로 검색하는 기능을 구현해 보겠습니다.
public interface CustomerSpecification {
static Specification<Customer> hasName(String name) {
return (root, query, builder) -> builder.like(root.get("name"), "%" + name + "%");
}
static Specification<Customer> hasEmail(String email) {
return (root, query, builder) -> builder.like(root.get("email"), "%" + email + "%");
}
static Specification<Customer> hasNameOrEmail(String name, String email) {
return hasName(name).or(hasEmail(email));
}
}
위 코드에서 CustomerSpecification 인터페이스는 Specification<Customer>를 반환하는 hasName, hasEmail, hasNameOrEmail 메서드를 정의하고 있습니다. 이 메서드들은 각각 이름, 이메일, 이름 또는 이메일로 검색하는 Specification을 반환합니다.
다음은 CustomerRepository 인터페이스에서 CustomerSpecification 인터페이스를 사용하는 코드입니다.
@Repository
public interface CustomerRepository extends JpaRepository<Customer, Long>, JpaSpecificationExecutor<Customer> {
List<Customer> findAll(Specification<Customer> specification);
}
위 코드에서 CustomerRepository 인터페이스는 JPA의 JpaRepository<Customer, Long>와 JpaSpecificationExecutor<Customer>를 상속받고 있습니다. JpaSpecificationExecutor 인터페이스는 Specification을 사용하여 동적 쿼리를 작성할 수 있도록 해줍니다.
다음은 CustomerService 클래스에서 CustomerRepository 인터페이스를 사용하여 Customer 엔티티를 검색하는 코드입니다.
@Service
public class CustomerService {
private final CustomerRepository customerRepository;
@Autowired
public CustomerService(CustomerRepository customerRepository) {
this.customerRepository = customerRepository;
}
public List<Customer> search(String name, String email) {
Specification<Customer> specification = CustomerSpecification.hasNameOrEmail(name, email);
return customerRepository.findAll(specification);
}
}
위 코드에서 CustomerService 클래스는 CustomerRepository 인터페이스를 사용하여 Customer 엔티티를 검색하는 search 메서드를 정의하고 있습니다. 이 메서드는 CustomerSpecification 인터페이스에서 반환하는 Specification을 사용하여 동적 쿼리를 작성합니다.
내저장소 바로가기 luxury515
'Back-end > JPA' 카테고리의 다른 글
JPA 조인전략 (0) | 2023.04.13 |
---|---|
JPA 맵핑전략 (0) | 2023.04.13 |
JPA 에서 복합키 를 사용하는 이유 ,구현 방법. (0) | 2023.04.11 |
JoinColumn vs MappedBy 에 관하여 (0) | 2023.04.11 |
JPA의 N+1 문제가 발생하는 이유 , 그리고 그 해결 방안에 대한 연구 (0) | 2023.04.11 |