6.4.3 WebRobot 서비스 테스트 클라이언트 만들기

설치한 웹 로봇 서비스가 잘 동작하는지 확인하기 위해 테스트 클라이언트를 만들어 봅시다.

테스트 클라이언트는 윈도우즈 폼 응용으로 만듭시다. 그리고 메인 폼에서 수집 가동을 시작하거나 멈추게 할 수 있고 수집 주기를 설정하고 Seed 사이트를 추가하는 등의 작업을 할 수 있게 컨트롤을 배치하세요.

웹 수집 로봇 테스트 클라이언트 메인 폼 컨트롤 배치
[그림 6.7] 웹 수집 로봇 테스트 클라이언트 메인 폼 컨트롤 배치
번호컨트롤 이름컨트롤 유형설명
1btn_start_collectButton수집 가동 버튼
2btn_stop_collectButton수집 멈춤 버튼
3lb_period_infoLabel정보 표시
4tbox_periodTextBox수집 주기 입력 창
5btn_set_periodButton수집 주기 설정 버튼
6btn_get_periodButton수집 주기 가져오기 버튼
7lb_depth_infoLabel정보 표시
8tbox_depthTextBox상대적 깊이 입력 창
9btn_set_depthButton상대적 깊이 설정 버튼
10btn_get_depthButton상대적 깊이 가져오기 버튼
11lb_seed_infoLabel정보 표시
12tbox_seedTextBoxSeed 사이트 입력 창
13btn_seed_addButtonSeed 사이트 입력 버튼
14btn_get_seedtsiteButtonSeed 사이트 가져오기 버튼
15lbox_seedsiteListBoxSeed 사이트 목록

[표 6.3] 웹 수집 로봇 테스트 클라이언트 메인 폼 자식 컨트롤

Form Load 이벤트 핸들러를 추가합니다.

private void MainForm_Load(object sender, EventArgs e)

Form Load 이벤트 핸들러에서는 .NET 리모팅 서비스에 접근하기 위한 채널 생성과 등록을 합니다.

HttpChannel hc = new HttpChannel();
ChannelServices.RegisterChannel(hc, false);

그리고 .NET 리모팅 서비스에서 참조한 GenericWebRobot 개체를 이용하여 수집 가동 여부를 얻어와서 가동 및 멈춤 버튼의 활성화 상태를 변경합니다. .NET 리모팅 서비스에서 참조한 GenericWebRobot 개체는 많은 곳에서 필요하므로 속성으로 정의합시다. 그리고 버튼의 활성화 상태를 변경하는 부분도 별도의 메서드로 작성합시다.

bool enable = WebRobot.GetEnabled();
SetStartStopButton(enable);

WebRobot 속성에서는 .NET 리모팅 서비스에서 제공하는 GenericWebRobot 개체를 참조하여 반환합니다.

GenericWebRobot WebRobot
{
    get
    {
        GenericWebRobot robot = Activator.GetObject(
           typeof(GenericWebRobot),
           "http://[웹 수집 로봇 서비스 IP 주소]:10400/WebRobotSVC")
           as GenericWebRobot;
        return robot;
    }
}

수집 가동과 멈춤 버튼의 활성화 여부는 웹 로봇의 가동 여부에 따라 설정합니다.

private void SetStartStopButton(bool enable)
{
    btn_start_collect.Enabled = !enable;
    btn_stop_collect.Enabled = enable;
}

수집 가동 버튼 클릭 이벤트 핸들러를 추가하세요. 그리고 WebRobot 속성으로 참조한 개체를 통해 가동합니다. 수집 멈춤 버튼 클릭 이벤트 핸들러도 추가하여 같은 원리로 구현합니다.

private void btn_start_collect_Click(object sender, EventArgs e)
{
    WebRobot.SetEnabled(true);
    SetStartStopButton(true);
}
private void btn_stop_collect_Click(object sender, EventArgs e)
{
    WebRobot.SetEnabled(false);
    SetStartStopButton(false);
}

수집 주기 설정 버튼 클릭 이벤트 핸들러를 추가합니다. 수집 주기 입력 창에 입력한 값을 인자로 수집 주기를 설정합니다.

private void btn_set_period_Click(object sender, EventArgs e)
{
    int period = 0;
    if (int.TryParse(tbox_period.Text, out period))
    {
        WebRobot.SetPeriod(period);
    }
}

Seed 사이트 추가 버튼 클릭 이벤트 핸들러도 같은 원리로 구현합니다. 수집 주기 가져오기 버튼 클릭 이벤트 핸들러와 상대적 깊이 얻어오기 버튼 클릭 이벤트 핸들러도 같은 원리로 구현합니다.

private void btn_add_seed_Click(object sender, EventArgs e)
{
    WebRobot.SetSeedSite(tbox_seed.Text);
}

private void btn_get_period_Click(object sender, EventArgs e)
{
    tbox_period.Text =  WebRobot.GetPeriod().ToString();
}

private void btn_get_depth_Click(object sender, EventArgs e)
{
    tbox_depth.Text = WebRobot.GetDepth().ToString();
}

Seed 사이트 가져오기 버튼 클릭 이벤트 핸들러를 추가하세요. Seed 사이트를 가져오는 부분은 웹 로봇과 무관한 내용입니다. 이 부분은 DbmForAllLib에서 제공하는 것이 적절할 것입니다. 그런데 이 부분을 제공하는 부분이 없습니다. 이처럼 개발 공정에 따라 개발하다보면 앞 단계의 작업을 잘못한 것을 발견할 수 있습니다. 이 때는 발견한 문제를 해결하고 진행하세요. 여기에서는 DbmForAllLib의 EHDbmForAll 정정 클래스의 정적 메서드로 Seed 사이트 목록을 반환하는 GetSeedSite를 만들고 이를 이용하여 Seed 사이트 목록 상자를 설정할게요.

private void btn_get_seedsite_Click(object sender, EventArgs e)
{
    lbox_seedsite.DataSource= EHDbmForAll.GetSeedSite();
}

다음은 DbmForAllLib의 EHDbmForAll 정정 클래스에 추가할 내용입니다.

Seed 사이트 목록을 반환하는 GetSeedSite 메서드를 추가합니다.

public static List<string> GetSeedSite()

결과 목록을 보관할 컬렉션을 생성합니다.

List<string> list = new List<string>();

Seed 사이트 목록은 수집 후보 테이블의 항목 중에 상대적 깊이가 0인 사이트와 수집한 페이지 테이블에서 상대적 깊이가 0인 수집 요청 사이트입니다.

먼저 수집 후보 테이블의 항목 중에 상대적 깊이가 0인 사이트를 얻어오기 위한 개체를 생성합니다.

SqlCommand scom = MakeSPCommand(
      "Select Url From CandidateTable Where Depth=0"
        ,CommandType.Text);

SqlCommand 개체의 연결을 열고 쿼리를 실행합니다.

scom.Connection.Open();
SqlDataReader sdr = scom.ExecuteReader();

SqlDataReader 개체를 순차적으로 읽어 사이트 주소를 컬렉션에 추가하고 닫습니다.

while (sdr.Read())
{
    list.Add(sdr["Url"].ToString());
}
sdr.Close();

SqlCommand 개체의 연결을 닫습니다.

scom.Connection.Close();

이번에는 수집한 페이지 테이블에서 상대적 깊이가 0인 요청 주소를 얻어오기 위해 개체를 만듭니다.

scom = MakeSPCommand(
        "Select OriginUrl From PostedUrlTable Where Depth=0"
        , CommandType.Text);

SqlCommand 개체의 연결을 열고 명령을 실행합니다.

scom.Connection.Open();
sdr = scom.ExecuteReader();

SqlDataReader 개체를 순차적으로 읽어 결과 컬렉션에 추가합니다. 요청 주소가 같은 항목이 있을 수 있으니 존재하지 않는 주소만 추가합니다.

while (sdr.Read())
{
    string url = sdr["OriginUrl"].ToString();
    if (list.Contains(url) == false)
    {
        list.Add(url);
    }
}

SqlDataReader 개체와 SqlCommand 개체의 연결을 닫고 결과 목록을 반환합니다.

sdr.Close();
scom.Connection.Close();
return list;

▷ EHDbmForAll.cs에 추가할 메서드 (DBMForAll 라이브러리)

/// <summary>
/// Seed 사이트 목록 가져오기 메서드
/// </summary>
/// <returns>Seed 사이트 목록</returns>
public static List<string> GetSeedSite()
{
    List<string> list = new List<string>();

    SqlCommand scom = MakeSPCommand(
               "Select Url From CandidateTable Where Depth=0"
                ,CommandType.Text);
 
    scom.Connection.Open();

    SqlDataReader sdr = scom.ExecuteReader();
    while (sdr.Read())
    {
        list.Add(sdr["Url"].ToString());
    }
    sdr.Close();

    scom.Connection.Close();

    scom = MakeSPCommand(
                "Select OriginUrl From PostedUrlTable Where Depth=0"
                , CommandType.Text);
 
    scom.Connection.Open();

    sdr = scom.ExecuteReader();
    while (sdr.Read())
    {
       string url = sdr["OriginUrl"].ToString();
        if (list.Contains(url) == false)
        {
            list.Add(url);
        }
    }
    sdr.Close();

    scom.Connection.Close();
    return list;
}

▷ MainForm.cs

using System;
using System.Windows.Forms;
using System.Runtime.Remoting.Channels.Http;
using System.Runtime.Remoting.Channels;
using GenericWebRobotLib;
using DBM_ForAll;

namespace WebRobotSvcClient예광탄
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }

        GenericWebRobot WebRobot
        {
            get
            {
                GenericWebRobot robot = Activator.GetObject(
               typeof(GenericWebRobot),
               "http:// [웹 수집 로봇 서비스 IP 주소]/WebRobotSVC")
                as GenericWebRobot;
                return robot;
            }
        } 


        private void MainForm_Load(object sender, EventArgs e)
        {
            HttpChannel hc = new HttpChannel();
            ChannelServices.RegisterChannel(hc, false);

            bool enable = WebRobot.GetEnabled();
            SetStartStopButton(enable);
        }
 
        private void SetStartStopButton(bool enable)
        {
            btn_start_collect.Enabled = !enable;
            btn_stop_collect.Enabled = enable;
        } 
 
        private void btn_start_collect_Click(object sender, EventArgs e)
        {
            WebRobot.SetEnabled(true);
            SetStartStopButton(true);
        }

        private void btn_stop_collect_Click(object sender, EventArgs e)
        {
            WebRobot.SetEnabled(false);
            SetStartStopButton(false);
        }
 

        private void btn_set_period_Click(object sender, EventArgs e)
        {
            int period = 0;
            if (int.TryParse(tbox_period.Text, out period))
            {
                WebRobot.SetPeriod(period);
            }
        }
 
        private void btn_add_seed_Click(object sender, EventArgs e)
        {
            WebRobot.SetSeedSite(tbox_seed.Text);
        }
 
        private void btn_get_period_Click(object sender, EventArgs e)
        {
            tbox_period.Text =  WebRobot.GetPeriod().ToString();
        }
 
        private void btn_get_depth_Click(object sender, EventArgs e)
        {
            tbox_depth.Text = WebRobot.GetDepth().ToString();
        }
 
        private void btn_get_seedsite_Click(object sender, EventArgs e)
        {
            lbox_seedsite.DataSource = EHDbmForAll.GetSeedSite();
        }
    }
}