쿼리 작동 방식

Entity Framework Core는 LINQ(Language-Integrated Query)를 사용하여 데이터베이스에서 데이터를 쿼리합니다. LINQ를 사용하면 C#(원하는 .NET 언어)을 사용하여 파생된 컨텍스트 및 엔터티 클래스를 기반으로 강력한 형식의 쿼리를 작성할 수 있습니다.

참고

이 문서는 최신 정보가 아니며, 쿼리 파이프라인 설계에서 발생한 변경을 설명하기 위해 일부를 업데이트해야 합니다. 여기에 언급된 동작에 대해 궁금한 점이 있다면 질문하세요.

쿼리의 수명

각 쿼리를 처리하는 프로세스는 다음과 같이 간략하게 설명할 수 있습니다.

  1. LINQ 쿼리는 Entity Framework Core에서 처리되어 데이터베이스 공급자가 처리할 수 있는 표현을 작성합니다.
    1. 쿼리가 실행될 때마다 이 처리를 수행할 필요가 없도록 결과가 캐시됩니다.
  2. 결과가 데이터베이스 공급자에 전달됩니다.
    1. 데이터베이스 공급자가 데이터베이스에서 평가할 수 있는 쿼리 부분을 식별합니다.
    2. 이러한 쿼리 부분이 데이터베이스별 쿼리 언어(예: 관계형 데이터베이스의 경우 SQL)로 변환됩니다.
    3. 쿼리가 데이터베이스로 전송되고 결과 집합이 반환됩니다. 결과는 엔터티 인스턴스가 아닌 데이터베이스의 값입니다.
  3. 결과 집합의 각 항목에 대해 다음을 수행합니다.
    1. 쿼리가 추적 쿼리인 경우 EF는 데이터가 컨텍스트 인스턴스에 대한 변경 추적 장치에 이미 있는 엔터티를 나타내는지 확인합니다.
      • 그럴 경우 기존 엔터티가 반환됩니다.
      • 그러지 않을 경우 새 엔터티가 만들어지고, 변경 내용 추적이 설정되며, 새 엔터티가 반환됩니다.
    2. 쿼리가 비 추적 쿼리인 경우 항상 새 엔터티가 생성되고 반환됩니다.

쿼리가 실행되는 경우

LINQ 연산자를 호출할 때는 쿼리의 메모리 내 표현을 작성하기만 하면 됩니다. 쿼리는 결과가 사용될 때만 데이터베이스로 전송됩니다.

쿼리를 데이터베이스로 전송하는 가장 일반적인 작업은 다음과 같습니다.

  • for 루프에서 결과 반복
  • ToList, ToArray, Single, Count 또는 동등한 비동기 오버로드와 같은 연산자 사용

경고

항상 사용자 입력의 유효성 검사: EF Core는 매개 변수를 사용하고 쿼리에서 리터럴을 이스케이프하여 SQL 공격을 방어하지만 입력의 유효성을 검사하지 않습니다. 신뢰할 수 없는 소스의 값이 LINQ 쿼리에서 사용되거나, 엔터티 속성에 할당되거나, 다른 EF Core API에 전달되기 전에 애플리케이션의 요구 사항에 따라 적절한 유효성 검사를 수행해야 합니다. 여기에는 쿼리를 동적으로 생성하는 데 사용되는 사용자 입력이 포함됩니다. LINQ를 사용하는 경우에도 식을 작성하는 사용자 입력을 허용하려면 의도한 식만 생성되도록 해야 합니다.