상세 옵션 기능을 구현하기 위해서 여러가지 옵션 선택별 DB 쿼리가 존재해야한다. 이때, JPA를 사용해 매번 쿼리를 만들어 유지하는 것은 관리 포인트도 많아지고 코드도 예쁘지 않았다. 구글링을 거쳐서 JPA Specification을 사용해서 상세 옵션을 구현하면 되겠다고 판단했다. 이렇게 만들면 직관적으로 코드를 읽을 수도 있고 중복적인 쿼리를 만들어서 헷갈릴 일도 없겠다 생각했다.
private static Specification<TestModelName> testIdEquals(Long testId) {
return (root, query, builder) ->
builder.equal(root.get("testId"), momentId);
}
그리고 상세 옵션별 멀티 선택을 고려해 앞서 만든 스펙을 조합한다. 아래 예시와 같이 위에 만들었던 옵션별 스펙을 가져와서 ".and" 또는 ".or" 등을 사용해 원하는 종합(?) 스펙을 만든다.
public static Specification<TestModelName> findtestIdByModifiedAt(TestForm testForm) {
Specification<TestModelName> testIdSpec = testIdEquals(testForm.getContents().getValue());
Specification<TestModelName> modifiedSepc = modifiedDataBetween(testForm.getTimeRange().getFromDate(),testForm.getTimeRange().getToDate());
Specification<TestModelName> enableDataSpec = enabledFlagEquals();
return Specification.where(modifiedSepc).and(enableDataSpec).and(testIdSpec);
}