728x90

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

+ Recent posts