티몬이 CouchbaseTemplate으로 직접 만들던 뷰 질의를 Spring Data의 뷰 기반 쿼리 메서드로 옮긴 연재 2부다. 빌더 클래스로 조건을 세팅하던 코드를 인터페이스의 메서드 선언 하나로 바꾸는 과정을 다룬다. 그 과정에서 드러나는 기본값 문제와 엔티티·뷰 관계 설계 주의점이 함께 나온다.
핵심 포인트- Couchbase에서 뷰로 질의하려면 ViewQuery 객체가 필요해 기존에는 빌더 클래스를 직접 만들어 썼다.
- Spring Data의 뷰 기반 쿼리 메서드를 쓰면 어노테이션과 메서드 선언만으로 같은 질의가 된다.
- 메서드 이름의 규칙만으로 조회 건수 제한과 범위 조건이 표현된다.
- Stale 옵션은 뷰의 인덱싱 갱신 시점을 정하며 TRUE, FALSE, UPDATE_AFTER 세 가지가 있다.
- 라이브러리의 기본값이 FALSE라 질의마다 바꾸기 어려운데, 템플릿의 일관성 설정으로 기본값을 돌릴 수 있다.
- 뷰 기반 쿼리 메서드를 쓰려면 엔티티와 뷰의 관계를 설계 단계부터 고려해야 한다.
상세 정리- 연재 구성: 1부는 기본 CRUD를 Repository 상속으로 대체, 2부는 직접 만들던 뷰 질의를 메서드로 이관, 3부는 증분값 호출 기능 추가다.
- 기존 코드: 뷰 이름을 넘겨 빌더를 만들고 Stale과 skip, limit, 시작 키와 끝 키를 각각 세팅한 뒤 조회 메서드에 넘기는 형태였다.
- 그 의미: 특정 뷰에서 키 값이 시작 시각부터 끝 시각까지인 데이터를 1,000건 가져오겠다는 뜻이다.
- Stale의 역할: 뷰에서 데이터를 가져올 때 인덱싱 갱신을 언제 할지 지정한다.
- Stale 값 셋: TRUE면 뷰가 최신인지와 무관하게 가져오고, FALSE면 뷰를 갱신한 뒤 결과를 반환하며, UPDATE_AFTER는 읽은 뒤에 갱신한다.
- 변경 후: Repository 인터페이스에 뷰 어노테이션으로 설계 문서와 뷰 이름을 지정하고, 건수 제한과 범위 조건이 담긴 메서드를 선언하는 것으로 끝난다.
- 이득: 직접 객체를 만들어 조회하던 것보다 코드가 훨씬 단순해졌다.
- 남는 문제: 라이브러리의 Stale 기본값이 FALSE여서 질의마다 원하는 값으로 바꾸기가 어렵다.
- 해결: Couchbase 설정에서 템플릿의 일관성 값을 최종적 일관성으로 지정하면 해당 템플릿의 기본 Stale이 TRUE가 된다.
- 설계 주의: 뷰 기반 쿼리 메서드는 코드량을 줄이고 가독성을 높이지만 엔티티와 뷰의 관계를 유의해 설계해야 한다.
- 예시 구조: 학교 엔티티가 학생 목록을 필드로 갖고, 학생의 학년을 기준으로 별도의 뷰를 만든 상황을 든다.
- 이어지는 논점: 그 상태에서 학년을 키로 받는 쿼리 메서드를 정의할 때 무엇을 조심해야 하는지로 이어진다.
- 이관의 취지: 개발자가 저장소마다 접근 계층을 직접 구현하지 않아도 되도록 Spring Data가 객체 매핑을 추상화해준다는 점을 활용하려는 것이다.
- 가독성 이점: 메서드 이름만 보고도 어떤 조건으로 무엇을 몇 건 가져오는지 유추할 수 있다.
- 남은 확인: 뷰가 중첩된 목록 필드를 기준으로 만들어진 경우 쿼리 메서드의 키 매핑이 기대와 다를 수 있어 주의가 필요하다.
왜 읽나Couchbase 뷰 질의를 빌더로 조립하고 있다면 메서드 선언으로 대체하는 방법과, 기본 Stale 값 때문에 겪을 수 있는 함정을 미리 확인할 수 있다.