본문 바로가기
delphi

Wininet Delphi 라이브러리로 URL 유효성 검사하기

by doran365 2024. 8. 16.

웹 개발 및 소프트웨어 개발 환경에서 URL의 유효성을 검사하는 것은 매우 중요한 작업입니다. 특히 웹사이트의 이미지나 파일을 다운로드해야 하는 프로젝트에서는 이러한 유효성 검사가 더욱 필요합니다. URL이 잘못되었거나 삭제된 경우, 이를 미리 감지하지 못하면 프로그램이 비정상적으로 종료되거나, 사용자가 불편을 겪게 될 수 있습니다. 이 글에서는 Wininet Delphi Runtime Library를 활용해 URL의 유효성을 검사하는 방법을 소개하고자 합니다.

Wininet Delphi 라이브러리 소개

Wininet은 마이크로소프트 윈도우에서 제공하는 인터넷 기능을 활용할 수 있게 해주는 API입니다. 델파이(Delphi) 개발 환경에서는 이 Wininet API를 래핑하여 보다 쉽게 사용할 수 있도록 Wininet Delphi Runtime Library를 제공합니다. 이 라이브러리를 사용하면 복잡한 네트워크 통신을 비교적 간단하게 구현할 수 있습니다.

Wininet Delphi의 장점

  1. 쉽고 직관적인 사용법: 델파이에서 Wininet 라이브러리를 사용하면, 복잡한 네트워크 프로그래밍을 쉽게 구현할 수 있습니다. 이를 통해 개발자는 코드의 복잡도를 줄일 수 있습니다.
  2. 윈도우 시스템과의 높은 호환성: 윈도우 API를 직접 활용하기 때문에 윈도우 환경에서 최고의 성능과 안정성을 제공합니다.
  3. 다양한 기능 지원: HTTP, FTP, Gopher 등 다양한 인터넷 프로토콜을 지원하며, HTTP 상태 코드, 쿠키 관리, 캐시 관리 등 다양한 기능을 사용할 수 있습니다.

URL 유효성 검사 코드 예제

이제 Wininet Delphi 라이브러리를 사용하여 URL의 유효성을 검사하는 코드를 살펴보겠습니다. 이 코드는 주어진 URL이 유효한지 여부를 확인하고, 특정 HTTP 상태 코드에 따라 결과를 반환합니다.

uses
  wininet;

function IsUrlValid(const url: string; ATimeoutMSec: Integer = 0): boolean;
var
  hInet: HINTERNET;
  hConnect: HINTERNET;
  infoBuffer: array [0..512] of char;
  dummy: DWORD;
  bufLen: DWORD;
  okay: LongBool;
  reply: String;
begin
  if pos('://-', url) > 0 then
  begin
    result := false;
    exit;
  end;
  hInet := InternetOpen(PChar('EYECOMA'),
    INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY, nil, nil, 0);
  
  if ATimeoutMSec > 0 then
    InternetSetOption(hInet, INTERNET_OPTION_CONNECT_TIMEOUT,
                      @ATimeoutMSec, SizeOf(ATimeoutMSec));

  hConnect := InternetOpenUrl(hInet, PChar(url), nil, 0,
    INTERNET_FLAG_NO_UI, 0);
  
  if not Assigned(hConnect) then
    result := false
  else
  begin
    dummy := 0;
    bufLen := Length(infoBuffer);
    okay := HttpQueryInfo(hConnect, HTTP_QUERY_STATUS_CODE,
      @infoBuffer[0], bufLen, dummy);
    
    if not okay then
      result := False
    else
    begin
      reply := infoBuffer;
      if reply = '200' then
        result := True
      else
        result := False;
    end;
    InternetCloseHandle(hConnect);
  end;
  InternetCloseHandle(hInet);
end;

코드 설명

  1. InternetOpen 함수: 이 함수는 인터넷 연결을 초기화합니다. 여기서는 'EYECOMA'라는 사용자 에이전트 이름을 사용했습니다.
  2. InternetOpenUrl 함수: 주어진 URL에 대해 연결을 시도합니다. 이 함수는 URL이 유효하면 핸들을 반환하며, 유효하지 않은 경우에는 nil을 반환합니다.
  3. HttpQueryInfo 함수: HTTP 요청에 대한 상태 코드를 반환합니다. 이 코드를 통해 URL이 유효한지 여부를 판단할 수 있습니다.
  4. InternetCloseHandle 함수: 사용이 끝난 핸들을 닫아 메모리 누수를 방지합니다.

타임아웃 설정의 중요성

URL 유효성 검사를 할 때 타임아웃 설정은 매우 중요합니다. 타임아웃을 설정하지 않으면 서버가 응답하지 않을 경우 프로그램이 무한 대기 상태에 빠질 수 있습니다. 위 코드에서는 타임아웃 시간을 설정하여 이 문제를 방지했습니다. 일반적으로 1~2초 이내에 응답을 받아야 정상적인 동작으로 간주할 수 있습니다.

타임아웃 설정 방법

InternetSetOption(hInet, INTERNET_OPTION_CONNECT_TIMEOUT, @ATimeoutMSec, SizeOf(ATimeoutMSec));

위 코드에서 ATimeoutMSec는 타임아웃 시간을 밀리초 단위로 설정합니다. 예를 들어, 2000을 입력하면 2초 동안 응답을 기다리며, 이 시간이 지나면 타임아웃 오류가 발생합니다.

HTTP 상태 코드에 따른 처리

HTTP 상태 코드는 URL이 유효한지 여부를 판단하는 중요한 기준입니다. 다음은 일반적으로 자주 사용되는 상태 코드와 그 의미입니다.

주요 HTTP 상태 코드

  • 200 OK: 요청이 성공적으로 이루어졌으며, URL이 유효함을 나타냅니다.
  • 404 Not Found: 요청한 URL을 찾을 수 없음을 나타냅니다. 일반적으로 파일이 삭제되었거나 URL이 잘못된 경우에 발생합니다.
  • 500 Internal Server Error: 서버 내부 오류로 인해 요청을 처리할 수 없음을 나타냅니다.
  • 401 Unauthorized: 인증이 필요한 URL이지만 인증되지 않았음을 나타냅니다.

상태 코드에 따른 결과 처리

코드에서 reply 변수를 통해 상태 코드를 확인하고, 이에 따라 result 값을 True 또는 False로 설정합니다. 예를 들어, 상태 코드가 200인 경우 URL이 유효하다고 판단하여 True를 반환합니다.

URL 유효성 검사 시 주의사항

URL 유효성 검사는 기본적으로 간단한 작업이지만, 몇 가지 주의해야 할 사항이 있습니다.

  1. URL 형식 확인: 잘못된 URL 형식을 미리 걸러내는 것이 좋습니다. 예를 들어, "://-"와 같은 잘못된 URL이 입력되는 경우 검사할 필요 없이 False를 반환합니다.
  2. HTTP 상태 코드 처리: 모든 HTTP 상태 코드를 처리할 필요는 없지만, 주요 상태 코드에 대해서는 적절한 대응을 할 수 있어야 합니다. 특히, 200번 이외의 상태 코드에 대해서는 사용자에게 정확한 피드백을 제공하는 것이 중요합니다.
  3. 타임아웃 설정: 타임아웃 설정을 통해 프로그램이 무한 대기 상태에 빠지는 것을 방지해야 합니다. 적절한 타임아웃 시간을 설정하는 것이 안정적인 프로그램 동작에 필수적입니다.

결론

Wininet Delphi Runtime Library를 활용하여 URL의 유효성을 검사하는 방법을 알아보았습니다. 이 방법은 복잡한 네트워크 프로그래밍을 단순화시켜 줄 뿐만 아니라, HTTP 상태 코드에 따른 다양한 상황에 대응할 수 있는 유연성을 제공합니다. 앞으로 URL 유효성 검사 기능을 구현할 때, 이 글에서 소개한 방법을 활용해 보세요.