오늘은 최근 며칠전에 보아 두었던, Twitter4J 의 API와 이를 Java에서 사용가능하도록 구현한 Twitter4J 를 분석하기로 마음 먹었다. 일단 웹에서 Twitte4J 2.0.8버전을 다운로드 받아서, Eclipse에서 환경을 만들어보았다. 다운로드 받은 파일을 압축을 풀면, Source Code와 Sample Code 그리고 Junit 코드가 있다.
Junit 코드는 Twitter4J 라이브러리의 사용법을 손쉽게 익힐수 있는 좋은 예제이다.

몇가지 테스트를 하다보니, 클라스의 메소드들의 내용을 출력해서 볼 필요가 있어서, 이를 Console에 찍어보았는데, 메소드 또는 getter를 통해서 Twitter 서버의 결과들을 가져와 그 내용을 살펴 볼수 있었다.

아래과 같이 Java Doc에 있는 문서를 뒤져서, System.out.println() 메소드를 이용하여 처음에 만들어 보았다.  
public void testSearch() throws TwitterException
 {
        Twitter tw = new Twitter();
        String queryStr = "happyzoo";
        Query query = new Query(queryStr);
        QueryResult queryResult = tw.search(query);
     
        List<Tweet> tweets = queryResult.getTweets();
        System.out.println("tweets.size: ==> " + tweets.size());
               
        for (Tweet tweet : tweets) {
         System.out.println("tweet.getText: ==> " + tweet.getText());
       System.out.println("tweet.getSource: ==> " + tweet.getSource());
                    ....    
        }
 }



위의 코드는 Junit을 이용하여 테스트용으로 만든 코드이지만, 코드의 내용을 검증하지는 않았다. 개인적으로는 TDD를 선호하지만, 갑작스럽게 확인하거나 할때는 그냥 junit에다 테스트 코드를 작성하고, 나중에 Refactoring을 한다. 새로운 Library를 익혀야 하거나 테스트 코드를 짜볼 때는 Junit로 테스트를 작성하고, 나주에 필요할 때, 다시 이를 보고, 사용법을 익히는 시간을 줄이곤 한다.

그리고, 사실 다음 단계들이 Refacoring을 하는 단계라고 생각할 수도 있다.
위의 코드가 그리 보기 않좋았다. 그래서 이를 다시 수정하였다. 나중에 코드를 작성할때 필요한 내용들을 확인할 때 재 사용이 가능할 거라고 생각하였다. (이 역시 나의 습관인데, 별도의 클래스의 작성 필요 없는 경우는 static으로 메소드를 선언하여 사용하곤 한다.)


private static void showTweet(Tweet tweet){
    StringBuffer showData = new StringBuffer();
    
    showData.append("tweet.getCreatedAt():" + tweet.getCreatedAt() + "\n");
    showData.append("tweet.getFromUser():" + tweet.getFromUser() + "\n");
    showData.append("tweet.getFromUserId():" + tweet.getFromUserId() + "\n");
    showData.append("tweet.getId():" + tweet.getId() + "\n");
    showData.append("tweet.getIsoLanguageCode():" + tweet.getIsoLanguageCode() + "\n");
    showData.append("tweet.getProfileImageUrl():" + tweet.getProfileImageUrl() + "\n");
    showData.append("tweet.getSource():" + tweet.getSource() + "\n");
    showData.append("tweet.getText():" + tweet.getText() + "\n");
    showData.append("tweet.getToUser():" + tweet.getToUser() + "\n");
    showData.append("tweet.getToUserId():" + tweet.getToUserId() + "\n");

  
    System.out.println("showData: " + showData);
 }

위 처럼 코드를 만들고 나서는, 다른 클래스에 대한 값들을 또한 확인해야 할 필요가 느껴졌다.
그런데, 위와 같은 "showData.append("... ")" 라고 일일이 쳐 주어야 하는 것이 비 생산적이라는 생각이 들어서, 자동으로 위와 같은 형태로 생성해 주면, 이를 출련한 후에 실제 코드에서 생성해서 붙여 쓰는 것이 더 생산적일 거라는 생각이 들어서, 코드를 만들어 주는 코드를 아래 처럼 짜써 넣었다.

public void createTempletCode()
 {
String[] methods = new String[]{
"getCreatedAt",
"getFromUser",
"getFromUserId",
"getId",
"getIsoLanguageCode",
"getProfileImageUrl",
"getSource",
"getText",
"getToUser",
"getToUserId"
  };
  
String str = "";
for (String method : methods) {
str += "showData.append(\"tweet." + buffer + "():\" + " + "tweet." + method + "() + \"\\n\");\n";
}
  
System.out.println(str);
 }

위의 코드는 실제 코드를 만들때의 노가다를 상단부분 없애 주었다. 물로 1~2를 위해서 쓴다면, 여기까지 만든 노력이 별로 효과가 없지만, 말이다. 하지만, 역시 단점이 있다, 메소드들을 java Doc을 뒤져서 복사해서 배열로 만들어 줘야 한다. 이 역시 적지 않은 노가다가 든다. Copy & Paste를 한다해도 메소드가 많다면, 이 역시 쉬운 작업을 아니다.

역시 한번더 개선을 해야 겠다. 일단 위의 코드를 아래처럼 별도이 메소드로 만들어 주었다.

 public static String createTempletCode(String[] methods, String instanceName)
 {
String temp = "";
for (String method : methods) {
   temp += "showData.append(\"" + instanceName + "." + method + "():\" + " + "tweet." + method + "() + \"\\n\");\n";
  }
   
  return temp ;
 }

그리고, reflection을 이용하기로 했다. 이는 junit과 AspetJ 또는 AOP에서 많이 사용되고 있고, 실제로 윈도우나 Java에서 최근들어 많이 사용되고 있는 방법이다. 그러나 사실 일반적인 개발시는 많이 이용하지 않고 있다. 그러나 나는 오는 나의 노가다를 쫑 내기 위해서, 이를 이용할 수 밖에 없었다.

"java.lang.reflect.Method"를 이용해서 내가 java Doc에서 가져오던 내용들을 한번에 가져오기로 하고 다음과 같이 수정하였다. 만약 제대로 가져오면, 위에 있는 메서드를 이용하여 쉽게 원하는 것을 출력할 수 있을 것이다.
 
public void createTempletCode()
 {
System.out.println(createTempletCode(getMethodOfClass(Tweet.class), "tweet")); 
 }

public static String createTempletCode(String[] methods, String instanceName)
 {
String temp = "";
for (String method : methods) {
 temp += "showData.append(\"" + instanceName + "." + method + "():\" + " + "tweet." + method + "() + \"\\n\");\n";
  }
   
  return temp ;
 }

public static String[] getMethodOfClass(Class clazz)
 {
  Class thisClass = clazz;
  Method[] methods = thisClass.getDeclaredMethods();
  
  String[] methodNames = new String[methods.length];
  
  for(int i =0; i < methods.length; i++ )
  {
methodNames[i] = methods[i].getName();
   
  }
  
  return methodNames;

}


코드가 많이 단순해 졌다. 처음 생각했던 내용들이 시간의 흐름사이에서, 생각도 변화하고 아이디어도 변화해서, 위와 같은 모습이 되었다.
조금 전까지도, 어차피 reflection을 적용했으니까, 생성한 코드를 바로 실행하는 로직을 만들어 넣을까도 생각했지만, 이거는 오버스펙이 될거라는 생각에 오늘은 더 이상 추가하지 않을 계획이다. 아직도 몇가지 코드들은 refectoring을 기다리고 있으니 말이다.

Twitter4J의 클래스와 메소드들은 생각보다 사용하기 쉽고, 단순하다.그리고, 이는 일본사람이 만들어서 인지 Unicode에 대한 문제도 없어 보인다.

오늘은 별다른 래퍼 클래스를 만들지 않고, 몇가지 테스트만 더하고, 내가 원하는 것을 한번 만들어 볼 생각이다.


Posted by 행복상자
애플에 어제 올라온 비교 자료인데, 한국에서 출시되면 어떤것을 살것인가에 대한 고민은 너무나 쉽게 일축시키는 표이다. 물론 구매에 필요한 돈이 된다면야, 고민할 것은 아니지만 말이다.

한국에서의 iPhone의 출시는 이제 거의 기정사실화 되는 분위기이다. 아니 오히려 마케팅 적인 측면에서는 많은 도움이 될거라 생각한다.

내가 가지고 있는 iPod Touch는 iPhone에 비해서 기능이 부족하거나, 제거되어진 채로 출시되고 있다. 물론 나름 만족하고 있지만, 아쉬운점은 항상 있기 마련이다.


과연 어떠한 것을 고를 것인가?

자세한 자료는 http://support.apple.com/kb/HT3630 를 참조하면 된다.

'공부하는 것 > iPhone Application' 카테고리의 다른 글

어떤 iPhone을 살것인가?  (2) 2009.06.24
iPhone Application Life Cycle  (0) 2009.06.01
iPhone SDK Study  (0) 2009.05.31
Posted by 행복상자
최근에 몇가지 새로운 프로그램과 디바이스들이 속속들이 발표되어 있다.
이를 기다리고 있는 사용자와 개발자들은 매우 반갑고도 기쁜 소식일 것이다. 이로 인해서 인터넷은 날마다 뜨겁게 달아오르고 있는 중인데, 재미 있는 것은 모두 다 비슷한 시기에 발표되고 있다는 것이다. 그리고 비슷한 전략들을 가지고 시장에 나오고 있는데, 모두다 내실있어 보이지는 않는다. 한편으로는 그 만큼 지키기가 힘들다는, 수성하기가 힘들다는 반증이기도 하다. 새로운 제품과 App Store를 서로 경쟁적으로 오픈하고 있으니 말이다.

많은 소프트웨어 회사들이 블르오션을 찾아서 하드웨어 회사들의 영역을 넘보고 있다. 그리고 역으로 하드웨어 회사들 역시 자신들이 그 동안 만들어 놓았던 텃밭을 지키기 위해서, 소프트웨어 회사들이 사용했던 전략을 비슷하게 가져가고 있다. 하지만 이러한 전략들이 제대로 먹히고 있다고 보지는 않는다. 그동안 하드웨어 회사들의 마케팅 전략은 기기의 단가를 낮추거나, 원가를 줄여서 이익을 극대화 하는 것이었고, 이것은 그들만의 리그에서는 통하던 전략이었다.

"S사, 돈 안되는 MP3사업 계속하는 이유"라는 제목으로 이데일리에 기사가 올라와 있는 것을 보았다.
기사 내용을 요약하면, 현재 Apple의 mp3의 시장 점유율은 50%에 육박하고, S사의 5%의 시장 점유율은 시장을 이끌기에는 아주 적다. 그러나 이 사업을 포기하지 않는 이유를 초두 효과(Primary Effect)라고 설명하고 있다. 하지만, 개인적으로는 이 의견이 반드시 맞다고 생각하지 않는다. 어떤 부분은 맞을지 모르지만, 단지 하드웨어 한가지의 우월성에서 차이가 갈리거나, 소비자들의 필요를 채우기에는 부족한 면이 많다.

iPhone의 새로운 모델이 발견될 때마다, 어떤 기능이 추가되었나보다는 애플을 추종하는 무리들에게 우리는 깜짝 깜짝 놀라게된다. 그리고 최근에 미국에서 열렸던 WWCD에서도 5000명이나 되는 개발자들이 행사에 참석하는 것을 보고 또 한번 놀란다. 과연 이만한 지지자들을 모을 만한 회사가 얼마나 될까? 

최근에 발표된 있는 S사의 Z폰과 iPhone에 대한 비교기사들을 보면서 아쉬운 점은, 두 제품의 하드웨어 플랫폼만에 대한 단순 비교가 뒤 따른다는 점이다. 하드웨어의 성능만을 비교하여 "좋다 나쁘다"를 이야기하고 있다. 과연 소비자들이 이러한 비교만을 믿고 제품을 살거라는 생각은 들지 않는다.

그리고 하드웨어의 교체기간도 생각해 볼 문제이다. 
애플을 디바이스를 플랫폼으로 생각하고 있고, 이는 소프트웨어 또는 컨텐츠를 저장하기 위한 그릇으로 생각하고 있다. 지금은 아직 시장이 성장하는 단계이므로 엄청난 수익을 안겨주지 못하지만, 시장이 성숙기에 이를 경우에는 마르지 않는 샘물처럼 애플에게 지속적은 부틀 안 겨줄 거라 예상이 된다. 
하드웨어 교체 주기를 1년으로 생각할고 혁신적은 제품을 지속적으로 시장에 출시하는 것도, 분명한 한계를 보일 것이다. 이는 PC의 예에서 경험적으로 알 수 있다. 이전에는 약 3~4년이 주기로 제품의 Life cycle이 존재하였지만, 이제는 5년~7년을 사용하고 있다. 하드웨어의 사양이 어는 수준 이상으로 좋아지면, 고객들이 이를 교체하려는 필요성이 점점 낮아지기 때문이다.

약 10년 전에는, 인터넷이 부를 가져다 줄거라고 하면서, 여러가지 이론들이 활개를 칠때 소프트웨어의 생산 비용은 0라는 이론들이 나왔고, 이 때문에 굴뚝 산업을 무시하는 경향도 있었다. 그러나 굴뚝 사업과 IT 사업도 결국은 고객에 대한 서비스이다. 그리고 이러한 서비스를 통해서, 이익을 취하는 것이다. 단순의 하나의 제품만을 파는 것이 아니라, 연속적으로 여러가지 제품을 들을 제공할 수 있는 서비스 수단을 고객에게 제공하는 순간에 결과는 판가름 날 것이다.

아마도 이제 전쟁은 시작일 것이다. 최근 iPhone의 한국 출시에 대한 많은 사람들의 관심과 결국은 출시 될거라는 여러가지 정황들이 나타나고 있다. 단지 하드웨어 스펙을 본다면, 이 보다 좋은 제품들이 경쟁적으로 나올 가능성은 현저히 많지만, 그 동안 애플이 만들어 놓은 보이지 않는 플랫폼들을 통한 경쟁은, 즉 소프트웨어적인 경쟁은 아마도 상태를 찾기가 힘들거라 생각된다.





Posted by 행복상자

영화 "터미네이터 3"가 나온지 벌써 6년이 다 되어간다. 그리고 올해 "터미네이터 4"라는 제목으로 우리앞에 새로운 모습으로 다가왔는데, 6년 전만해도, 많은 사람들이 더 이상의 시리즈는 없을 거라고 예상하였고, 실제로 주연 배우였던 "아놀드 슈왈제너거"의 캘리포니아 주지사 당선으로 더 이상의 시리즈는 많들지 않을 거라고 확신하였었다.
하지만, 6년이 지난 지금, 우리 앞에 새로운 터미네이터 시리즈로 나타난 이영화를 과연 터

미네이터 시리즈로 보아야 하느냐? 라는 질문에는 선듯 대답하기를 주저할 수 밖에 없다. 먼저 "아놀드 슈왈 제너거"가 없는 터미네이터는 허전해서, 먼가를 생각나게 만든다. 그리고, 영화의 전개는 미래인 2018년에서 벌어지게 되는게, 기존 시리즈는 "존 코너"를 지키기 위해서 현재에서 "스카이 넷"이 보넨 로봇과 싸우지만, 영화는 미래에서 "스카이 넷"이 지배하는 세상에서 인간들이 싸우기 시작하는 시점이고, "존 코너"가  저항군들을 이끌기 시작하려는 때이다. 
그렇기 때문에, 시점 상으로 보면, 전혀 다른 영화라는 생각이 들고, 만약 "터미네이터"라는 제목을 붙이지 않았다면, 다른 영화라고 생각해도 무방할 정도로 이전과는 분위기나 스토리 전개도 무척 다르다.

사실 이러한 혼란들 피하기 위해서 제작사는 TV 시리즈인 "사라 코너 연대기"를 통해서, 시간적인 공백과 미래의 "존 코너"의 행적에 대한 이해를 도우려 했다.
과연 얼마나 많은 사람들이 이러한 제작사의 의도를 파악하고, TV 시리즈를 미리 보았을지는 모르겠지만, TV시리즈를 안 본다고 해서, 영화의 재미가 반감되지 않는다.

영화는 영화 나름대로 플롯을 가지고, 고객들의 흥미를 끌어 당기고, "아놀드 슈왈제네거"가 없는 터미네이터도 존재할 수 있다는 것을 보여주고 있다. 하지만, 시나리오의 맥락을 보면, "터미네이터와는 다른 새로운 영화를 만들수 있지 않았을까?" 라는 의문이 갖게 된다. 왜냐하면 영화속에는 나름대로 잘 다듬어진 캐릭터들이 존재하기 때문이다. 특정 캐릭터에 의존하지 않고, 비슷한 비중의 주연들을 여러명을 두는 현재 영화의 특징을 그대로 살릴 수도 있었을 텐데라는 아쉬움이 있다.

영화를 끌고 오던 캐릭터 였던 "마커스"를 "존 코너"라는 비중있는 인물을 죽어야 되는 상황에서 구하기 위해서, 그리고 이를 통해서 감동을 불러오려는 의도였는지, "남의 위한 희생"이라는 이름으로 너무나도 갑작스럽게 죽는다. (사실 감동적이지는 않았다.)
사실, "마커스" 그는 영화의 스토리를 이끌었다는 점에서는 오히려 주인공 "존 코너" 보다 더 중요한 역할이었다. 

영화속의 스토리에서 이상한 점은, 2018년의 "스카이 넷"은 어떻게 "존 코너"와 존 코너의 아버지로 과거로 시간 여행을 해서, "사라 코너"를 보호해야할 임무를 받은 "카일 리스"의 존재를 알고 있는냐는 것이다. 
사실, 시간 여행을 통해서 과거로 갈 수 있는 기술이 개발되는 때는 약 20년 후의 일이기 때문이다.

영화 속의 로봇 군단과의 전투는 "트랜스 포머"이후의 영화들과 마찮가지로, 자유로운 관절 움직임이 있는 로봇들과 대형 로봇들이 영화에서 현실감 있게 표현된다.  그리고, 이러한 로봇과의 전투씬과 추격씬은 블록버스터 영화다운 스케일을 보여주고 있다.
  
"터미네이터 4"는 처음 터이네이터 시리즈를 보는 사람들이 보아도, 크게 이해하는데 어렵지 않은 오락영화이고, 부담스럽지 않은 영화이다.

 

Posted by 행복상자
최근에 너무 늦었다고 생각할지도 모르겠지만, twitter 계정을 만들고, 날마다 날마다, 친구들을 늘려가는 중이다. 그동안 몇차례 나에게 권유를 했던, 사람들이 있었지만 나이가 들어가면, 새로운 것을 받아들이는 것이 무척이나 늦는지도 모르지만, 선듯 받아들이기 어려웠다.

아직도, 네트워크 상에서 나를 드러내는데, 두려움을 느끼고 있기 때문인지도 모르지만, 구지 다른 사람의 삶을 들여다 볼 여유가 없기 때문일지도 모른다.

그러나, 이제 첫 발을 들여놓았다. 
트위터 계정을 만들고 구글 Talk에 있는 친구 목록들을 가져와서 fallow로 등록을 하였었다.
새로운 장남감을 만지듯 조심 조심 다루었는데, 사용법은 정말도 단순하였다. Micro-blog라는 측면에서 볼때, 단순히 히스토리 로그이며, 140자 이내로 글을 써야하기 때문에 특정 주제를 가지고 설명한다는 부담감은 적었다. 그리고 이러한 글과 정보 조각들이 RSS를 이용하듯이, 네트워크 상에서 퍼져 나간다는 점에서는 굉장히 독특한 매체(?)라고 생각하였다. 그리고 글자수의 제약이 있기 때문인지, 긴 URL의 주소의 경우 축약한 형태로 변환해서 전송한다는 것도 참 독특하였다.

그리고, twitter의 OpenAPI를 이용해서 만들어 놓은 twitter 클라이언트 프로그램을 권정혁 책임의 소개로 설치하였는데, 이는 Adobe의 AIR를 이용하여 만들어진 프로그램으로 twhirl 이라고 부른다.
이 프로그램은 현재 내가 설치한 시점으로 최신 버전은 0.9.2 버전이다.


이 프로그래에 대한 자세한 정보는 여기에서 찾아볼 수 있다.
설치할때 특별한 것을 뭍거나 요청하지 않는다. 단지 twitter의 계정과 비밀번호만 필요할 뿐이다.

이번 주에 이 프로그램을 설치하고, 사용중인데 다른 사람들은 별 문제가 없는데, 내 PC에서는 종종 죽는, 아니, UI가 사라지는 일이 발생한다. 다시 아이콘을 클릭하여 실행해도, UI가 화면에 나타나질 않는데, 이 경우는 프로그램 관리자에서 프로세스를 죽이고, 다시 아이콘을 클릭하면 실행된다.

twitter를 이용하면서, 느끼는것은 블로그보다 빠르고, 은근히 중독성이 강하다는 것이다. 특히 뭔가 이슈거리가 있으면, 바로 바로 글이 올라온다는 것이다. 그래서 일하면서 twitter를 띄우는 것은 주의해야 한다. ^^;;

오늘의 이슈거리는 WWCD에서 iPhone이 한국에서 출시될거라는 말이 없어서, 한국의 iPhone 대기 수요자들이 실망하고 있었는데, 갑자기 iPhone이 한국에서 출시 될지 모른다는 이야기가 다시 수면위로 떠 오르고 있다. 이를 iPhone 전도사(?)로 활동하시는 이찬진님이 수시로 확인 메시지를 올리셔서 많은 사람들이 흥분(?) 상태에 빠져들고 있는 중이다. (저도 출시되기를 간절히 바라는 사람중에 한명입니다.)

나이가 들어갈 수록 뭔가를 받아 들이는 속도가 점점 느려지고 있다.
겁이 나서라기 보다는, 새로운 것을 통해서 뭔가를 얻을 수 있을 거라는 기대감이 적어서이다.
그러나, 이 또한 선택의 문제이다.
요즈음, 내가 많이 하는 생각은 "감사하면서 열심히 살자"라는 생각인데, 그렇게 살지 못해서 밤마다 많은 후회들을 한다. 언제부터 남의 탓을 그렇게 자주하게 되었는지 모르겠지만, 자신을 성찰하는 기회도 점점 적어지는 듯하다. 스스로에게 충실하게 살았으면 한다.

트위터가 이렇게 살 수 있도록 도와줄 수 있을지는 모르겠다.
아니, 즐거운과 고민거리를 안겨 줄지도 모르겠지만, 네트워크 안에 존재하는 나도 현실의 나와 같았으면 한다. 블로그와 트위터를 통해서 만나는 사람들 중에는 인간적인 매력이 물씬 풍기는 사람들이 여럿있다. 인생의 선배로서 동종업의 종사자로서 배울수 있는 점들이 있다면, 이 역시 적극적으로 IT툴을 사용할 가치가 있다는 반증으로 삼아야 겠다.

이야기가 두서 없다. 그냥 오늘은 인생의 선배로 존경하는 분과 식사를 하고 와서, 그냥 기분 닿는 대로 글을 쓴다.

Posted by 행복상자
어제와 오늘은 스프링 프레임워크를에서 제공하는 코드를 이용하여, 몇가지를 테스트를 하였다.
Spring MVC를 이용하여, Sample코드를 작성해보았는데, 정상적으로 동작하지 않았다.
Springframework에서 제공하고 있는, MOC테스트도 정상적으로 동작하고, Controller에서 log를 찍어 보아도, 정상적으로 표시가 되는데, 꼭 View에서 값을 표시할 수 없다는 것이었다.

아래의 코드는 Controller의 코드로, 현재 시간을 String형으로 View에 전달되는 코드이다.
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String now = (new Date()).toString();
        logger.info("Returning hello view with " + now);
        System.out.println("Returning hello view with..2 " + now);
        return new ModelAndView("/WEB-INF/jsp/hello.jsp", "now", now);
    }

View(hello.jsp)의 코드는 아래와 같다. JSTL과 EL을 이용해서, Controller에서 전달한 값을 찍어주는 코드이다. 그러나 내가 원하는 값(현재 시간) 대신 "${now}" 라고 화면에 찍어준다.
<%@ include file="/WEB-INF/jsp/include.jsp" %>
<html>
  <head><title>Hello :: Spring Application</title></head>
  <body>
    <h1>Hello - Spring Application</h1>
    <p>Greetings, it is now <c:out value="${now}"/></p>
  </body>
</html>

위의 코드를 테스트 하기가 그렇게 쉽지는 않았다. 왜냐하면, JSTL의 문제일 것이라는 생각은 있었지만 어떤식으로 전달되는 값을 테스트 할지는 생각하기 쉽지 않고, 에러 메시지도 전혀 없었기 때문이다.
그래서, 값의 전달에 문제가 있을 거라 생각하고, 다음과 같은 코드를 넣어 보았다.

<%@ include file="/WEB-INF/jsp/include.jsp" %>
<html>
  <head><title>Hello :: Spring Application</title></head>
  <body>
  <%
       out.println(request.getAttribute("now"));
  %>

    <h1>Hello - Spring Application</h1>
    <p>Greetings, it is now <c:out value="${now}"/></p>
  </body>
</html>

위와 같이 했을 때, 임시로 넣어준 테스트 코드인 "request.getAttribute("new"))" 는 정상적으로 Controller에서 전달한 값들이 표시해 주었다. 이제 문제는 JSTL과 EL의 문제인데, 엄밀하게 이야기하면, JSTL의 문제는 아니고, EL의 문제인데, 건드릴 수 있는 부분은 자바 코드는 전혀없기 때문데, 결국 시스템의 설정을 건드려 주어야 한다.

그래서, googling과 이전에 사서 보곤했던 "Head first"시리즈로 나왔던 "Server & JSP"책을 찾아보았다.
결국 답을 찾았는데, 답은 web.xml의 설정이 잘못되었기 때문이다.

아래는 처음에 web.xml에 설정했던 것이다.
<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5">

위의 것을 아래과 같이 설정을 변경하였더니, EL이 정상적으로 잘 동작하였다.
<web-app version="2.4"
         xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
         http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" >

현재 Servlet versing 2.5가 최신의 것인데, 위에서는 2.4버전으로 설정한 것을 예로 보여주고 있다. 만약 2.5 버전을  사용하고 싶다면, 아래의 것을 사용하면 된다.

<web-app
  xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  id="WebApp_ID" version="2.5">


Goolge App Engine은 JSTL을 기본적으로 제공하고 있기 때문에, JSTL을 지원하기 위해서, "jstl.jar"과 "standard.jar" 파일을 Class path에 포함 시킬 필요는 없다.

위와 같이 web.xml의 설정을 변경하면, 아래와 같은 결과를 볼수가 있다.

이를 해결하기까지, 생각보다 시간이 많이 걸렸다.



Posted by 행복상자
Application은 모두 시작과 끝을 가지고 있다, Object-C를 이용하여 만들어지는 iPhone용 Application 역시 main()함수를 실행하여, 이를 관리하게 된다.

iPhone Application의 main()함수는 최소한의 작업의 실행을 위해서 사용되어 지는데, 거기에는 3가지의 작업이 순서적으로 실행된다. (아래 그림 참조)


소스 코들 보면서, 설명을 하면,
#import <UIKit/UIKit.h>
int main(int argc, char *argv[])
{
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, nil);
    [pool release];
    return retVal;
}

위의 소소 코드를 보면, main()함수에서는 먼저, "Auto Release pool"을 만들고, 그리고 "UIApplicationMain"을 호출한다. 마지막으로 "Auto Release pool"에서 할당해서 관리하던 메모리들을 해제하는 작업이 진행되고, 프로그램이 종료된다.



'공부하는 것 > iPhone Application' 카테고리의 다른 글

어떤 iPhone을 살것인가?  (2) 2009.06.24
iPhone Application Life Cycle  (0) 2009.06.01
iPhone SDK Study  (0) 2009.05.31
Posted by 행복상자