[2012 / 개인과제]

객체지향 프로그래밍 과제 - 백과사전



2012년 9월부터 12월까지 객체지향 프로그래밍 강의를 들으면서 한달동안 네이버 오픈API를 이용해 간단한 백과사전 프로그램을 만들었다.

당시 오픈API와 XML파싱이란걸 처음 해보았는데 재밌어서 이후에도 트위터 검색 결과를 파싱해보면서 놀았던 기억이 있다..


이때는 XML파서를 몰라서 파싱을 손수 다 받아와서 태그로 자르고 분류해서 파싱하였다..



public void search(String s)
{
String ggg="";
try {
String a=String.format(defaultUrl + "?key=%s&query=%s&target=encyc&start=1&display=10",
mykeycode,URLEncoder.encode(s, "UTF-8"));
URL u=new URL(a);
BufferedInputStream b=new BufferedInputStream(u.openStream());
while(true)
{
int d=b.read();
if(d==-1) break;
ggg+=(char)d;
}
b.close();
DefaultTableModel tm = (DefaultTableModel) jt_o.getModel();
tm.setRowCount(0);
String ss[] = ggg.split("[<>]");
String title = "", des = "", link = "";
for (int i = 0; i < ss.length; i++)
{
if (ss[i].equals("title"))
{
title = kordecode(ss[i + 1].replaceAll("&lt;b&gt;", "").replaceAll("&lt;/b&gt;", "").replace("&amp;amp;", ""));
}
if (ss[i].equals("link"))
{
link = kordecode(ss[i + 1]);
}
if (ss[i].equals("description"))
{
des = kordecode(ss[i + 1].replaceAll("&lt;b&gt;", "").replaceAll("&lt;/b&gt;", "").replaceAll("&amp;quot;", "").replace("&amp;amp;", "").replace("&amp;gt;", "").replace("&amp;lt;", ""));
}
if (ss[i].equals("/description"))
{
if (!title.startsWith("Naver"))
{
tm.addRow(new Object[] { link, title, des });
}
}
}
record.Rec(jtf_s.getText(), "data.txt");
} catch (Exception e) {
e.printStackTrace();
}

}


이렇게 사용자가 입력한 검색어를 받아와 검색API에 넣어주고 그 결과를 문자 하나하나 받아와(...) String으로 저장하였다. 그리고 태그로 잘라서 내가 원하는 태그가 나왔을 경우

해당 값을 DefaultTableModel에 추가하여 결과 리스트를 만들었다.

여기서 결과는 한글로 잘 나오는데 자바 프로그램에서는 한글이 깨지는 문제가 발생하여 URLEncode, Decode 등.. 여러가지를 해보다가 


public static String kordecode(String kor) {
try {
if (kor != null)
kor = new String(kor.getBytes("8859_1"), "UTF-8");
return kor;
} catch (Exception ex) {
}
return kor;
}


웹에서 기본적으로 쓰는 ISO8859-1을 UTF-8로 변환시켜 한글깨짐 현상을 해결하였다.

그리고 실시간 급상승 키워드도 보여주도록 하여 그 키워드로 바로 검색할 수 있도록 하였다.


여기까지 개발을 하고 JFrame의 UI를 만지고 있다가 아주 중요한 사실을 알았다.

검색 결과로는 백과사전의 내용 모두가 오는 것이 아니라 일부만 오고 대신 전체 내용이 담긴 URL이 같이 온다는 사실! 일부 내용만 보여준다면 백과사전이라고 할 수 없다. URL의 내용을 표시해주던지 그 페이지로 이동을 시켜주어야만 했다. 해당 내용을 다시 파싱해도 됐지만 똑같은 일의 반복이기 때문에 하이퍼링크를 걸어보기로 했다.


public static void executeCmd(String[] cmd) {
Process process = null;
try {
process = new ProcessBuilder(cmd).start();
SequenceInputStream seqIn = new SequenceInputStream(process.getInputStream(), process.getErrorStream());
Scanner s = new Scanner(seqIn);

while (s.hasNextLine() == true) {
System.out.println(s.nextLine());
}

} catch (IOException e) {
e.printStackTrace();
}
}
public static String[] getUrlCmd(String url) throws Exception {

String[] cmd = null;
if (System.getProperty("os.name").indexOf("Windows") > -1) {
cmd = new String[] { "rundll32", "url.dll", "FileProtocolHandler",url };
} else {
String[] browsers = { "firefox", "mozilla", "konqueror","eqiphany", "netscape" };
String browser = "";
try {
for (int i = 0; i < browsers.length && "".equals(browser); i++) {
if (new ProcessBuilder(
new String[] { "which", browsers[i] }).start().waitFor() == 0) {
browser = browsers[i];
}
}
if ("".equals(browser)) {
throw new Exception("Could not find web browser");
} else {
cmd = new String[] { browser, url };
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return cmd;
}


먼저 설치된 브라우저를 찾고 해당 URL을 이용해서 프로세스 객체를 이용하면 브라우저가 실행되면서 URL로 이동한다.

당시에는 이해를 잘 못하고 사용하였지만 정확한 동작 원리를 다시 찾아봐야겠다.


그외에는 파일 I/O로 검색 기록과 메모 기능을 만들었다. 주요 기능은 아니어서 소스만 첨부한다.


Memo.java

Record.java

Search.java

UpKeyword.java




처음으로 목적을 가진 프로그램을 만들어보아서 의미가 나름대로 컸고 API사용법과 파싱이라는 재밌는 개념을 알게 해준 과제로 생각을 넓게 해준 경험이었다.

그때 이런 것들을 많이 만들어보고 경험했다면 하는 아쉬움이 남고 API나 외부소스를 사용할 때 정확한 이해를 바탕으로 사용한다면 더 좋은 코딩을 할 수 있었을 텐데 그러지 못한게 아쉽다. 지금부터라도 실천을 해야겠다.

+ Recent posts