결정-0053: 조회에 한해 컨텍스트를 넘는 조인을 허용한다
상태
Accepted
맥락
하나의 화면이 다른 컨텍스트의 조건으로 목록을 거르면서 동시에 페이징해야 하는 상황이 자주 생깁니다. 컨텍스트 경계를 문자 그대로 지키면 이 화면을 만들 수 없거나, 만들기 위해 다른 것을 포기해야 합니다.
결정
조회 경로에 한해 타 컨텍스트 테이블의 조인을 허용합니다. 명령 경로는 예외 없이 계약을 사용합니다.
허용에는 예외가 하나 있습니다. 조인이 그 쿼리에 없던 컨텍스트 의존을 새로 만들고 가져오는 값이 표시 용도로만 쓰이면 계약으로 받아 조립합니다. 새로 생기는 결합 대비 이득이 없기 때문입니다.
이미 그 컨텍스트를 참조하는 쿼리라면 표시용 컬럼도 조인합니다. 이미 결합된 지점에서 일부 컬럼만 떼어 내는 것은 이득이 없습니다. 공통 코드 같은 범용 참조 데이터는 판정 대상에서 제외합니다.
표시용 여부는 구문이 아니라 의미로 판정합니다. 기준은 그 데이터가 결과 행의 집합 · 순서 · 개수에 영향을 주는가입니다. 조건절과 정렬절은 그 판정의 대표적 발현 형태일 뿐이며, 구문만 보면 누락이 생깁니다. 내부 조인 자체가 필터이고, 조인 조건에 붙은 술어도 필터입니다.
실무 규칙으로 표시용 조인은 외부 조인으로 작성합니다. 내부 조인이 필요해지는 시점에 그 조인은 표시용이 아니며 예외가 적용되지 않습니다. 코드 리뷰에서 기계적으로 판정할 수 있습니다.
검토한 대안
사본을 보유한다
| 구분 | 내용 |
|---|---|
| 장점 | 조인이 사라져 컨텍스트가 스키마 수준에서도 독립합니다 |
| 단점 | 정합성 책임이 데이터베이스에서 애플리케이션으로 넘어옵니다. 관리 대상 테이블도 늘어납니다 |
| 기각 사유 | 단일 데이터베이스 구성에서 사본을 두는 것은 분산 구성의 비용만 앞당겨 치르는 일입니다 |
상대에게 식별자 목록을 조회한다
| 구분 | 내용 |
|---|---|
| 장점 | 코드 의존이 계약으로만 흐릅니다 |
| 단점 | 화면 요구가 상대 컨텍스트의 계약으로 유입됩니다. 화면이 늘 때마다 상대의 계약이 늘어납니다 |
| 기각 사유 | 결합을 없애는 것이 아니라 스키마에서 계약으로 옮기는 것이며, 계약은 스키마보다 바꾸기 어렵습니다 |
결과
화면 요구를 조회 경로 안에서 해결할 수 있습니다. 필터와 정렬과 페이징이 SQL 안에 남으므로 데이터가 늘어도 성능 특성이 유지됩니다.
감수하는 것은 스키마 결합입니다. 타 컨텍스트의 컬럼이 바뀌면 본 컨텍스트의 조회가 실패하며, 코드상 참조가 없어 정적 분석으로 검출되지 않습니다. 방어는 조회를 통합 테스트 필수 대상으로 두어 CI 가 잡게 하는 것 하나뿐입니다. 그 테스트가 없으면 이 허용은 성립하지 않습니다.
배포 단위를 나누는 계획이 생기면 이 결정을 다시 봅니다.