Mac(해킨토시) - 일반 pc용키보드를 mac에서 편하게 사용하기(1. 한/영키 사용하기)

Published on: 2010. 12. 23. 02:55 by louis.dev
한달동안 해킨 설치에 노력을 다했고 드디어 해킨을 거의 (??) 설치하게 이르렀습니다.

하지만 맥을 깔았다는 기쁨도 잠시, pc에서 사용하는 키보드에 익숙해 져서 그런지 전체적으로 키보드를 사용하기 불편하더군요.( 복사, 붙여넣기를 위한 단축키라던가 한/영 변환등등) 맥과 pc간의 키보드 레이아웃이 달라 많이 불편했습니다. 그래서 맥에서 일반 pc키보드를 사용할 수 없을까 찾아 보던 차에 KeyRemap4MacBook이라는 유용한 프로그램을 발견했습니다. 이 프로그램을 통해 하나씩 키보드레이아웃을 변경해 보도록 하겠습니다.

1. 일반 키보드에 있는 한/영키 사용하기


위 그림에서 아래는 맥용 키보드의 좌측 하단의 모습이고 위는 pc용 키보드 입니다. 그림처럼 control = control(mac), 윈도우키 = option, Alt = command 이면 좋겠지만, 실질적으로는 Ctrl = control(mac) , 윈도우키 = command, Alt = option 키입니다.

맥을 처음 설치하면 처음 한글과 영문으로 변경하는 방법은 command + space로 변경할수 있습니다. pc용 키보드에서는 물론 윈도우키 + space겠지요. 이렇게 한영을 변경하다 보니 윈도우에 익숙한 저로서는 불편함이 이만저만이 아니더군요. 그래서 KeyRemap4MacBook을 통해 한영키로 한/영을 변경시키도록 해보겠습니다. 

이 KeyRemap4MacBook은 단순한 역할을 해주는데 일반 키보드의 한/영 키와 command + space키를 맵핑 시켜 한/영을 누르면 그 키와 매핑 되어있는 command + space를 실행시키는 역할을 하고 있습니다.

1 ) 일단 여기 로 이동하여 해당 파일을 다운로드 받습니다.
본인에 해당하는 알맞은 버전을 선택하여 다운로드 받습니다. 저는 Snow Leopard라 위에 것을 다운받겠습니다.

2 ) 다운받은 파일을 선택하여 설치합니다.
간단하게 다운받은 파일을 더블클릭하여 설치합니다. 설치한 이후에는 재부팅 해야 함으로 다른 작업을 하시고 계셨다면 저장하신 후 재부팅 하시면 됩니다

3) 프로그램을 실행시켜 간단하게 한/영키 = command + space 키로 맵핑 합니다.
재부팅을 하시면 우측상단에 못보던 사각형 아이콘이 생긴것을 확인 할 수 있습니다. 이 네모를 클릭하면 메뉴가 나오는데 "Open KeyRemap4MacBook Preferences..."를 선택합니다.
위 그림과 같은 모양의 프로그램이 실행 되는데 메뉴중 For Korean -> Change HanEng And Hanja Key-> Toggle HanEng Key(to Command_L(R) + Space) 를 선택합니다.  이로서 한영키를 사용하기 위한 세팅은 모두 끝났습니다. 이렇게 체크 하는 것만으로도 Command + Space 와 한/영키 간의 맵핑이 형성되어 한/영키를 누르면 Command + Space를 누르는 것과 같은 효과를 얻을 수 있습니다.

아주 간단하게 맥에서 한/영 키를 사용하는 방법을 알아 보았습니다.

Oauth를 사용하여(JSP) Daum Blog API 사용하기

Published on: 2010. 9. 13. 17:10 by louis.dev

Oauth를 사용하여 Daum Blog API tutorial을 진행해 보겠습니다.
(eclipse 와 signpost library를 통해 진행해도록 하겠습니다.)

1. Oauth 준비 단계
1) Eclipse의 메뉴에서 File -> new -> Dynamic Web Project 를 선택하여 프로젝트를 생성해 줍니다.
(저는 OAuthTutorial란 이름으로 프로젝트를 생성 했습니다.)

2) OAuth를 사용하기 위한 라이브러리 들을 추가 합니다.
     - Signpost library
     - commons-codec-1.4.jar (signpost와 의존관계)
     - JDOM library (Blog API를 사용하기 위한 xml parser - build/jdom.jar 파일 추가)


<signpost-core-1.2.1.1.jar를 다운로드>

3) 다운로드 받은 라이브러리 파일들을 해당프로젝트의 WEB-INF/lib파일에 복사하여 붙여 넣기 해주세요.



4) OAuth를 사용하기 위해서는 "Consumer Key" 와 "Consumer Secret"을 발급 받아야 합니다.  컨슈머등록하기

<컨슈머 등록 창>
- 이름 : Oauth를 사용할 서비스 이름
- 설명 : Oauth를 사용할 어플리케이션에 대한 설명(간단하게 작성)
- 연동 서비스: Oauth를 통해 Blog API를 사용할 것이기 때문에 Blog에 체크해 줍니다.
- 서비스 형태 : 웹 전용으로 만들것이라면 "웹서비스" 를, 아이폰이나 안드로이드 용 같은 어플리케이션 형태라면 "모바일/데스크탑" 을 선택합니다.
- 서비스 권한 : 보통 "읽기/쓰기" 형태를 선택합니다.

- CallBack 경로 : 위에서 서비스 형태를 선택 했을때 "웹서비스" 를 선택 하셨다면 반드시 CallBack 경로를 입력해 주셔야 합니다.
                         만약 "모바일/데스크탑"을 선택하셨다면 입력하시지 않으셔도 됩니다.
                         예) http://localhost/OauthTutorial/callback.jsp
- 서비스 URL : 서비스 되고 있는 URL을 입력해 주시면 됩니다.
                      예) http://localhost/OauthTutorial/index.jsp
-서비스 정보 : 서비스에 대한 내용을 간단히 입력하시면 됩니다.


<컨슈머 등록 예>

5) "등록"을 누르시면 컨슈머 등록이 완료 되었다는 메시지가 나옵니다. "컨슈머 관리" 탭을 누르면 컨슈머 등록이 된것을 확인할 수 있습니다.


"인증정보" 탭의 "보기"를 선택하시면 발급받은 "컨슈머 토큰"과 "컨슈머 시크릿"을 확인 하실 수 있습니다.


발급받은 Key와 secret을 통하여 Oauth 인증을 사용해 보겠습니다.

6) 컨슈머 키와 컨슈머 시크릿은 인증에 자주 사용하는 내용임으로 OauthUtil 이라는 클래스를 만들어 따로 관리 하도록 하겠습니다.



다음과 같이 OauthUtil 클래스에 발급 받은 consumer key 와 consumer secret을 상수로 선언합니다.
아래의 URL들은 Oauth인증에 사용할 URL이기 때문에 이또한 Util class에 저장해 둡니다.

URL은 좌측 Oauth의 소개 메뉴에서 다음과 같이 확인 하실 수 있습니다.



2. Oauth 인증

Oauth인증은 크게 다음과 같은 단계로 이루어 집니다.

1) 컨슈머 키와 컨슈머 시크릿을 통해서 리퀘스트 토큰을 얻습니다.
2) 획득한 리퀘스트 토큰을 통해 다음 로그인 창으로 이동하여 로그인을 합니다.
3) 로그인이 완료된 후에 컨슈머 등록시에 입력하였던 callback URL로 oauth_verifier를 가지고 이동합니다.
4) 이때 callback URL에서 oauth_verifier를 획득한후 Access Token URL로 요청하면 access token과 access token secret을 받아 옵니다.

1)Consumer Key와 Consumer Secret을 통해서 request Token을 획득
① 이클립스 프로젝트의 WebContent 아래 index.jsp 를 생성합니다.
//index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@page import="oauth.signpost.signature.HmacSha1MessageSigner"%>
<%@page import="com.sun.crypto.provider.HmacSHA1"%>
<%@page import="oauth.signpost.OAuthConsumer"%>
<%@page import="oauth.signpost.basic.DefaultOAuthConsumer"%>
<%@page import="net.oauthtutorial.util.OauthUtil"%>
<%@page import="oauth.signpost.OAuthProvider"%>
<%@page import="oauth.signpost.basic.DefaultOAuthProvider"%>
<%
     OAuthConsumer consumer = new DefaultOAuthConsumer(OauthUtil._CONSUMER_KEY,
                                                       OauthUtil._CONSUMER_SECRET);
     OAuthProvider provider = new DefaultOAuthProvider (OauthUtil._REQUEST_TOKEN_URL,
                                                        OauthUtil._ACCESS_TOKEN_URL,
                                                        OauthUtil._AUTHORIZE_URL);
     
     //consumer 객체와 consumer 등록시 등록했던 callback URL을 입력	
     String oauthURL = provider.retrieveRequestToken
                                (consumer, "http://localhost/OauthTutorial/callback.jsp");
	
     //생성도니 consumer객체와 provider객체를 세션에 저장한다.
     session.setAttribute("consumer", consumer);
     session.setAttribute("provider", provider);

     //Daum login 창으로 Redirect	
     response.sendRedirect (oauthURL);
	
%>


이렇게 하면 맨 마지막 줄의 response.sendRedirect를 통해 Daum 로그인 창으로 이동하게 됩니다.

http://localhost/OauthTutorial/index.jsp로 접속하게 되면 redirect되어 다음과 같은 모습을 확인할 수 있습니다.


여기서 로그인 버튼을 누르면 로그인 창으로 이동합니다.


다음의 아디이와 비밀번호를 입력하고 로그인을 시도합니다.
로그인이 되면 다음과 같은 페이지를 보실수 있습니다.


다음과 같이 로그인이 된것을 확인 할 수있습니다. 이 페이지 상태에서 "확인"을 누르게 되면 처음에 만들었던 index.jsp의 callback URL로 페이지가 이동하게 됩니다. Callback URL로 이동할때 AccessToken을 얻기 위해서 필요한 oauth_verifier를 parameter로 전달하게 되는데 이 parameter를 받아 AccessToken과 AccessTokenSecret을 생성해 주면 됩니다.



② oauth_verifier파라이터를 받아서 AccessToken을 받을 callback.jsp를 생성합니다.
//callback.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@page import="oauth.signpost.OAuthConsumer"%>
<%@page import="oauth.signpost.OAuthProvider"%>
<%@page import="oauth.signpost.basic.DefaultOAuthConsumer"%>
<%@page import="oauth.signpost.basic.DefaultOAuthProvider"%>
<%@page import="net.oauthtutorial.util.OauthUtil"%>
<%
	//parameter로 전달된 oauth_verifier를 저장
	String oauthVerifier = request.getParameter("oauth_verifier");
	
	OAuthConsumer consumer = (DefaultOAuthConsumer)session.getAttribute("consumer");
	OAuthProvider provider = (DefaultOAuthProvider)session.getAttribute("provider");	
	
	if(oauthVerifier != null) {
		//파라미터로 전달된 oauth_verifier를 통해서 access Token을 생성합니다.
		provider.retrieveAccessToken(consumer, oauthVerifier.trim());
		
		//getToken() method로 생성된 accessToken을 가져오고, 
		//getTokenSecret() method로 accessTokenSecret을 가져와 session에 저장
		session.setAttribute("accessToken", consumer.getToken());
		session.setAttribute("accessTokenSecret", consumer.getTokenSecret());
	}
	
%>
<!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>Insert title here</title>
</head>
<body>
<a href="http://localhost/OauthTutorial/blogInfo.jsp">블로그 카테고리 가져오기</a><br/><br/>
Access Token : <%=consumer.getToken() %><br/>
Access Token Secret : <%=consumer.getTokenSecret() %>
</body>
</html>


위와 같이 AccessToken과 AccessTokenSecret을 발급 받을수 있습니다.

<실행화면>
이렇게 발급 받은 AccessToken 과 AccessTokenSecret은 인증시(로그인) 매번 바뀌지 않고 계속 일정한 값을 유지합니다.
그렇기 때문에 한번 발급 받은 AccessToken과 AccessTokenSecret을 DB에 저장하거나 프로그램 상의 상수 값으로 고정시켜 로그인 과정없이
API를 사용할 수 있습니다.

③ 발급받은 AccessToken을 사용하여 Blog API 사용하기
위의 callback.jsp에서 블로그 카테고리 가져오기를 클릭하면 블로그 API를 통해 카테고리 목록을 가져와 보겠습니다.
위의 jsp와 같은 경로로 blogInfo.jsp를 생성합니다.
<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@page import="net.oauthtutorial.vo.BlogCategoryVO"%>
<%@page import="net.oauthtutorial.util.OauthUtil"%>
<%@page import="org.jdom.input.SAXBuilder"%>
<%@page import="org.jdom.Document"%>
<%@page import="org.jdom.Element"%>
<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.net.URLConnection"%>
<%@page import="java.net.URL"%>
<%@page import="oauth.signpost.OAuthConsumer"%>
<%@page import="oauth.signpost.basic.DefaultOAuthConsumer"%>
<%@page import="java.net.HttpURLConnection"%>
<%
	OAuthConsumer consumer = new DefaultOAuthConsumer(OauthUtil._CONSUMER_KEY,           
                                                          OauthUtil._CONSUMER_SECRET);	
	//앞서 발급받아 session에 저장시킨 access token와 access token secret을 가져와
	//다른 인증 작업없이 setTokenWithSecret method를 통하여 인증처리
	consumer.setTokenWithSecret((String)session.getAttribute("accessToken"), 
                                    (String)session.getAttribute("accessTokenSecret"));
	
	//JDOM Library를 사용하여 xml parsing
	SAXBuilder builder = new SAXBuilder();
	Document doc = null;
	Element root = null;
	
	//정보를 가져올 블로그 이름
	String blogName = "블로그이름";
	
	//category 정보들을 담을 List 객체
	List<BlogCategoryVO> categories = new ArrayList<BlogCategoryVO>();

	URL url = new URL("http://apis.daum.net/blog/category/list.do?blogName=" + blogName);
	
	HttpURLConnection req = (HttpURLConnection) url.openConnection();
	req.setRequestProperty("Content-type", "text/xml; charset=UTF-8");
	
	try {
		consumer.sign(req);
	}catch (Exception e){
		e.printStackTrace();
	}
	req.connect();
	
	if( req.getResponseCode() == 200) {
		
		doc = builder.build(req.getInputStream());
		root = doc.getRootElement();
		
		@SuppressWarnings("unchecked")
		List<Element> items = root.getChild("items").getChildren("item");
		
		for(Element em : items ) {
			BlogCategoryVO categoryVO = new BlogCategoryVO();

			categoryVO.setCategoryId(Integer.parseInt(
                                                 em.getChild("categoryId").getValue()
                                                 ));
			categoryVO.setOpen(em.getChild("open").getValue());
			categoryVO.setName(em.getChild("name").getValue());
			
			categories.add(categoryVO);
		}
	}
	
%>
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
<table border="1" width="500">
	<tr>
		<td>카테고리아이디</td><td>공개</td><td>이름</td>
	</tr>
	<%for ( BlogCategoryVO bc : categories) {%>
		<tr>
			<td><%=bc.getCategoryId() %></td>
			<td><%=bc.getOpen() %></td>
			<td><%=bc.getName() %></td>
		</tr>
	<%} %>
</table>
</body>
</html>
<SPAN id=tx_marker_caret></SPAN>


위와 같은 방식으로 발급된 AccessToken 과 AccessTokenSecret을 통해서 재인증 과정없이 바로 블로그 API를 사용할 수 있습니다.
이때 블로그 API 요청시 필수 파라미터인 blogName은 자신의 블로그 주소중
http://blog.daum.net/blogName/ <- 이부분을 입력해 주면 됩니다.



이런 결과를 확인 하실수 있습니다.

이상으로 Oauth + Daum blog API를 사용해 보았습니다. 함께 업로드한 소스코드와 함께 확인하시면 더 쉽게 사용하실 수 있을 겁니다.

OauthTutorial.war