Maru@maru

Dev Hub

EF Core 10 쿼리 변환 어떻게 바뀌었나: LeftJoin 지원과 컬렉션 매개변수 개편

관계형 데이터베이스와 객체 모델을 연결하는 ORM에서 쿼리 변환은 성능과 코드 가독성을 가르는 핵심 영역입니다. .NET 10과 함께 등장한 EF Core 10은 오랜 기간 개발자들을 괴롭혔던 복잡한 LINQ 작성 패턴을 정리하고, 실제 데이터베이스 실행 계획을 최적화하도록 기본 변환 방식을 손질했습니다.

가장 눈에 띄는 변화는 외부 조인 문법의 단순화와 컬렉션 매개변수 변환 전략의 변경입니다. 여기에 SQL Server 2025의 벡터 검색 지원과 일괄 수정 메서드의 유연성 확보까지 더해졌습니다. 어떤 점이 달라졌고 실무 프로젝트에서 무엇을 확인해야 하는지 차례대로 살펴봅니다.

20년 만에 사라진 GroupJoin 꼼수와 LeftJoin 도입

기존 LINQ에서는 두 테이블 간에 일치하지 않는 데이터까지 조회하는 외부 조인을 표현하기가 유독 까다로웠습니다. SQL에서는 직관적인 LEFT JOIN 한 줄이면 끝날 작업이었지만, C# 코드에서는 GroupJoin, SelectMany, DefaultIfEmpty 세 가지 메서드를 정해진 순서대로 조합해야 했습니다. 코드가 길어질 뿐 아니라 초심자가 의도를 직관적으로 파악하기 어려웠습니다.

.NET 10 LINQ와 EF Core 10은 네이티브 LeftJoin 및 RightJoin 연산자를 표준 API로 지원합니다. 기존 복잡한 메서드 체이닝 없이도 메서드 호출 하나로 깔끔하게 외부 조인을 선언할 수 있습니다.

EF Core 10 환경에서 작성하는 LeftJoin 예시입니다.

csharp

변환 결과로 생성되는 SQL은 기존 복잡한 우회 방식과 동일하게 깔끔한 LEFT JOIN 구문으로 번역됩니다. 성능상의 이득보다는 코드의 가독성과 유지보수성을 극적으로 개선하는 변화입니다.

컬렉션 매개변수의 기본 번역 방식 전환

목록에 포함된 항목을 필터링할 때 사용하는 Contains 쿼리는 데이터베이스 엔진 입장에서 실행 계획을 세우기 까다로운 대상이었습니다. 이전 버전에서는 매개변수화된 컬렉션을 단일 JSON 배열로 전달하거나 특정 데이터베이스 전용 함수를 통해 처리하는 시도가 많았습니다. 하지만 이 방식은 옵티마이저가 실제 건수를 예측하기 어려워 비효율적인 실행 계획을 선택하는 원인이 되기도 했습니다.

EF Core 10은 매개변수 컬렉션 번역 모드의 기본값을 다중 스칼라 매개변수 방식으로 전환했습니다. 이제 Where(b => ids.Contains(b.Id))와 같은 쿼리는 SQL 쿼리 매개변수 여러 개로 나누어 전달됩니다. 이를 통해 데이터베이스 옵티마이저는 정확한 카디널리티 추정을 수행할 수 있어 대량 데이터 조회 시 안정적인 성능을 기대할 수 있습니다. 기존의 JSON 기반 변환이나 상수 삽입이 필요한 특수한 상황이라면 전역 옵션이나 쿼리 단위 메서드를 통해 이전 동작 방식을 지정할 수 있습니다.

대량 업데이트 유연성과 최신 기능 확장

데이터베이스 레코드를 개별 메모리 로드 없이 곧바로 갱신하는 ExecuteUpdateAsync API에도 실용적인 개선이 반영되었습니다. 이전까지는 식 트리 표현식만 허용되어 조건부 프로퍼티 수정이나 동적 업데이트 쿼리를 작성할 때 표현식을 수작업으로 조립해야 하는 불편이 컸습니다. 이번 버전에서는 일반 액션 람다를 인자로 전달할 수 있도록 확장되어 동적 수정 로직을 훨씬 유연하게 작성할 수 있습니다.

인공지능 애플리케이션 개발 흐름에 맞춰 SQL Server 2025 및 Azure SQL의 벡터 검색 기능도 정식 지원 목록에 올랐습니다. LINQ 안에서 벡터 거리 계산 함수와 전용 타입을 사용해 의미 기반 유사도 검색을 표준 쿼리처럼 호출할 수 있습니다.

도입 시 주의할 점

EF Core 10은 .NET 10 런타임과 SDK를 필수로 요구합니다. 하위 런타임 프로젝트에서는 패키지를 직접 올릴 수 없으므로 전체 런타임 업그레이드 일정을 함께 조율해야 합니다. 멀티 타깃을 지정한 프로젝트에서 마이그레이션 도구를 실행할 때는 대상 프레임워크 플래그를 명시해야 하는 변경 사항도 있습니다.

컬렉션 매개변수 기본값이 다중 스칼라 방식으로 바뀌면서, 수천 개 이상의 키 목록을 Contains에 넘길 경우 매개변수 개수 제한에 도달하거나 쿼리 캐시 항목이 급증할 수 있습니다. 프로젝트의 데이터 특성에 맞춰 기본 모드를 유지할지, 대용량 조회 영역에 한해 대안 설정을 적용할지 검토하는 것이 좋습니다.

Loading comments…