# 두 형제 문제는 Fetch Join에서 합류한 뒤 단계별 해법으로 최종 구조가 된다 ## Alternative text 요구사항과 모델에서 기준선으로 진행한 뒤 N1과 N2로 분기하고 Fetch Join에서 합류해, 실패와 다섯 개선 단계를 거쳐 최종 피드 조회 구조에 이르는 흐름도. ## Long description 왼쪽에서 과제 요구사항, 도메인·데이터 모델, 최초 피드 조회 기준선 순으로 시작한다. 기준선에서 컬렉션 N+1(N1)과 User·Page 연관의 숨은 쿼리(N2)가 서로 앞뒤가 아닌 형제 문제로 동시에 갈라지고, 두 경로는 Fetch Join 시도에서 합류한다. 이 시도는 다중 컬렉션·페이징 실패로 이어진다. 마지막 노드는 Batch Fetch, DTO Projection, 아이템별 Top-3, Keyset Pagination, 가시성 조건 인덱싱을 거쳐 최종 피드 조회 구조에 도달하는 순서를 담는다. ## Elements and evidence - **요구사항·모델·기준선** (journey-stage): 전체 여정은 과제 요구사항에서 도메인·데이터 모델을 거쳐 최초 피드 조회 기준선으로 시작한다. Evidence: L23–L26, L42–L42. - **컬렉션 N+1 (N1)** (problem): 기준선에서 N2와 동시에 나타나는 컬렉션 조회 문제다. Evidence: L32–L34. - **User·Page 숨은 쿼리 (N2)** (problem): 기준선에서 N1과 동시에 나타나는 User·Page 연관의 숨은 쿼리 문제다. Evidence: L32–L34. - **Fetch Join → 실패** (query-strategy): N1과 N2가 Fetch Join 시도에서 합류한 뒤 다중 컬렉션·페이징 실패로 이어진다. Evidence: L34–L35. - **후속 개선 → 최종 구조** (query-strategy): 실패 뒤 다섯 조회 전략 단계가 명시된 순서로 발전해 최종 피드 조회 구조를 만든다. Evidence: L32–L32, L35–L36. ## Relationships - **요구사항·모델·기준선 → 컬렉션 N+1 (N1):** 동시 분기. Evidence: L32–L33. - **요구사항·모델·기준선 → User·Page 숨은 쿼리 (N2):** 동시 분기. Evidence: L32–L33. - **Fetch Join → 실패 → 후속 개선 → 최종 구조:** 실패 뒤 단계별 개선. Evidence: L34–L36. - **컬렉션 N+1 (N1) → Fetch Join → 실패:** 합류. Evidence: L34–L34. - **User·Page 숨은 쿼리 (N2) → Fetch Join → 실패:** 합류. Evidence: L34–L34.