스프링에 예전부터 관심만 계속 가져왔었는데, 스프링에 대한 국비지원 무료강의가 있다고 해서 신청했습니다. 박찬욱님 블로그를 구독하고 있었는데, 강의를 모집한다는 글을 보자마자 신청^^

예전에 KSUG 세미나할 때 참석했을 때 박찬욱님이 JDBC강의를 했던 것으로 기억합니다.
http://mudchobo.tomeii.com/tt/342
그 당시에 jdbc templete을 만드는 것이 였는데, 화면이 휙휙 지나가! 이런 느낌을 받았는데요. 무슨무슨 패턴들이 나오면서 막 지나가면서 이해를 못했던 강의를 들었던 것 같습니다.
정말 다행인 것은 이번 스프링강의 때 이와 비슷한 내용을 한다는 것! 저도 꼭 만들어보고 싶었거든요-_- 아직 디자인 패턴도 잘 모르고 해서-_- 이번 기회에 디자인패턴을 좀 공부해야겠습니다.
이야기는 삼천포로 빠졌군요.

어쨌든, 첫시간인데요. 사실 전 java쪽 일을 하고 있지 않은데요-_- 그래도 Spring에 대한 기본적인 과정에 대해서 꼭 배우고 싶었습니다(미래는 어떻게 될지 모르니까요!)
이날 강의에서 배운것들^^

1. JUnit
우선 개발할 때 거의 안 쓰는 JUnit을 배웠는데, 이거 정말 유용하군요. 예전에는 JUnit같은 것 귀찮게 왜하지 그랬는데, 오늘 하는 것 보니까 이유가 있네요-_- 테스트를 작성해놓고, 나중에 리팩토링을 해도 제대로 돌아가는지 확인을 할 때 매우 유용하군요. 젠장 난 헛살았어.....

2. 초보자들이 IoC / DI 이해하기에 만족할만한 예제
저같은 허접도 이해할 수 있도록 쉬운 예제와 쉬운 설명으로 강의를 해주셨습니다. 이 피자스토어 예제는 제가 예전에 Head First Design Patterns 팩토리패턴에서 본 예제와 비슷하네요. 그걸 스프링에 맞게 수정하셨어요^^ 후....디자인패턴 공부해야겠다.......-_-

3. 그 외에 여러 팁
역시 단축키를 써야해요. 그래야 누가 뒤에서 코딩하는 것을 지켜볼 때 자랑할 수 있어요............

저랑 갑으로 알고 있는데, 강의를 너무 잘하심^^ 저도 분발해야겠습니다-_- 덕분에 스프링에 대해서 조금 더 다가가는 계기가 되었네요.
 
Posted by 머드초보

댓글을 달아 주세요

  1. BlogIcon 찬욱 2009.08.25 22:41  댓글주소  수정/삭제  댓글쓰기

    안녕하세요. 맨뒤에서 강의 들으시던 분(실명은 알지만^^;) 맞으시죠?
    머드초보님이란 걸 전 알고 있었어요..
    그때 휘리릭 지나갔던 얘기가 돌아오는 두 번째 날에 하게 되니, 기대해주세요..

    ps.갑이라고 말씀하셔서..제가 갑(을, 병 할때..)인 줄알고 한참 고민했습니다.

    • 머드초보 2009.08.27 10:58  댓글주소  수정/삭제

      헉 제가 맨뒤에 앉은걸 아셨군요 ㅠㅠ
      강의는 정말 재미있고, 지루하지 않게 잘하시는것같아요^^ 좋아요!

      PS. 음...직업병이군요-_- 동갑의 갑입니다^^

 
처음엔 자바만 지원을 하더니 이제 미친듯이 다른 언어도 지원을 하기 시작했습니다. 어느덧 버전은 이클립스의 두배(?)가량인 6.7버전이 나왔군요-_- 아래는 릴리즈정보입니다.
http://www.netbeans.org/community/releases/67/

5.5부터 저는 써왔는데요. 버전업을 할 때 마다 처음시작 로딩 시 뜨는 이미지가 매번 바뀝니다. 더욱 화려해집니다. 나중에 10버전 나오면 완전 다빈치가 그린 그림 나올듯-_-

사용자 삽입 이미지
아 그리고, 6.7버전부터 한글을 지원하기 시작했습니다. 한글판이 존재합니다. 다운로드할 때 IDE Language부분은 Korean으로 바꾸면 한글판을 사용할 수 있습니다. 신기한 것은 한글판이 용량이 더 작다는거-_-왜그럴까.....-_-
근데, 완벽한 한글이 아닙니다. 넷빈카페에서 시작한 것으로 알고 있는데, 어찌된 것인지 모르겠습니다. 어쨌든 한글판은 반쪽자리 한글판입니다.
사용자 삽입 이미지

약간(?) 덜 된 한글화-_-

릴리즈 노트에 있는 Feature Highlights를 좀 보면...

1. Kenai와 연동
Kenai은 저번에 포스팅에 올린 오픈소스저장소 호스팅입니다. 이것과 연동할 수 있는 기능이 있습니다.
http://mudchobo.tomeii.com/tt/423

2. Maven
메이븐은 제가 잘 몰라서 모르겠는데, 예전에 얼핏듣기로는 java에서 프로젝트관리를 하면서 필요한 lib나 그런것을 손쉽게 업데이트를 해주고, 손쉽게 서버에 배포까지 해주는 그런 것이라고 하더군요. ANT보다 향상된 뭐 그런건가봐요. 암튼, 그것과 연동지원을 하는 듯

3. php
제일 맘에 드는 기능입니다. php툴을 찾고 있었는데, aptana보단 왠지 넷빈즈가 더 끌려요-_- 코드하이라이트는 저번버전부터 제공했었고, 이번엔 SQL문도 코드하이라이트를 지원을 합니다. 강력해요!

그 외에는 다 제공했었는데, 기능향상이 좀 있었군요. 사이트가서 직접 확인해보시길 ㅠㅠ

PS. 근데, JavaFX는 왜 빠졌을까요....뭔가 마이그레이션 하다가 잘 안된 것 같음 ㄷㄷ JavaFX를 하려면 그 이전버전인 6.5.1을 받아야합니다. 6.7은 안됩니다.


 
Posted by 머드초보

댓글을 달아 주세요

 
Sun에서 대단한 것을 준비했네요(근데, 오라클이 먹어버리다니-_-) 무료로 SVN+Trac서비스로 유명한 assembla보다 훨씬좋습니다. 아래는 이전에 썼던 assembla소개글^^

[유틸리티] 무료로 SVN + TRAC 개발공간 제공해주는 사이트.


Project Kenai는......음 우선 Kenai는 어떻게 읽는거지....케나이라고 읽는건가.....아....여기서 제공하는 ScreenCast를 보니 키나이라고 발음을 하네요. 키나이가 맞는듯-_-
암튼 Project Kenai는 소스코드관리, 이슈트래킹, 위키, 포럼 등을 지원을 합니다(프로젝트 단위로^^)

assembla랑 비교하면 assembla는 온니 SVN만 되고, Project Kenai는 다양한 소스코드관리시스템을 지원을 합니다. 보니까 Subversion, Mercurial, Git를 지원하네요(외부에 있는 것도 가져올 수 있는 External도 있는 듯 합니다).
또한 assembla는 Trac과 자체적 Ticket시스템을 이슈관리시스템으로 사용하고 있는데, Project Kenai는 Bugzilla와 Jira를 지원하더군요.

음...단점은 프로젝트를 5개밖에 못만드는데요. 테스트하느라고 2개날렸습니다 젠장....

암튼, 테스트를 해봅시다.
이 Kenai는 NetBeans하고 쉽게 연동할 수 있습니다. 이클립스에 비하면 Mylyn같은 것이 NetBeans에 통째로 들어있습니다. 아...넷빈즈는 6.7 RC1이상에서만 됩니다. 곧 있으면 넷빈즈6.7나옴 ㄷㄷ 지금은 RC3버전! 이클립스3.5출시시기와 비슷하게 출시하겠군요^^ 둘다 참 매력적인 IDE죠^^ (얘기가 샜군-_-)

그럼 NetBeans 6.7 RC3버전을 설치해봅시다.
메뉴에 Team -> Kenai - > Login to Kenai를 합니다. 아.....-_- 가입을 먼저 해야합니다-_-
http://kenai.com/ 이곳에서 가입을 하면 됩니다.
가입한 뒤 로그인을 합니다. 로그인하면 넷빈즈에 Kenai탭에서 자신의 프로젝트를 볼 수 있습니다. 회원가입 후 처음로그인이라면 아무것도 없죠^^ 아무 프로젝트를 생성 후 Kenai에 올려봅시다.
File -> New Project -> Java -> Java Application선택, Project이름은 PrintFucking으로 해봅시다. 프로젝트가 생성이 되었으면 프로젝트 이름에 대고, 마우스오른쪽버튼을 누르면 Share on Kenai라는 게 있습니다.
프로젝트 이름 및 설명 등을 입력할 수 있어요. 그리고, Project License를 꼭 입력해야 해요. 익숙한 라이센스들이지만, 다 뭐가 틀린지는 모르겠네요-_-
사용자 삽입 이미지

라이센스를 정하면 finish를 할 수 있어요. 그리고 Kenai탭에서 보면 프로젝트에 대해서 Kenai와 연동해서 작업을 할 수 있는 메뉴가 보입니다. 이슈를 찾을 수 있고, 이슈를 여기서 직접 생성할 수 있어요. 자신에게 할당된 이슈도 볼 수 있구요^^ wiki도 볼 수 있네요^^ (아....젠장.....3번째꺼 이름을 Fucking을 해버리다니.....)
사용자 삽입 이미지
소스코드를 고쳐서 커밋해볼까요?
[code]System.out.println("Fuck!");[/code]를 main함수에 추가하고 커밋을 해봅시다.
커밋은 프로젝트메뉴 -> Subversion -> Commit을 선택하면 됩니다.
사용자 삽입 이미지
Project Kenai웹페이지에서 해당 프로젝트가 커밋되었는지 확인할 수 있어요.
안타까운 점은 한글이 깨지네요-_-
사용자 삽입 이미지
어쨌든, 매우 쉽게 오픈소스프로젝트 개발환경을 구축할 수 있게 해준 Kenai에 찬사를 보내야겠네요. 게다가 넷빈즈는 Java뿐만 아니라 다양한 언어 개발환경을 제공하거든요. C/C++, PHP, Python, Ruby, JavaFX 등! 더욱 활용도가 높아졌으면 좋겠네요. 국내에서는 대세가 이클립스여서 이클립스를 많이 쓰는 듯 한데, 넷빈즈도 그에 못지않은 기능을 가지고 있어요^^ 6.7나오면 사용해보도록 하세요 ^^

 
Posted by 머드초보

댓글을 달아 주세요

  1. nobae 2009.08.20 18:19  댓글주소  수정/삭제  댓글쓰기

    넷빈즈 + jvi 사용중입니다. 5.5때부터...ㅎㅎ
    가끔 이클립스 유혹을 느끼지만 통합화된 기능과 jvi 때문에 갈아타지를 못하겠더군여.

    • 머드초보 2009.08.23 19:24  댓글주소  수정/삭제

      와 넷빈즈를 쓰시는 분이군요^^ 반갑습니다^^
      jvi은 뭔가요?-_- 모르겠군요 ^^
      어쨌든, 넷빈즈의 통합된 기능은 저도 정말 맘에 들어요 ^^
      전 이것저것 다 해보는 걸 좋아해서 저한테 맞는 IDE임^^

 
오픈API 등을 이용하려면 XML을 파싱해서 JavaFX로 가져와야 합니다.
HttpRequest를 이용해서 xml을 요청한 다음에 PullParser를 이용해 한줄한줄 파싱해서 데이터로 가져오는 방식을 사용합니다.

음...JavaFX가 1.2로 업데이트 되었는데요. 기존에 HttpRequest에서 요청할 때 enqueue()라는 함수로 실행을 했는데, start()로 함수명이 바뀌었네요. start()가 깔끔하군요.

간단하게 네이버OpenAPI를 파싱해보겠습니다.
실시간 급상승 검색어를 간단히 뿌려주는 소스입니다.
사용자 삽입 이미지

main.fx
[code]package xmlparser;

import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.text.Text;
import javafx.scene.text.Font;

var rankingInfo:RankingInfo = RankingInfo{
    onDone: function() {
        var content:String = "";
        for (item in rankingInfo.ranking) {
            content += "{item}\n";
        }
        text.content = content;
    }
};

var text:Text = Text {
    font: Font {
        size: 16
    }
    x: 10
    y: 30
}

Stage {
    title: "Application title"
    width: 250
    height: 300
    scene: Scene {
        content: text
    }
}[/code]
RankingInfo.fx
[code]package xmlparser;

import javafx.data.pull.PullParser;
import javafx.io.http.HttpRequest;
import java.lang.Exception;

public class RankingInfo {
    var url:String = "http://openapi.naver.com/search?key=네이버OpenAPI키&target=rank&query=nexearch";
    var p:PullParser;
    var h:HttpRequest;
    public var ranking:String[];
    public var onDone:function() = null;
   
    init {
        ranking = [];
        h = HttpRequest {
            location: url
            onException: function(exception:Exception) {
                exception.printStackTrace();
            }
            onInput: function(input) {
                var i;
                p = PullParser {
                    documentType: PullParser.XML
                    input: input
                    onEvent: function(event) {
                        if (event.type == PullParser.START_DOCUMENT) {
                            ranking = [];
                            i = 0;
                        }
                        else if (event.type == PullParser.END_ELEMENT
                            and event.level == 3) {
                           if (event.qname.name == "K") {
                               println("{event.text}");
                               ranking[i] = event.text;
                               i++;
                           }
                        }
                        else if (event.type == PullParser.END_DOCUMENT) {
                            onDone();
                        }
                    }
                }
                p.parse();
                p.input.close();
            }
        }
        h.start();
    }
}
[/code]
PullParser와 HttpRequest를 이용합니다. HttpRequest를 이용해서 url을 지정해서 가져오면 onInput이 발생합니다. 여기에서 input을 PullParser에 지정을 해주면 한줄씩 읽을 때마다 onEvent가 발생하게 됩니다.
onEvent에서는 한줄씩 읽으면서 Parsing을 해주면 됩니다.
해당 엘리먼트를 가져오기위해선 문서의 레벨과 태그의 이름으로 알 수 있습니다.
[code]<result>
<item>
<R1>
<K>투시안경</K>
<S>+</S>
<V>105</V>
</R1>
</item>
</result>[/code]
위와 같은 xml이라면 <K>값을 가져오기 위해서는 K의 레벨과 K를 알면 됩니다. K레벨은 result를 0, item을 1, R1을 2, K는 3이 됩니다.
[code]if (event.type == PullParser.END_ELEMENT and event.level == 3) {
if (event.qname.name == "K") {
    println("{event.text}");
}[/code]
3이고, qname.name이 K인걸 찾으면 돼요. END_ELEMENT에서 해야하는 이유는 START_ELEMENT에서하면 값이 아직 파싱이 안된 상태여서 그렇습니다-_-

JSON인 경우도 비슷해요.
단지 Pullparser.START_ELEMENT나 END_ELEMENT가 아닌, END_VALUE로 파악을 하면 됩니다.
documentType: PullParser.JSON으로 바꿔주셔야 해요.
 
Posted by 머드초보

댓글을 달아 주세요

  1. 질문자 2011.01.17 16:01  댓글주소  수정/삭제  댓글쓰기

    현재 json 형태의 웹 페이지를 파싱중인데요.
    PullParser.JSON json 형태로 해봤는데
    저런 형태의 구문이 아닌거 같은데요..혹시 저런식으로 적용하신 적이 있으신지요?

 
음...아직 JavaFX는 삽질할 것이 못되는군요. 얼마전 세미나에서 실버라이트1.0때 열악함을 말해줬는데 그것이 생각나는군요. JavaFX가 지금 현재 열악함 상태입니다.

우선 이 예제는 ManiaDB의 OpenAPI를 이용한 나름(?) 매쉬업 애플리케이션입니다 ㅠ 해당 가수명을 입력하면 매니아디비에서 앨범목록을 가져와서 앨범이미지를 DisplayShelf형태로 뿌려주는 애플리케이션입니다.

여러가지 문제점이 있었는데요ㅠ

1. JavaFX HttpRequest, PullParser 문제점

이 놈을 알아야지 API데이터를 가져올 수 있습니다. 이걸 사용하면서 뭔가 문제점이 있다면...XML파싱할 때 복잡합니다. Flex의 HTTPService는 축복입니다-_- 그리고, XML의 값이 없는 경우(ex:<description><![CDATA[]]></description>)에는 nullpointException을 내뿜으며 파싱에러를 냅니다-_- 매니아디비는 description이 없는 앨범이 있어서 저런 에러를 내뿜더군요.
그래서 꼼수(?)를 사용했습니다. JSON으로 변환해서 쓰면 됩니다-_- JSON은 에러를 안뿜어요. JSON으로 바꾸려면 역시 야후파이프가 짱-_-
야후파이프주소 : http://pipes.yahoo.com/pipes/
앨범검색파이프 : http://pipes.yahoo.com/pipes/pipe.info?_id=5e24977627eb6c03b1d7e9aeb820aca7
앨범검색파이트에서 Get as JSON으로 받으시면 JSON으로 받을 수 있습니다. 이걸가지고 HttpRequest클래스를 이용해서 파싱하면 됩니다.

파싱할 때 XML같은 경우에는 ELEMENT명과 LEVEL로 구분을 해서 값을 가져올 수 있습니다. PullParser라는 클래스를 이용해서 파싱하는데, XML엘리먼트마다 onEvent함수가 발생합니다. 거기서 해당 엘리먼트명과 level(얼마나 깊이 들어갔는지-_-)를 if문으로 구분해서 맞으면 값을 가져오는 그런 식으로 파싱합니다-_-
JSON도 비슷합니다. 예를 들어 값이 끝날 때 "로 끝나면 END_VALUE인지 확인 후 원하는 이름인지 확인 후 가져오면 됩니다. 생각해보니...뭐 그리 복잡하지도 않군요.


2. 과도한 {}로 불편한 문법-_-

조금 하다보니 이제 익숙해지려고 하는 듯하면서도 헷깔리는 과도한 {}-_- 이건 JSON도 아니고, Javascript도 아니고, Java도 아닌데, 3가지 문법이 짬뽕이 되었습니다. 재미있는 건 Java클래스를 그대로 쓸 수 있는 듯합니다. 어느정도인지는 안해봤는데, URI를 encode해야해서 어떻게 해야하나 생각하던중에 Java클래스에 있는 URIEncoder를 사용하니 그냥 되더군요-_- 예전에 선테크데이에서도 Java를 임포트할 수 있다고 들은 것 같아서^^
이 문법도 계속 보니....적응이 되는군요.

그 외에 문제가 굉장히 많았는데, 기억이 안나네요-_-

사용자 삽입 이미지

이건 스크린샷이에요-_- 낚이지 마세요-_-

실행예제 http://mudchobosample.appspot.com/AlbumSearch/AlbumSearch.html
실행 시 신뢰할꺼냐고 물어보는데, 신뢰한다고 해야 실행됩니다 ㅠ 외부파일을 끌어쓰기에..-_- 그리고 자기 인증서기때문에 6개월 뒤에 만기된다고 합니다 ㅠㅠ 인증서를 사야지 JavaFX를 제대로 쓸 수 있는 듯 합니다.

소스코드입니다.
http://my-svn.assembla.com/svn/mudchobosample/trunk/AlbumSearch/


참고자료
http://www.javafx.com/samples/InterestingPhotos/index.html
http://www.javafx.com/samples/DisplayShelf/index.html

PS. 활성화가 로컬에서 할 때에는 잘 되는데, 올리니까 안되네요. 그래서 TextInput부분을 강제로 활성화를 시켜버렸습니다ㅠ Swing컴포넌트를 써서 그런가....
 
Posted by 머드초보

댓글을 달아 주세요

  1. 2009.05.19 08:38  댓글주소  수정/삭제  댓글쓰기

    1.0부터 뭔가 코드가 확바뀌더니 더복잡해진듯 싶습니다
    개인적으로 저는 1.0이전이 훨씬 마음에 들더군요;;

    • 머드초보 2009.05.20 21:32  댓글주소  수정/삭제

      그렇군요^^
      1.0에는 해본적이 없어서 ㅠ
      아직도 익숙치않은 문법입니다 ^^