Microsoft.Data.SqlClient의 비동기 메서드에서 인자로 입력한 CancellationToken이 취소되면 어떻게 되나요?
ai와 인터넷을 찾아보면 다음과 같은 답들이 나옵니다. (ai 마다도 답이 다르더군요)
- SqlException 예외를 던진다.
- TaskCanceledException 예외를 던진다.
- 예외 없이 메서드가 바로 리턴된다.
어느 것이 맞는지 직접 경험해보신 분들의 답변 부탁드립니다.
Microsoft.Data.SqlClient의 비동기 메서드에서 인자로 입력한 CancellationToken이 취소되면 어떻게 되나요?
ai와 인터넷을 찾아보면 다음과 같은 답들이 나옵니다. (ai 마다도 답이 다르더군요)
어느 것이 맞는지 직접 경험해보신 분들의 답변 부탁드립니다.
호출하는 메스드와 상황에 따라 다를 듯 합니다.
SqlConnection.OpenAsync(CancellationToken)에 대한 마이크로소프트 문서는 아래(일부)와 같습니다.
(참고 SqlConnection.OpenAsync(CancellationToken) Method (System.Data.SqlClient) | Microsoft Learn )
그러므로, 정확한 예외를 찾으려면,
마이크로소프트 문서를 보는 것이 제일 빠를 듯 합니다.
알려주신 문서는 System.Data.SqlClient에 대한 문서입니다.
Microsoft.Data.SqlClient에 대한 문서에는 OperationCanceledException이 없습니다.
SqlConnection.OpenAsync Method (Microsoft.Data.SqlClient) | Microsoft Learn
맞습니다! 그렇게 문서를 보면 됩니다!
구글 검색 : System.Data.SqlClient vs Microsoft.Data.SqlClient
구글 AI 응답 번역:
Microsoft.Data.SqlClient는 SQL Server 및 Azure SQL 데이터베이스에 액세스하는 데 권장되는 System.Data.SqlClient의 후속 버전입니다. System.Data.SqlClient는 버그 및 보안 수정을 계속 제공하지만, 모든 새로운 기능과 개발 노력은 Microsoft.Data.SqlClient에 집중되어 있습니다. Microsoft.Data.SqlClient는 기본적으로 활성화된 암호화와 같은 향상된 보안 기능과 성능 향상을 제공하여 최신 .NET 애플리케이션에서 선호되는 선택입니다.
자세한 내용은 다음과 같습니다.
주요 차이점 및 마이그레이션 이유:
보안:
Microsoft.Data.SqlClient는 기본적으로 암호화를 활성화하고 서버 인증서 신뢰를 요구함으로써 보안을 우선시합니다. 이를 통해 개발자는 보안을 손상시킬 수 있는 일반적인 구성 오류를 방지할 수 있습니다.
성능:
Microsoft.Data.SqlClient는 다양한 워크로드, 특히 높은 처리량과 동시성이 필요한 워크로드에 대한 성능 최적화를 이루었습니다.
새로운 기능:
Microsoft.Data.SqlClient는 향상된 클라이언트 프로토콜(TDS8) 및 벡터 기반 쿼리와 같은 AI 관련 기능 지원과 같은 새로운 SQL Server 기능을 위한 플랫폼입니다.
이전 버전과의 호환성:
Microsoft.Data.SqlClient는 일반적으로 System.Data.SqlClient와 이전 버전과의 호환성을 유지하므로 대부분의 애플리케이션에서 마이그레이션 프로세스가 비교적 간단합니다.
유지 관리:
System.Data.SqlClient는 유지 관리 모드에 있으므로 중요한 업데이트 및 버그 수정만 받고 모든 새로운 개발은 Microsoft.Data.SqlClient로 전달됩니다.
마이그레이션 방법:
NuGet 패키지 추가: 프로젝트에 Microsoft.Data.SqlClient NuGet 패키지를 설치합니다.
네임스페이스 업데이트: using 문을 System.Data.SqlClient에서 Microsoft.Data.SqlClient로 변경합니다.
연결 문자열 조정(필요한 경우): 경우에 따라 연결 문자열 설정을 조정해야 할 수 있습니다. 특히 이전에 System.Data.SqlClient에서 TrustServerCertificate=True 또는 Encrypt=False를 사용했다면 더욱 그렇습니다.
기본적으로 새 프로젝트를 시작하거나 최신 SQL Server 기능과 향상된 보안 기능을 활용해야 하는 기존 프로젝트를 사용하는 경우 Microsoft.Data.SqlClient로 마이그레이션하는 것이 좋습니다.
성의 없는 답변일 수도 있는데 이런 종류의 문제는 직접 시도해 보는것이 가장 빠르고 정확하지 않을까요? ![]()
시도해 보시고 결과도 공유해 주시면 더 좋을듯 합니다 ㅎ
취소 토큰에 대해 OperationCanceledException 을 throw 함에도 문서에 나와 있지 않은 경우가 종종 있는데, 특히 최신의 패키지들은 이러한 경향성이 강한 것 같습니다.
문서를 바탕으로 예상해보자면,
아래의 코드는 InvalidOperationException 이
var task = conn.OpenAsync(token);
var task2 = conn.OpenAsync(token);
아래는 OperationCanceledException 이
var cts = new CancellationTokenSource();
var task = conn.OpenAsync(cts.Token);
cts.Cancel();
await task;
두 번 호출하지도 않고, 취소하지도 않고, 연결 문자열을 오염시키 커넥션을 거부하게 만들면, SqlException 이 발생되지 않을까합니다.
샘플 프로그램 만들어서 직접 테스트해봤는데 TaskCanceledException 예외가 발생합니다.
MS 공식 문서에도 안나오고 AI중 Copilot이 맞췄습니다.
Microsoft.EntityFrameworkCore 공식 MS 문서에는 비동기 메서드 호출시 CancellationToken이 취소되면 OperationCanceledException이 발생한다고 나와 있습니다.
그러나 실제로 테스트해보면 TaskCanceledException이 발생합니다.
TaskCanceledException이 OperationCanceledException를 상속받은것이긴 하지만 Microsoft.EntityFrameworkCore의 비동기 메서드의 반환 형식이 Task이므로 명확히 TaskCanceledException 예외가 발생한다고 기술했어야 하지 않나 싶습니다.
MS 문서들을 좀더 찾아봤습니다.
System.Threading을 비롯하여 Task를 반환하는 여러 비동기 메서드들이 OperationCanceledException 예외로 기술되어 있습니다.
아마 실제로는 TaskCanceledException 예외가 발생할 것으로 추측됩니다.
MS에서 왜 문서를 이렇게 작성했을까요.
Task Cancellation - .NET | Microsoft Learn
문서에 나와 있듯이, Task.Status 가 TaskStatus.Cancelled 로 설정되었음을 알리는 수단인 듯 보입니다.
이 값이 중요한 컨텍스트에서는 TaskCancelledException 을 catch 해야 합니다.
이 경우, cts.Cancel() 을 호출했는데도, 이 예외가 catch 되지 않았다면, Task 의 상태를 확인해야 할 것 같습니다.
상태가 Running 이라면, 그에 합당한 대책?을 세워야 하지 않을까 생각됩니다.