2014 학년도종합설계 1 차중간보고서 ( 스마트폰기반의나만의검색엔진 ) 성명학번 e-mail 연락처 하희진 200412361 wheejinv@naver.com 010-2009-9073 김태훈 200811424 eamay00@gmail.com 010-9032-5537 담당교수 : 유준범교수님 ( 인 ) - 1 -
목 차 1. 프로젝트개요 2. 개발동기 3. 구현계획 4. 기대효과 5. 프로젝트진행상황 6. 어플리케이션 UI 7. 개발환경 8. 팀구성및역할분담 9. 프로젝트추진일정 10. 참고문헌 - 2 -
1. 프로젝트개요 가. 개요 최근블로그를통한정보검색이활발해지고, 일반사용자들의블로그운영이일반화되었다. 이와관련하여일상정보부터전문정보까지블로그의활용도와의존도가높아짐에따라기업의광고대행을맡은상업성블로그의비율도함께높아지고있는추세이다. 일반미디어광고와는달리블로그를통한간접광고는일반사용자들이쉽게분별해낼수없어얻고자하는정확한정보를얻기어렵다. 또한사용자의성향에맞는블로거와이웃을맺을수는있지만이웃블로거들의각각의글들을한눈에비교분석하여최적의정보를찾는것또한불가능하여정보검색에불필요하게많은시간을할애할수밖에없는실정이다. 나. 목적 본프로젝트에서개발하는스마트폰어플리케이션기반의데이터검색시스템은사용자가임의로부여한기준을통해선정된블로그내에서필요한데이터만을얻어비교분석할수있는서비스를제공하는것을목적으로한다. - 3 -
다. 목표 - 스마트폰어플리케이션에탑재가능한데이터검색시스템을개발하여다음과같은서비스를제공한다. - 서버컴퓨터는사용자부터입력받은 ID를이용, 블로그를크롤링하여데이터를 DB에저장한다. - 사용자는자신이선택한블로거들의포스트목록중부여한기준에부합하는포스트목록만을추출한다. - 추출된각포스트마다공감, 코멘트수등의정보를통해신뢰도를판단할수있고, 해당정보를토대로순위구성이가능하다. - 4 -
2. 개발동기 평소블로그를통한정보검색시불편했던사항들과추가되었으면하는기능들을토대로사용자에게최적화된정보만을제공하는진일보한데이터검색시스템을직접구현해본다. C++ 을활용한크롤러구현, ODBC를활용한 DBMS 구현, 자바를활용한프로그램구현등전공수업을통해습득한다양한기술들을활용해목표한결과물을만들어내는한편, 두명의팀원모두경험이없는안드로이드기반의어플리케이션개발에도전해본다. - 5 -
3. 구현계획 가. 전체시스템구조 나. 웹크롤러동작방식 1 seed page는사용자에게입력을받게되는데, 받게되는입력값은사용자사용자가선정한네이버블로거의 ID이다. 2 입력받은 ID 를토대로 seed page url 를설정하고, 소켓 API 를사용하여 html 문서를가져온다. 3 html 문서를분석하기쉽게토큰으로쪼갠다. 예를 들어 <a href = http://naver.com"> 네이버 </a> 라 는 html 구문이있다면이구문은태그의시작을 - 6 -
알리는 <a href = http://naver.com"> 구문과텍 스트인네이버구문과태그가닫히는 </a> 구문으 로쪼개어볼수있을것이다. 4 이를토대로 html 문서에서포스트에관련된정보를추출할수있다. 관련된정보로는블로거아이디, 포스트제목, 포스트업데이트시간, 포스트 url 주소, 본문의내용, 사용된이미지의주소와개수, 코멘트수, 공감수등이있다. 5 이러한정보는 ODBC 를이용하여 DBMS 에접속한 후 DB 에저장한다. 다. DB 블로거는여러개의포스트를쓸수있고, 각각의포스트는여러개의코멘트, 이미지, 태그, 공감 ( 을한사람 ) 정보를담고있다. - 7 -
4. 기대효과 최근넘쳐나는광고성포스트들을제외하고결과값을보여준다면사용자의시간을절약할수있는이점이생길것으로기대한다. 하지만사용자가자신이선호하는블로거들을선정하는데있어서적은수의블로거들만선정하게된다면검색결과값이빈약하게될것이므로네이버블로그카테고리 ( 영화, 미술 디자인, 애완 반려동물, 맛집, IT 컴퓨터 ) 등에서선정한파워블로거들을 DB 에등록해두어, 충분한정보반경안에서유용한정보검색을가능하게한다. 사용자중심의검색기준을마련하여 ( 코멘트수, 공감수, 애정도등 ) 사용자가입력한검색어가포함된게시글중유용한글들을선별할수있다. - 8 -
5. 프로젝트진행상황가. crawler 구현 1. string connecthttp(const char *url) url을매개변수로하여해당 url의 html을읽어와서 string형타입으로반환 1-1. InternetOpen("test", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL,0) 인터넷관련 DLL 을초기화한다. 1-2. InternetOpenUrl(hInternet,url, NULL, 0, INTERNET_FLAG_RELOAD, 0); URL에대한접근을하는데에사용하는함수이다. 만약해당 URL이존재하지않는다면 0을리턴하고, URL이있다면 HINTERNET 핸들을반환한다. 1-3. InternetQueryDataAvailable (hurl, &dwsize, 0, 0) 네트워크카드를통해서들어온데이터가버퍼에쌓이게되는데, 그버퍼의양을읽어낸다. 곧바로저장하거나읽어낼때이용가능한버퍼사이즈를얻어낸다. 버퍼사이즈는 DWORD dwsize에저장한다. - 9 -
1-4. InternetReadFile(hURL, buffer, dwsize, &ReadSize) Internet 정보를읽어온다. hurl은조사할버퍼의핸들러이고, buffer는읽은데이터를저장할버퍼이다. dwsize는읽고자하는데이터의크기이다. 2. int tag_finder(struct token *tok, const char *str_html, int index) < 로시작하는태그를찾아의미있는 token 정보를저장한다. token 구조체는토큰의타입 (int) 과토큰의컨텐츠 (char[10000]) 으로구성된다. index는 html 문서를나타내는 str_html의분석할시작지점을나타낸다. 다음그림은아이디가 hyunwoo879인블로거의 http://blog.naver.com/postlist.nhn?from=postlist& blogid=hyunwoo879&categoryno=0¤tpage =1 페이지의 html중 3407번줄을분석한결과를보여준다. - 10 -
토큰타입은 0, 1, 2 세가지로나뉘어져있으며 0 은 태그가열리는 TAG_OPEN, 1 은태그가닫히는 TAG_CLOSE, 2 는 TEXT 를나타낸다. 3. void parser(string blog_id) 실질적으로파싱을하는부분으로소스의일부분을첨부. while (str_size > index) { index = tag_finder(&tok, html, index); /* 1. post tiitle 파싱. strstr은문자s1에서 s2를찾아그주소를반환한다. 토큰의타입이 TAG_OPEN 이고토큰의내용중 "pcol1 itemsubjectboldfont") 와같은부분이있다면참이된다. */ if ( (tok.type == TAG_OPEN) && strstr(tok.contents, "pcol1 itemsubjectboldfont") ) { post_title_flag = true } else if ( (tok.type == TEXT) && post_title_flag ) - 11 -
} { } /* 타이틀부분인 tok.contents 를페이지정보가담겨있는 PageInfo 클래스의변수인 page에 post title 정보를저장한다.*/ page.setposttitle(tok.contents); post_title_flag = false 4. 다음그림은크롤러가동작하여 hyunwoo879라는네이버블로거가작성한포스트들중하나이다. PageInfo 클래스변수에저장한후각변수들을 test.txt 파일에출력한결과이다. 5. ODBC 연동 5-1. SQLAllocHandle (SQL_HANDLE_ENV,SQL_NULL_HANDLE, &henv) 모든유형의핸들을할당한다. SQLAllocConnect() 또는다른함수를호출하기전에이함수를먼저 - 12 -
호출해야한다. 이후에입력으로환경핸들을필요 로하는모든함수에 handle 값이전달된다. 5-2. SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)sql_ov_odbc3,0) 현재환경에대한 ODBC 환경설정을한다. 5-3. SQLConnect(hdbc, (SQLCHAR*)dsn_name, SQL_NTS, (SQLCHAR*)log_in_id, SQL_NTS, (SQLCHAR*)passwd, SQL_NTS) 목표데이터베이스와의연결을설정한다. 목표 SQL 데이터베이스와옵션으로권한부여이름, 인증 string을제공해야한다. 5-4. SQLExecDirect (SQLHSTMT hstmt, SQLCHAR *szsqlstr, SQLINTEGER cbsqlstr) 지정된 SQL 문을직접실행한다. 명령문은한 번만실행될수있다. 연결된데이터베이스서 버는명령문을준비할수있어야한다. SQLHSTMT hstmt 은명령문핸들로써 hstmt 와 연관된열린커서가없어야한다. SQLCHAR *szsqlstr 은 SQL 문스트링으로연결 된데이터베이스서버는명령문을준비할수 있어야한다. SQLINTEGER cbsqlstr 은 szsqlstr 인수의내용길이로길이는명령문의정확한길이또는명령문이널로종료될경우 SQL_NTS 로설정한다. - 13 -
5-5. SQLRETURN SQLFetch (SQLHSTMT hstmt); 결과집합의다음행으로커서를진행시키고 바인드된열을검색한다. 5-6. SQLGetData (SQLHSTMT hstmt, SQLSMALLINT icol, SQLSMALLINT fctype, SQLPOINTER rgbvalue, SQLINTEGER cbvaluemax, SQLINTEGER *pcbvalue) 결과집합의현재행에서단일열에대한자료를검색한다. SQLFetch() 를호출하여직접어플리케이션변수로자료를전달하는 SQLBindCol() 대신이함수를사용할수있다. SQLGetData() 를호출하기전에 SQLFetch() 를호출해야한다. 각열에대해 SQLGetData() 를호출한후에, 다음행을검색하기위해 SQLFetch() 가호출된다. SQLGetData() 는 SQLGetCol() 과같으며, 호환성을위해두함수모두지원한다. 5-7. SQLFreeStmt (SQLHSTMT hstmt, SQLSMALLINT foption) 명령문핸들에의해참조된명령문의처리를종료 5-8. SQLFreeHandle (SQLSMALLINT htype, SQLINTEGER handle) 핸들을무효화하고해제한다. - 14 -
6. DBMS 크롤러가수집한자료들이 MSSQL sever 에 저장되었는지확인 - 15 -
6. 어플리케이션 UI - 16 -
1 어플리케이션타이틀 2 검색어입력창 3 아래나열될포스트들의정렬방식선택 - favorite : 사용자가기호에맞게설정한방식대로각각의포스트에점수를부여하고, 해당점수의합이높은포스트순으로정렬 (ex. 댓글 1개당 1점 + 공감 1개당 2점 + 첨부이미지파일 1개당 1점 ) 7의 Setting 란에서설정가능 - comment : 댓글수가많은순으로정렬 - sympathy : 공감수가많은순으로정렬 4 포스트제목 5 포스트업데이트날짜 6 C : comment/ 댓글수, S : sympathy/ 공감수 7 작업선택 - Search : 자료검색 - List : 사용자가자료검색에활용하기위해선택한블로그리스트 - Setting : 3번의 favorite 설정및블로그리스트추가 / 삭제 - Exit : 프로그램종료 - 17 -
7. 개발환경가. 개발툴 Microsoft Visual Studio 2010 Microsoft SQL Server 2012 Eclipse Standard/SDK - Luna Release (4.4.0) Build id: 20140612-0600 나. PC 환경 OS : Microsoft Windows 7 버전 Service Pack 1 빌드 7601 프로세서 : Intel(R) Core(TM) i3-2100 CPU @ 3.1GHz 메모리 : 8GB 시스템 : 64비트운영체제 - 18 -
8. 팀구성및역할분담 하희진 - 웹크롤러구조설계 - 웹크롤러구현 - ODBC 연계 김태훈 - 서비스어플리케이션 UI 설계 - 서비스어플리케이션개발 공통 - 제반기술분석및이해 - 자료수집및테스트 - 보고서작성 - 19 -
9. 프로젝트추진일정 9 월 10 월 11 월 1 2 3 4 1 2 3 4 1 2 3 4 제반기술분석및이해계획서작성웹크롤러구조설계웹크롤러구현 ODBC 연계서비스어플리케이션 UI 설계서비스어플리케이션개발자료수집및테스트최종테스트및보고서작성 - 20 -
10. 참고문헌 WinInet 라이브러리 http://blog.naver.com/kgg1959/30188202655 SQL API http://publib.boulder.ibm.com/html/as400/v5r1/ic29 86/index.htm?info/cli/rzadpmst02.htm 열혈강의 Java Programming, 김승현 실전앱프로젝트 - 안드로이드지하철정보개발편 ( 장영남, 제이펍 ) - 21 -