Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

Oracle.ManagedDataAccess - "ORA-01882: timezone region not found" 오류가 발생하는 이유

오랜만에 .NET Core 3.1 + docker 환경에서 Oracle.ManagedDataAccess.Core를 사용해 Oracle 접속 테스트를 했는데요, 다음과 같은 오류가 발생하는군요. ^^;

An unhandled exception occurred while processing the request.
OracleException: ORA-00604: error occurred at recursive SQL level 1
ORA-01882: timezone region not found
OracleInternal.ConnectionPool.PoolManager<PM, CP, PR>.Get(ConnectionString csWithDiffOrNewPwd, bool bGetForApp, OracleConnection connRefForCriteria, string affinityInstanceName, bool bForceMatch)

Stack Query Cookies Headers Routing
OracleException: ORA-00604: error occurred at recursive SQL level 1 ORA-01882: timezone region not found
OracleInternal.ConnectionPool.PoolManager<PM, CP, PR>.Get(ConnectionString csWithDiffOrNewPwd, bool bGetForApp, OracleConnection connRefForCriteria, string affinityInstanceName, bool bForceMatch)
OracleInternal.ConnectionPool.OraclePoolManager.Get(ConnectionString csWithNewPassword, bool bGetForApp, OracleConnection connRefForCriteria, string affinityInstanceName, bool bForceMatch)
OracleInternal.ConnectionPool.OracleConnectionDispenser<PM, CP, PR>.Get(ConnectionString cs, PM conPM, ConnectionString pmCS, SecureString securedPassword, SecureString securedProxyPassword, OracleConnection connRefForCriteria)
Oracle.ManagedDataAccess.Client.OracleConnection.Open()
razor31_sample.Pages.IndexModel.DoOracleManagedCall(int delay) in Index.cshtml.cs
razor31_sample.Pages.IndexModel.OnGet(string fileName) in Index.cshtml.cs
Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.ExecutorFactory+VoidHandlerMethod.Execute(object receiver, object[] arguments)
Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker.InvokeHandlerMethodAsync()
Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker.InvokeNextPageFilterAsync()
Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker.Rethrow(PageHandlerExecutedContext context)
Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker.InvokeInnerFilterAsync()
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|24_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, object state, bool isCompleted)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync()
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

Show raw exception details

검색해 보면 다행히 답이 나옵니다.

ORA-01882: timezone region not found
; https://stackoverflow.com/questions/9156379/ora-01882-timezone-region-not-found

답변 중에 "Uday Singh"의 글을 보면, Oracle DB에 등록되지 않은 timezone을 클라이언트에서 보내는 경우 발생한다고 하는데요, 아마도 OracleConnection이 기본값으로 전송하는 timezone이 서버에 등록되지 않은 것이기 때문에 저런 오류가 발생하는 듯합니다.

참고로, 서버에 등록된 timezone은 SQL Developer와 같은 도구를 이용해 오라클에 접속해 다음의 쿼리를 전송하면 됩니다.

SELECT DISTINCT tzname FROM V$TIMEZONE_NAMES

제 경우에 테스트로 설치한 Oracle 11g Express Edition은 다음과 같은 timezone이 열거됩니다.

Africa/Addis_Ababa
Africa/Bissau
Africa/Ceuta
Africa/Harare
Africa/Kinshasa
Africa/Maputo
Africa/Windhoek
America/Argentina/Buenos_Aires
America/Cayenne
America/Cordoba
America/Danmarkshavn
America/Guadeloupe
America/Hermosillo
America/Indiana/Indianapolis
America/Indiana/Knox
America/Knox_IN
America/La_Paz
America/Manaus
America/Mendoza
America/Nipigon
America/Panama
America/Swift_Current
Asia/Beirut
Asia/Macau
Asia/Saigon
Asia/Tokyo
Atlantic/Faeroe
Atlantic/St_Helena
Australia/Melbourne
Australia/West
Chile/EasterIsland
Eire
Etc/GMT
Etc/GMT+3
Etc/GMT+7
Etc/GMT-11
Etc/GMT-3
Europe/Andorra
Europe/Bratislava
Europe/Dublin
Europe/Jersey
Europe/Nicosia
Europe/Tirane
Europe/Zaporozhye
GMT+0
Indian/Chagos
Indian/Mauritius
Mexico/General
MST7MDT
NZ
NZ-CHAT
Pacific/Easter
Pacific/Palau
Poland
ROC
US/Alaska
Africa/Abidjan
Africa/Asmara
Africa/Brazzaville
Africa/Douala
Africa/Lome
Africa/Mogadishu
Africa/Monrovia
Africa/Niamey
Africa/Nouakchott
Africa/Ouagadougou
Africa/Timbuktu
Africa/Tripoli
America/Araguaina
America/Belize
America/Coral_Harbour
America/Cuiaba
America/Grenada
America/Indiana/Tell_City
America/Juneau
America/Kentucky/Louisville
America/Louisville
America/Montevideo
America/North_Dakota/New_Salem
America/Paramaribo
America/Rainy_River
America/Resolute
America/Sao_Paulo
America/Tortola
America/Vancouver
Asia/Bahrain
Asia/Brunei
Asia/Dili
Asia/Hovd
Asia/Karachi
Asia/Kolkata
Asia/Riyadh
Asia/Tehran
Asia/Ulaanbaatar
Atlantic/Stanley
Australia/Broken_Hill
Chile/Continental
Etc/GMT+10
Etc/GMT+9
Etc/GMT-2
Europe/Athens
Europe/Bucharest
Europe/Guernsey
Europe/Sofia
Europe/Vienna
Europe/Zagreb
GMT-0
Indian/Comoro
Jamaica
MST
Pacific/Chatham
Pacific/Noumea
US/Aleutian
US/Arizona
US/Pacific-New
Africa/Dar_es_Salaam
Africa/Kigali
Africa/Porto-Novo
America/Argentina/Catamarca
America/Argentina/ComodRivadavia
America/Bahia
America/Belem
America/Boise
America/Denver
America/Eirunepe
America/Indiana/Vevay
America/Indiana/Vincennes
America/Kentucky/Monticello
America/Maceio
America/Matamoros
America/Mexico_City
America/Moncton
America/Monterrey
America/Porto_Acre
America/Yellowknife
Antarctica/Palmer
Asia/Aqtobe
Asia/Dubai
Asia/Kashgar
Asia/Macao
Asia/Manila
Asia/Nicosia
Asia/Oral
Asia/Qyzylorda
Asia/Sakhalin
Atlantic/Bermuda
Australia/Canberra
Australia/NSW
Australia/South
Australia/Tasmania
Brazil/DeNoronha
Brazil/East
Canada/Yukon
EST5EDT
Etc/GMT+8
Etc/GMT-10
Etc/GMT-5
Etc/Greenwich
Europe/Brussels
Europe/Malta
Europe/Podgorica
Europe/Prague
Europe/Samara
Europe/San_Marino
Europe/Tiraspol
Iceland
Indian/Christmas
Mexico/BajaSur
Pacific/Enderbury
Pacific/Fakaofo
Pacific/Majuro
Pacific/Ponape
Pacific/Tahiti
Pacific/Tongatapu
Pacific/Wake
PRC
Africa/Accra
Africa/Bamako
Africa/Conakry
Africa/Johannesburg
Africa/Libreville
Africa/Lusaka
Africa/Sao_Tome
America/Argentina/Cordoba
America/Argentina/Salta
America/Argentina/San_Luis
America/Atka
America/Barbados
America/Bogota
America/Buenos_Aires
America/Costa_Rica
America/Guatemala
America/Indiana/Winamac
America/Marigot
America/Montserrat
America/Phoenix
America/Porto_Velho
America/Rosario
America/Santa_Isabel
America/Santiago
America/Scoresbysund
America/St_Vincent
America/Thule
America/Toronto
Antarctica/DumontDUrville
Asia/Aden
Asia/Amman
Asia/Ashkhabad
Asia/Bishkek
Asia/Choibalsan
Asia/Chungking
Asia/Colombo
Asia/Dhaka
Asia/Dushanbe
Asia/Gaza
Asia/Irkutsk
Asia/Jerusalem
Asia/Novosibirsk
Asia/Omsk
Asia/Rangoon
Asia/Tel_Aviv
Asia/Thimbu
Asia/Vientiane
Asia/Vladivostok
Atlantic/Canary
Australia/Currie
Australia/Hobart
Australia/Lord_Howe
Australia/Perth
Australia/Sydney
Canada/Central
Etc/GMT+0
Etc/GMT+5
Etc/GMT-8
Etc/GMT-9
Europe/Belgrade
Europe/Berlin
Europe/Budapest
Europe/Gibraltar
Europe/Isle_of_Man
Europe/Kaliningrad
Europe/Ljubljana
Europe/Luxembourg
Europe/Paris
Europe/Tallinn
Europe/Uzhgorod
Europe/Volgograd
GMT
HST
Indian/Cocos
MET
Mexico/BajaNorte
Pacific/Apia
Pacific/Efate
Pacific/Fiji
Pacific/Guadalcanal
Pacific/Johnston
Pacific/Pitcairn
Pacific/Port_Moresby
Pacific/Samoa
Pacific/Truk
Pacific/Yap
US/Eastern
US/Michigan
Africa/Bangui
Africa/Blantyre
Africa/Cairo
Africa/Khartoum
Africa/Lagos
Africa/Malabo
Africa/Maseru
Africa/Nairobi
Africa/Tunis
America/Argentina/Tucuman
America/Bahia_Banderas
America/Blanc-Sablon
America/Cancun
America/Dominica
America/Havana
America/Indiana/Marengo
America/Los_Angeles
America/Managua
America/Martinique
America/Mazatlan
America/Menominee
America/Miquelon
America/Nome
America/Rankin_Inlet
America/Santo_Domingo
America/Shiprock
America/St_Thomas
America/Virgin
America/Whitehorse
America/Winnipeg
America/Yakutat
Antarctica/South_Pole
Arctic/Longyearbyen
Asia/Baghdad
Asia/Baku
Asia/Bangkok
Asia/Calcutta
Asia/Damascus
Asia/Harbin
Asia/Jakarta
Asia/Kabul
Asia/Singapore
Asia/Urumqi
Atlantic/Azores
Australia/Adelaide
Australia/LHI
Brazil/West
Canada/Pacific
CST6CDT
Cuba
Egypt
Etc/GMT+2
Etc/GMT+4
Etc/GMT0
Etc/GMT-14
Europe/Amsterdam
Europe/Helsinki
Europe/Istanbul
Europe/Kiev
Europe/Lisbon
Europe/Mariehamn
Europe/Minsk
GB-Eire
Greenwich
Indian/Antananarivo
Indian/Mayotte
Kwajalein
Pacific/Auckland
Pacific/Galapagos
Pacific/Honolulu
Pacific/Nauru
Pacific/Wallis
US/Central
US/Mountain
UTC
Africa/Gaborone
America/Asuncion
America/Campo_Grande
America/Chicago
America/Detroit
America/Edmonton
America/Ensenada
America/Goose_Bay
America/Halifax
America/Indiana/Petersburg
America/Indianapolis
America/Iqaluit
America/Jamaica
America/Merida
America/Montreal
America/New_York
America/Ojinaga
America/Port-au-Prince
America/St_Johns
America/St_Lucia
America/Thunder_Bay
Antarctica/Casey
Antarctica/Davis
Antarctica/Macquarie
Antarctica/McMurdo
Antarctica/Syowa
Asia/Almaty
Asia/Chongqing
Asia/Hong_Kong
Asia/Kathmandu
Asia/Kuching
Asia/Kuwait
Asia/Magadan
Asia/Shanghai
Asia/Thimphu
Asia/Yakutsk
Asia/Yerevan
Atlantic/Faroe
Atlantic/Jan_Mayen
Atlantic/Madeira
Atlantic/South_Georgia
Australia/Darwin
Australia/Eucla
Canada/East-Saskatchewan
CET
CST
Etc/GMT+1
Etc/GMT-1
Etc/GMT-12
Europe/Belfast
Europe/Chisinau
Europe/Copenhagen
Europe/London
Europe/Rome
Europe/Skopje
Europe/Warsaw
GB
Indian/Maldives
Israel
Pacific/Gambier
Pacific/Kosrae
Pacific/Norfolk
Pacific/Rarotonga
Pacific/Saipan
PST8PDT
US/Hawaii
W-SU
Africa/Algiers
Africa/Asmera
Africa/Banjul
Africa/Bujumbura
Africa/Casablanca
Africa/Djibouti
Africa/El_Aaiun
Africa/Luanda
America/Anchorage
America/Argentina/La_Rioja
America/Argentina/Mendoza
America/Argentina/San_Juan
America/Aruba
America/Boa_Vista
America/Catamarca
America/Cayman
America/Chihuahua
America/Curacao
America/Dawson_Creek
America/El_Salvador
America/Fortaleza
America/Grand_Turk
America/Guayaquil
America/Guyana
America/North_Dakota/Center
America/Port_of_Spain
America/Recife
America/Regina
America/Rio_Branco
America/Tegucigalpa
Antarctica/Mawson
Asia/Anadyr
Asia/Dacca
Asia/Ho_Chi_Minh
Asia/Istanbul
Asia/Jayapura
Asia/Katmandu
Asia/Muscat
Asia/Phnom_Penh
Asia/Pontianak
Asia/Pyongyang
Asia/Seoul
Asia/Tashkent
Asia/Ujung_Pandang
Atlantic/Cape_Verde
Australia/ACT
Australia/North
Australia/Victoria
Canada/Atlantic
Canada/Mountain
Canada/Newfoundland
Canada/Saskatchewan
EET
Etc/GMT+11
Etc/GMT+12
Etc/GMT+6
Etc/GMT-0
Etc/GMT-13
Etc/GMT-4
Europe/Madrid
Europe/Monaco
Europe/Moscow
Europe/Oslo
Europe/Vaduz
Europe/Zurich
GMT0
Indian/Reunion
Libya
Navajo
Pacific/Funafuti
Pacific/Marquesas
Pacific/Pago_Pago
Pacific/Tarawa
ROK
Singapore
US/Indiana-Starke
US/Pacific
WET
Africa/Dakar
Africa/Freetown
Africa/Kampala
Africa/Lubumbashi
Africa/Mbabane
Africa/Ndjamena
America/Adak
America/Anguilla
America/Antigua
America/Argentina/Jujuy
America/Argentina/Rio_Gallegos
America/Argentina/Ushuaia
America/Atikokan
America/Cambridge_Bay
America/Caracas
America/Dawson
America/Fort_Wayne
America/Glace_Bay
America/Godthab
America/Inuvik
America/Jujuy
America/Lima
America/Nassau
America/Noronha
America/Pangnirtung
America/Puerto_Rico
America/St_Barthelemy
America/St_Kitts
America/Tijuana
Asia/Aqtau
Asia/Ashgabat
Asia/Kamchatka
Asia/Krasnoyarsk
Asia/Kuala_Lumpur
Asia/Makassar
Asia/Qatar
Asia/Samarkand
Asia/Taipei
Asia/Tbilisi
Asia/Ulan_Bator
Asia/Yekaterinburg
Atlantic/Reykjavik
Australia/Brisbane
Australia/Lindeman
Australia/Queensland
Australia/Yancowinna
Brazil/Acre
Canada/Eastern
EST
Etc/GMT-6
Etc/GMT-7
Europe/Riga
Europe/Sarajevo
Europe/Simferopol
Europe/Stockholm
Europe/Vatican
Europe/Vilnius
Hongkong
Indian/Kerguelen
Indian/Mahe
Iran
Japan
Pacific/Guam
Pacific/Kiritimati
Pacific/Kwajalein
Pacific/Midway
Pacific/Niue
Portugal
PST
Turkey
US/East-Indiana
US/Samoa

검색해 보면, docker ubuntu 환경의 경우 기본 timezone 값이 UTC라고 하는데요, 사실 이 값은 저 목록에 포함된 값입니다. 그런데, 왜 오류가 발생하는 것일까요? ^^ (잠시 후 아래에서 좀 더 자세하게 설명합니다.)

아무튼, 그래서 저 목록 중의 하나를 보내면 되는데요, 이를 위해 간단하게 환경 설정에 TZ 값으로 지정하면 된다고 합니다. 따라서 docker의 경우 dockerfile에 이렇게 ENV 명령어를 포함하면 됩니다.

...[생략]...

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENV TZ=Asia/Seoul
ENTRYPOINT ["dotnet", "razor31_sample.dll"]

...[생략]...

좀 더 검색을 해보니까, 어떤 글에서는 오라클이 설치된 서버의 TIMEZONE과 접속하려는 측의 TIMEZONE이 맞아야 한다고 하는데요, 제 경우에는 그 문제는 아닌 듯합니다. 왜냐하면, 아래와 같이 TZ를 설정해도,

ENV TZ=America/New_York

잘 동작했기 때문입니다. 뿐만 아니라 "ENV TZ=UTC"로 입력해도 잘 동작합니다. 그냥 유추하는 건데요, 아마도 저렇게 맞춰주어야 동작했다는 것은 오라클 DB에 등록된 TIMEZONE의 목록이 몇 개 없었던 것이 아닐까.. 추측해 봅니다.




그런데, 호기심이 생기는군요. ^^ 과연 Oracle.ManagedDataAccess가 사용하는 기본 TIMEZONE 값이 뭘까요?

좀 더 검색해 보니, 과거 ODP.NET 시절에는 OracleGlobalization 클래스가 정적 메서드로 GetClientInfo를 제공해 주었기 때문에,

// https://docs.oracle.com/database/121/ODPNT/OracleGlobalizationClass.htm#ODPNT3126
using System;
using Oracle.DataAccess.Client;
 
class GetClientInfoSample
{
  static void Main()
  {
    // Get client's globalization info
    OracleGlobalization glob = OracleGlobalization.GetClientInfo();
 
    // Prints "glob.Language = AMERICAN"
    Console.WriteLine("glob.Language = " + glob.Language);
 
    glob.Dispose();
  }
}

기본 timezone을 알아낼 수 있었지만, Oracle.ManagedDataAccess에서는 GetClientInfo 정적 메서드가 삭제되었습니다. 대신 OracleConnection 개체에서 GetSessionInfo가 제공되는데요,

using (OracleConnection oraConnection = new OracleConnection(oradb))
{
    oraConnection.Open();
    OracleGlobalization og = oraConnection.GetSessionInfo();
}                

아쉽게도, 저건 Open을 이미 성공한 다음에 호출할 수 있습니다. (현재 Open에서 보내는 기본 TIMEZONE을 알고 싶은 건데... ^^;)

Reflection을 통해 OracleGlobalization 인스턴스를 생성하는 코드를 찾다 보니 다음의 코드가 나옵니다.

internal OracleGlobalizationImpl(int lcid)
{
    int zoneID = 0;
    OracleGlobalizationImpl.GetLocaleSpecificNLSValues(lcid, ref this.m_language, ref this.m_territory, ref this.m_timeZone, ref zoneID);
}

여기서 lcid는 m_appThreadLCID라는 변수가 넘어가는데, 의미상으로 보면 스레드의 LCID 값이므로 다음과 같은 식으로 Reflection을 이용해 호출할 수 있습니다.

int lcid = Thread.CurrentThread.CurrentCulture.LCID;

Type type = typeof(OracleConnection).Assembly.GetType("OracleInternal.ServiceObjects.OracleGlobalizationImpl");

object[] args = new object[] { lcid, "", "", "", 0 };
MethodInfo mi = type.GetMethod("GetLocaleSpecificNLSValues", BindingFlags.Static | BindingFlags.NonPublic);
mi.Invoke(null, args);

/*
args[0] == 1042 (== Thread.CurrentThread.CurrentCulture.LCID)
args[1] == "KOREAN"
args[2] == "KOREA"
args[3] == "Asia/Seoul";
args[4] == 273
*/

docker 환경이 아닌, 제 컴퓨터에서 실행하면 저렇게 값이 잘 나옵니다. 그리고 docker 환경으로 테스트를 했더니 값이 이렇게 나옵니다.

args[0] == 127 (== Thread.CurrentThread.CurrentCulture.LCID)
args[1] == "AMERICAN"
args[2] == "AMERICA"
args[3] == "Etc/UTC";
args[4] == 28

아하... docker의 기본 TIMEZONE 값이 "Etc/UTC"라고 되어 있군요, 그리고 분명히 이 값은 "V$TIMEZONE_NAMES"에 등록돼 있지 않으므로 ORA-01882 오류 원인이 잘 설명됩니다. 이 상태에서 환경 변수를 이용해 TZ 설정을 UTC로 하면, 위의 출력 결과가 다음과 같이 바뀝니다.

args[0] == 127 (== Thread.CurrentThread.CurrentCulture.LCID)
args[1] == "AMERICAN"
args[2] == "AMERICA"
args[3] == "Etc/GMT";
args[4] == 1

왜 UTC가 "Etc/GMT"로 해석되는지는 알 수 없지만, 어쨌든 "Etc/GMT"는 "V$TIMEZONE_NAMES"에 값이 등록돼 있고 따라서 오류가 발생하지 않는 것도 역시 잘 설명됩니다. 참고로, "TZ=Asia/Seoul"로 설정했더니 이번에는 TIMEZONE 값에 그대로 반영이 됩니다.

args[0] == 127 (== Thread.CurrentThread.CurrentCulture.LCID)
args[1] == "AMERICAN"
args[2] == "AMERICA"
args[3] == "Asia/Seoul";
args[4] == 273

어쨌든, 이렇게 해서 수수께끼가 풀렸습니다. ^^




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 3/11/2022]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




1  2  3  4  5  6  7  8  9  10  11  [12]  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
13641정성태6/11/20248659Linux: 71. Ubuntu 20.04를 22.04로 업데이트
13640정성태6/10/20248833Phone: 21. C# MAUI - Android 환경에서의 파일 다운로드(DownloadManager)
13639정성태6/8/20248443오류 유형: 906. C# MAUI - Android Emulator에서 "Waiting For Debugger"로 무한 대기
13638정성태6/8/20248524오류 유형: 905. C# MAUI - 추가한 layout XML 파일이 Resource.Layout 멤버로 나오지 않는 문제
13637정성태6/6/20248446Phone: 20. C# MAUI - 유튜브 동영상을 MediaElement로 재생하는 방법
13636정성태5/30/20248089닷넷: 2264. C# - 형식 인자로 인터페이스를 갖는 제네릭 타입으로의 형변환파일 다운로드1
13635정성태5/29/20248936Phone: 19. C# MAUI - 안드로이드 "Share" 대상으로 등록하는 방법
13634정성태5/24/20249416Phone: 18. C# MAUI - 안드로이드 플랫폼에서의 Activity 제어 [1]
13633정성태5/22/20248945스크립트: 64. 파이썬 - ASGI를 만족하는 최소한의 구현 코드
13632정성태5/20/20248560Phone: 17. C# MAUI - Android 내에 Web 서비스 호스팅
13631정성태5/19/20249322Phone: 16. C# MAUI - /Download 등의 공용 디렉터리에 접근하는 방법 [1]
13630정성태5/19/20248863닷넷: 2263. C# - Thread가 Task보다 더 빠르다는 어떤 예제(?)
13629정성태5/18/20249163개발 환경 구성: 710. Android - adb.exe를 이용한 파일 전송
13628정성태5/17/20248540개발 환경 구성: 709. Windows - WHPX(Windows Hypervisor Platform)를 이용한 Android Emulator 가속
13627정성태5/17/20248604오류 유형: 904. 파이썬 - UnicodeEncodeError: 'ascii' codec can't encode character '...' in position ...: ordinal not in range(128)
13626정성태5/15/20248873Phone: 15. C# MAUI - MediaElement Source 경로 지정 방법파일 다운로드1
13625정성태5/14/20248929닷넷: 2262. C# - Exception Filter 조건(when)을 갖는 catch 절의 IL 구조
13624정성태5/12/20248722Phone: 14. C# - MAUI에서 MediaElement 사용파일 다운로드1
13623정성태5/11/20248418닷넷: 2261. C# - 구글 OAuth의 JWT (JSON Web Tokens) 해석파일 다운로드1
13622정성태5/10/20249206닷넷: 2260. C# - Google 로그인 연동 (ASP.NET 예제)파일 다운로드1
13621정성태5/10/20248637오류 유형: 903. IISExpress - Failed to register URL "..." for site "..." application "/". Error description: Cannot create a file when that file already exists. (0x800700b7)
13620정성태5/9/20248543VS.NET IDE: 190. Visual Studio가 node.exe를 경유해 Edge.exe를 띄우는 경우
13619정성태5/7/20248860닷넷: 2259. C# - decimal 저장소의 비트 구조파일 다운로드1
13618정성태5/6/20248653닷넷: 2258. C# - double (배정도 실수) 저장소의 비트 구조파일 다운로드1
13617정성태5/5/20249471닷넷: 2257. C# - float (단정도 실수) 저장소의 비트 구조파일 다운로드1
13616정성태5/3/20248617닷넷: 2256. ASP.NET Core 웹 사이트의 HTTP/HTTPS + Dual mode Socket (IPv4/IPv6) 지원 방법파일 다운로드1
1  2  3  4  5  6  7  8  9  10  11  [12]  13  14  15  ...