태그 : java
2008/05/16 Digester를 이용한 Naver Open API Java Client 모듈 [3]
2008/04/17 Effective Java에 대한 서평에 재미있는 댓글 [4]
Java 의 Exception 처리는 C++에서 도입되었지만 checked exception은 Java만의 독특한 특징입니다. 아시다시비, 컴파일러가 exception을 꼭 처리해라고 강요하는 것이죠. 이것은 java 이후에 설계된 언어인 C#이나 루비에도 채택되지 않았습니다. 즉 Java 이외의 다른 언어들의 Exception 처리 방식은 Java의 unchecked exception과 동일한 방식입니다.
Java의 초기에 checked Exception의 사용을 권장하던 것에 대해서 지금은 많은 반론이 제기되고 있습니다. 극단적으로 Java언어의 Checked Exception 도입 자체가 실패라고 주장하는 사람도 많습니다. Thinking in Java의 저자인 Bruce Eckel도 그 중 한 사람입니다. Spring framework의 아버지 Rod Johnson도 Checked Exception이 쓰여야 할 때도 있지만 그 것이 과도하게 선호되어 온 것은 지적하고 있습니다.
어쨓든 Exception 부분은 Java로 API 설계와 코딩를 할 때 가장 어려운 부분이라고 느껴집니다. Java 아키텍트와 개발팀의 실력을 측정하는 좋은 방법은 그들이 만든 Exception 처리 코드를 보라는 말까지 있으니까요.
Effective Java 중 Chapter 8 (Item 39~47)
Expert One-on-One J2EE Design and Development 중 Chapter 4 Design Techniques and Coding Standards for J2EE Projects, Exception Handling 부분
Barry Ruzek의 EFFECTIVE JAVA EXCEPTIONS
Jim Cushing Three Rules for Effective Exception Handling
13 Exceptional Exception Handling Techniques
Gunjan Doshi의 Best Practices for Exception Handling
Rob Walling의 Exception Handling에 관한 글 The Two Fundamental, No Frills, Square One Rules of Exception Handling
Alan Griffiths의 Exceptional Java
An Exception Handling Framework for J2EE Applications
Brian Goetz의 글: Java theory and practice: The exceptions debate
Bruce Eckel, Rod Johnson, Joshua Bloch등의 주장을 정리해 놓은 글입니다. Checked Exception이 상세한 구현을 부적절하게 노출함,불안정한 메소드 시그너처,읽기힘든 코드,Exception 삼키기,너무 많은 Exception wrapping의 문제점 있는 것을 나열하고 있습니다. unchecked exception은 Documentation이 더욱 중요하다고 강조하고 있습니다.
Rod Waldhoff의 글 : Java's checked exceptions were a mistake
Bruce Eckel의 견해(Thinking in Java의 저자): Does Java need Checked Exceptions?
Bill Venners(C#의 아키텍트)와 Bruce Eckel의 인터뷰 : The Trouble with Checked Exceptions
네이버 Open API Cafe에서 검색 API의 Java Client 모듈을 보게 되었습니다.
http://insford.tistory.com/116
위의 모듈을 참고해서 같은 역할을 하는 모듈을 다르게 구현해봤습니다.
특징은 아래와 같습니다.
(RSSDigester , Channel , Item)
open API key값은 필수값이므로 OpenApiClient클래스의 생성자의 파라미터로 받았습니다. 대신 키 값이 없이 이 객체가 생성될 수 없도록 default 생성자는 private으로 돌려놨습니다.
첨 부한 파일은 이클립스에서 Dynamic Web Project로 생성한 폴더를 압축한 것입니다. 테스트 실행 서버는 Tomcat 5.5를 사용했습니다. Eclipse WTP가 설치되어 있는 환경이면 실행이 가능합니다. 그리고 enum을 썼기에 Java5이상이어야 합니다.
Open API에 대한 자세한 사용법은 http://openapi.naver.com/index.nhn 를 참조하시면 됩니다.
전체 소스와 라이브러리 다운받기 : open-api-test.zip
package openapiclient;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;import org.apache.commons.digester.rss.Channel;
import org.apache.commons.digester.rss.RSSDigester;public class NaverSearchClient {
private static final String OPEN_API_URL = "http://openapi.naver.com/search";
private String key;
@SuppressWarnings("unused")
private NaverSearchClient(){};
public NaverSearchClient(String key){
this.key = key;
}
public Channel search(RequestParameter param) throws Exception{
RSSDigester digester = new RSSDigester();
URL requestUrl = getRequestUrl(param);
InputStream is = requestUrl.openConnection().getInputStream();
return (Channel) digester.parse(is);
}private URL getRequestUrl(RequestParameter param) throws UnsupportedEncodingException, MalformedURLException {
StringBuffer serverUrl = new StringBuffer(OPEN_API_URL);
serverUrl.append("?target=" + param.getTarget());
serverUrl.append("&key=" + key);
serverUrl.append("&start=" + param.getStart());
serverUrl.append("&display=" + param.getDisplay());
serverUrl.append("&query=" + URLEncoder.encode(param.getQuery(), "UTF-8"));
if(param.getSort()!=null) serverUrl.append("&sort=" + param.getSort());
return new URL(serverUrl.toString());
}
}
package openapiclient;
public class RequestParameter {
public enum Category{
KIN,BLOG,CAFE,DOC,WEBKR,BOOK, SHOP, ENCYC,
KRDIC, JPDIC, ENDIC, NEWS, LOCAL, VIDEO,IMAGE;
public String toString(){
return super.toString().toLowerCase();
}
}private Category target;
private String sort;
private int start;
private int display;
private String query;// getter and setters 생략
}
JSTL을 함께 사용해서 찍어본 예제입니다. http://openapi.naver.com/index.nhn 에 가셔서 API key를 발급 받으시고 소스 중간에 밑줄로 표시된 부분에 그 값을 넣으시고 돌려주시면 됩니다.
<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="openapiclient.RequestParameter" %>
<%@ page import="openapiclient.NaverSearchClient" %>
<%@ page import="org.apache.commons.digester.rss.Channel" %>
<%
String KEY = "????"; // Open API key값을 넣으세요
NaverSearchClient client = new NaverSearchClient(KEY);
RequestParameter param = new RequestParameter();
param.setDisplay(10);
param.setStart(1);
param.setQuery("미역국");
param.setTarget(RequestParameter.Category.NEWS);
Channel result = client.search(param);
result.render(System.out); // 콘솔에 받아온 내용을 확인삼아 찍어봄
request.setAttribute("result", result);
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Naver Open API를 이용한 검색</title>
</head>
<body>
<c:forEach var='item' items='${result.items}'>
<p>
<a href="${item.link}"> ${item.title} </a> <br/>
${item.description}
</p>
</c:forEach>
</body>
</html>
# by | 2008/05/16 17:22 | 코드,그냥 재미로 | 트랙백 | 덧글(3)
# by | 2008/04/17 12:32 | 개발 이야기 | 트랙백 | 덧글(4)
◀ 이전 페이지 다음 페이지 ▶