VB.NET 웹페이지 소스 가져오기 - HttpClient 비동기

2024. 2. 16. 14:20VB.NET/기초강좌

VB.NET으로 웹페이지 소스를 가져올때는 비동기 방식을 사용하는게 좋다. 왜냐하면 외부 페이지에 접속해서 소스를 받아올때는 필연적으로 Delay Time이 발생하는데 비동기 방식이 아닌 동기 방식으로 사용하게 되면 이 타이밍에 프로그램이 죽은것처럼 응답이 없기 때문이다. 대상 사이트가 빠른 응답을 하면 프로그램이 1초 이내로 다시 반응하지만, 혹시라도 점검중인 사이트이거나 사용자가 몰려서 응답이 오래 걸리게 되면 10초 이상도 걸리게 되니 무조건 비동기 방식으로 사용하는걸 추천한다.

이번 시간에는 비동기방식으로 웹페이지에 접속해서 소스를 받아오는 간략한 예제를 만들면서 세부적인 구현 방법을 알아보기로 하자.

1. 폼 꾸미기

아래 캡처이미지를 참고해서 메인페이지에 컨트롤을 넣고, 속성을 설정해주자.

HttpClient 사용 예제 Form 꾸미기

(1) Form

  • Name : FormMain
  • Text : HttpClient 예제

(2) TextBox

  • Name : TextBoxURL

(3) Button

  • Name : ButtonConnect
  • Text : 접속

(4) TextBox

  • Name : TextBoxHTML
  • ScrollBars : Both
  • MultiLine : True

2. Form, Button 이벤트

Private Sub FormMain_Load(sender As Object, e As EventArgs) Handles Me.Load
    TextBoxURL.Text = "https://chakhani.tistory.com/195"
End Sub
  • 최초 URL 설정
Private Async Sub ButtonConnect_Click(sender As Object, e As EventArgs) Handles ButtonConnect.Click
    TextBoxHTML.Text = Await GetSource(TextBoxURL.Text)
End Sub
  • 위 URL에 접속후 소스를 받아와서 TextBoxHTML 텍스트상자에 뿌린다.
  • Await : 여기에 주목해야 하는데 이게 바로 "비동기 방식" 으로 함수를 호출하기 위해 사용되는 예약어이다.
  • 함수 내에서 Await 방식으로 호출하는 방식이 하나라도 있으면 해당 함수는 Async로 선언해야 한다.
  • 그래서, ButtonConneect_Click 프로시저의 선언문에 Async가 붙어있는 것이다.

3. GetSolurce 함수

그러면 이제 접속 버튼 클릭시 호출하는 GetSource 함수에 대해 알아보자.

Private Async Function GetSource(pURL As String) As Task(Of String)
    Dim lpSrc As String = ""

    Using client As New HttpClient()
        Try
            Dim response As HttpResponseMessage = Await client.GetAsync(pURL)

            If response.IsSuccessStatusCode Then
                lpSrc = response.Content.ReadAsStringAsync().Result
            Else
                Console.WriteLine($"HTTP 요청 실패: {response.StatusCode}")
            End If
        Catch ex As Exception
            Console.WriteLine($"에러 발생: {ex.Message}")
        End Try
    End Using

    Return lpSrc
End Function
  • 위에서 언급했듯 비동기 방식으로 함수를 선언해야 하기 때문에 Async 예약어가 사용됐다.
  • 이 함수 내부에서도 Await client.GetAsync(pURL) 방식으로 HttpClient의 함수를 비동기 방식으로 호출하게 된다.
  • Using 문과 Try...Catch... 문이 사용되서 소스가 길어보이기는 하지만 결국 아래 두줄밖에 없다.
  • Async로 함수를 선언할때는 반환형식을 Task(Of...)로 해야 한다는 것을 기억하자.
Dim response As HttpResponseMessage = Await client.GetAsync(pURL)
lpSrc = response.Content.ReadAsStringAsync().Result

이 두줄의 소스를 통해 대상 서버에 접속해서 해당 페이지의 소스를 lpSrc에 가져오게 되는 것이다.

실행 결과는 아래 화면을 참고하자.

웹페이지 소스 받아오기

마치며...

이번 시간에는 HttpClient를 이용해서 비동기 방식으로 서버의 HTML 소스를 가져오는 방법에 대해 간략히 알아봤다. 처음에는 많이 헷갈릴 수 있는데 선언은 Async, 호출은 Await 으로 해야 한다는것만 기억하면 된다.

 

비동기 방식은 대체적으로 이 예제처럼 외부 서버에 접속할때나 용량이 큰 파일을 열때처럼 체감되는 소요시간이 오래 걸리는 작업을 할때 사용자에게 끊김없는 화면을 보여주기 위한 목적으로 사용되는 경우가 많으니, 여러 방식으로 연습해서 자기걸로 만들어 놓는게 좋다.

 

반응형

'VB.NET > 기초강좌' 카테고리의 다른 글

VB.NET의 특이한 연산자 ?. 이게 뭐지?  (0) 2023.09.02
VB.NET 변수와 데이터형  (0) 2023.08.04
Visual Studio 2022 Community 설치하기  (0) 2023.07.18