6월, 2011의 게시물 표시

Android에서 Httpclient와 WebView간 HttpSession 공유

요즘은 Mobile Application를 Hybrid Type으로 개발하는 것이 대세인 것 같습니다. App과 Web의 이동을 원활하게 하기 위해서 HttpSession를 사용하는 경우가 있습니다.
이 번 글에서는 Android에서 Httpclient와 WebView간 Session(사실은 Cookie)를 공유(사실은 Copy)하는 방법을 알아보겠습니다.

Example Case기존 사용 중이던 Web Site을 최소한의 개발로 Mobile로 이식하길 원한다.Web Site는 사용자 인증를 거치게 되면 사용자 인증 정보를 HttpSession에 저장하게 되어 있다.사용자 인증 부분은 Mobile App으로 개발한다. 사용자 인증을 위해 Login RESTful API을 신규로 개발한다. 그 외 화면은 Web Site 기존 Web Application을 최대한 활용하여 Mobile Web Application을 만든다.
Mobile App에서 사용자인증은 Httpclient이용하여  진행되고,  Mobile Web은 WebView내에서 호출된다. 이 두가지 는 동일한 App에 있지만 마치 한 PC 두 개의 Browser 처럼 Cookie을 공유하지 못하지만 Cookie을 Copy 해주면 해결 됩니다.

Cookie Copy

HttpResponse response = httpclient.execute(httppost);

List<Cookie> cookies = httpclient.getCookieStore().getCookies();
if (!HMGWServiceHelper.cookies.isEmpty()) {

CookieSyncManager.createInstance(LoginActivity.this);
CookieManager cookieManager = CookieManager.getInstance();

Cookie sessionInfo = null;
for (Cookie cookie : cookies ) {
sessionInfo = cookie;
String cooki…

RESTful Web Service 쉽게 만들기

이미지
많은 Java 개발자들이 RESTful Web Service을 배우는데 흥미를 가지고 있습니다. 하지만 많은 튜토리얼들이 과도하게 복잡하기만 합니다.
본 글에서는 JDK와 간단한 Notepad같은 Text Editor만 가지고 RESTful Web Service을 개발하는 방법을 설명합니다. 마지막에 배포를 위해서 Tomcat 7는 설치합니다.

모두가 다 아는 이야기를 약간 하고 넘어가겠습니다. RESTful Web Service는 HTTP Protocol 상에서 서비스되게 디자인되어 있습니다. 가장 큰 특징은 HTTP Protocol의 4가지 Method인 “PUT”, “GET”, “POST”, “DELETE”가 Data을 조작하기 위한 Create, Read, Update, Delete에 Match되게 디자인 되어있다는 것입니다.

RESTful Web Service API을 개발할 때는 재일 먼저 API을 URL+Method로 정확히 정의하고 시작해야 합니다. 여기서 다룰 아주 간단한 API라도 말입니다.

“Hello world”  Webservice → “http://localhost:8080/restful/resources/helloworld”, GET
http://localhost:8080: Tomcat 7 WASresetful: 배포될 WAR 명에 따라 변경 됨resources: web.xml에 등록된 RESTful 지원 Servlet URL patternAPI 별로 정의해야할 것은 “helloworld”, “GET” 이 두가지 입니다.

JSR-311 Reference 구현 라이브러리: Jersey(http://jersey.java.net)
RESTful Web Service는 JSR-311로 Spec이 발표되었고 이를 구현한 많은 구현 라이브러리가 있습니다. 여기서는 Jersey을 사용하도록 하겠습니다. 이 글을 쓰고 있는 현재 Jersey 버전은 1.7입니다.(JSR-311 버전 1.1을 구현한 라이브러리를 사용합니다.)

jersey을 받고 아래 jar 파일…

당신의 개발팀에 동기부여하는 5가지 방법

Five ways to motivate your development team

1. Give your developers the resources they need.
월급 천만원 받는 개발자를 고용하면서 486 수준의 하드웨어에서 일하게 하는가? 대부분의 개발자들은 하드웨어지원이 충분하다면 소프트웨어 지원이 느린것 쯤은 불평하지 않습니다.

2. Recognize a job well done.
칭찬은 기적을 동반합니다. 자부심은 동기부여에 요소가 됩니다. Milestone이 히트를 치거나 사용자가 만족한다면 개발팀은 그에 대해 인식하고 자부심을 가져야 합니다.

3. Get rid of dead wood
팀 내부에서 누군가 생산적이지 않다면 그들을 제거해야 합니다. 긴 프로젝트에서  얼마나 빠른 생산성을 가지느냐는 그들에 의해서 결정됩니다.

4. Push for new software release.
개발자들은 7년전의 Java 버전이 아닌, Java 7으로 개발하고 싶어 합니다. 새로운걸 배우고, 새로운 지식을 적용하는 것은 개발자에게 자주 동기부여을 해줍니다. 이전 소프트웨어를 사용하는 것은 그들에게 녹슬어가는 느낌을 줍니다. 항상 최신 버전을 사용하는 것은 위험요소를 내포하고 있지만, 이것은 최고의 도구와 기술을 얻기 위한 도전이라 생각해야 합니다.

5. Let developers develop
의사소통이 의사소통 이상의 되면 안됩니다. 프로젝트 매니저가 하찮은 것 까지 개발자를 스케줄링 할 필요가 없습니다. 지나친 Communication은 좋지 못합니다.

Easy java Persistence

EJP(Ease Java Persistence)는 관계형 데이터베이스 사용을 쉽게해주는 강력한 Java API 입니다.
EJP는 Mapping Annotation이나 XML Configuration이 필요 없으며, 특정 클래스를 상속 받거나 인터페이스를 구현할 필요가 없습니다.

하지만 “Automatic O-R Mapping” 이 부분을 생각 해보니 문제가 있을 수 있겠습니다.
EJP에서는 ORM(O-R Mapping)를 위해 Class명과 Table 명 사이, Method 명과 Tablet Column명 사이에 규칙을 지쳐야 하는데 Object의 “name”은 DB에서 “.*name.* 형태이어야 한다는 것 입니다. 그 외 Lazy Object Loading, 상속 관계에 있는 Object Query 등의 지원은 아쉽습니다.

한 가지 명심해야 할 것은 EJP는 JDBC 기반으로 만들어 졌으며,  JPA 구현 라이브러리가 아니며,  둘 사이는 아무런 관계가 없다는 것입니다.

지원하는 DatabasesMySQLDB2OracleDerbyHSQLPostgreSQLH2

간단한 사용법

Database Connecting
dbm = new DatabaseManager("mydb", 5, "com.mysql.jdbc.Driver", "jdbc:mysql://localhost/mydb");

또는

dbm = new DatabaseManager("mydb", 5, "jndiPath");

POJO Class “Customer” 정의

public class Customer
 {
   String username;
   String firstName;
   List support;     //association
   List orders;      //association
   ...
   // getters/setters
   ...
 }

web.xml 이 더이상 필요 없는 Spring 3.1 Web MVC

최근에 Spring Framework 3.1 M2가 Release 되었습니다.여기에는 M1에서 시작한 기능과 몇몇 기능의 구현이 완료 되었고 현재 RC 단계에 있습니다.
그 중에 눈에 띄는 기능이 web.xml 없는 Spring MVC 입니다. 이 것은 이미 Servlet 3.0 스팩에서 web.xml 없이 Webapplication을 배포할수 있게 정의 되어 있어 가능해졌습니다. 작성한 Servlet에 "@WebServlet" Annotation을 정의하면 되는 것입니다.
Spring 3.1 이전 버전에서는 DispatcherServlet을 web.xml에 필히 등록해주어야 하지만 3.1 부터는 WebApplicationInitializer라는게 알아서 한다고 합니다.

Alvor - SQL checker for Java

이미지
Java Program에서 SQL 문장은 보통 문자열로 표현됩니다.  SQL 문장의 오류는 컴파일에서 걸러지지 못하고 Runtime 시에 확인 할 수 있습니다. 게다가 SQL 문장이 조건에 의해 조합 된다면 Client site에서 실행되고 나서야 버그가 발생될 가능성도 있습니다.
Alvor(알보르)는 Eclipse JDT plug-in 으로 컴파일 때 SQL 문장의 오류를 Check해 주는 Open source Project 입니다.
아직은 BETA 버전이지만 앞으로 기대가 되는 프로젝트입니다.

설치 환경
Elipse 3.5 ~ 3.7Elipse update-site: http://updates.alvor.googlecode.com/hg/

사용 예
Alvor는 아래와 같은 SQL 문장에서 두 가지 오류를 Check 하게 됩니다.
persons 과 where 사이의 공백이 없음.“first_naem” 문장이 틀림.



관련 사이트
http://code.google.com/p/alvor/

대용량, 클라우드 서버 환경에서 DBMS가 고민해야할 문제

facebook으로 대표되는 Social Network Service는 정보가 만들어지고 쌓이는 속도를 몇배 증가 시켰다. 빠르게 쌓이고 변화하는 정보에 능동적으로 대처하기 위해 클라우드 컴퓨팅이 뒤늦게 주목 받는다.
최근의 변화는 어느날 갑자기 불어온 것이 아니라 차근차근 쌓이던 눈이 무너져 내린 것이다. 하지만 수십년 간에 데이터 처리의 중추적 역할을 담당해온 DBMS는 변화를 못 쫓아갔다.
...

차세대 DBMS의 고민

대용량 데이터잦은 장애서비스 작성의 편의성기능적 요구 사항수평적 확장병렬 처리짧은 장애 복구 시간SQL 지원Multi-row Transaction 지원
Download

Android Inter-App Communication

이번 튜토리얼에서는 두 개의 Process 사이에서  하나가 다른 Process의 Service을 호출하는 방법에 대하여 설명하고 있습니다.

본 문서에서는 다음 내용을 다룹니다.
Invocation Handler을 작성하는 방법Remote Service을 Bind 하는 방법Invocation을 호출한 Process에게 Value Return 하는 방법

Step 1: Create the Service
Invocation될 Service을 만듭니다. Service에는반드시 IBinder 객체를 Return하는 onBind Method을 Override해야 합니다.
Service에서는 Messenger 컴포넌트를 사용합니다. 이 Messenger 컴포넌트는 내부 Process 간 Communication 이 가능하게 해줍니다.
public class RemoteService extends Service
{
private Messenger messenger; //receives remote invocations

@Override
public IBinder onBind(Intent intent)
{
if(this.messenger == null)
{
synchronized(RemoteService.class)
{
if(this.messenger == null)
{
this.messenger = new Messenger(new IncomingHandler());
}