Whiteship's Note

'2010/08'에 해당되는 글 25건

  1. 2010.08.31 아파치 Click이 No Framework?? (5)
  2. 2010.08.28 '스프링 3.0 이해와 선택' 강의 후기 (12)
  3. 2010.08.19 [인텔리J] 메이븐 프로파일 선택하기 (12)
  4. 2010.08.19 [메이븐 프로파일] 운영시 배포할 설정 파일과 개발시 배포할 설정 파일 샤샥 (1)
  5. 2010.08.17 토비의 스프링 3 북 오픈 기념샷 (10)
  6. 2010.08.14 구글 Buzz API와 OAuth 관련 링크
  7. 2010.08.13 이웃나라 (부동산) 이야기 (2)
  8. 2010.08.11 템플릿-콜백 패턴으로 Try-Catch-Finally 블럭을 무찌르자. (6)
  9. 2010.08.11 [BlackBerry] 헬로 Whiteship (4)
  10. 2010.08.11 [IBM DW 스크린캐스팅] 오브젝트와 의존관계 그리고 스프링3 (4)
  11. 2010.08.10 [인텔리J] 예외 찍기 방지용 템플릿 수정
  12. 2010.08.10 [스프링 테스트] 웹 테스트용 WebApplicationContext에 request, session 스코프 빈 등록하기 (2)
  13. 2010.08.09 JAOO 2010 YOW는 호주 브리스베인에서 12월 6~7일 컨퍼런스 8~9일 워크샵
  14. 2010.08.07 2010 SpringOne 2GX는 시카고에서 10월 19일부터 22일까지
  15. 2010.08.06 에그2를 샀다
  16. 2010.08.04 서버 시간과 자바 시간 맞추기 (4)
  17. 2010.08.04 [GAE 시리즈] 7. 스프링 @MVC
  18. 2010.08.03 [GAE 시리즈] 6. 배포하기
  19. 2010.08.03 [GAE 시리즈] 5. 정적 자원
  20. 2010.08.03 [GAE 시리즈] 4. JDO
  21. 2010.08.03 세상에 공짜는 없다. (4)
  22. 2010.08.03 [GAE 시리즈] 3. JSP와 로깅
  23. 2010.08.03 [GAE 시리즈] 2. 구글 로그인
  24. 2010.08.03 [GAE 시리즈] 1. 구글 앱 엔진 + 메이븐 + IntelliJ 프로젝트 세팅
  25. 2010.08.02 2010년 계획 (늦은) 중간 점검;;

아파치 Click이 No Framework??

모하니?/Thinking : 2010.08.31 10:35


http://www.likejazz.com/archives/2247

여기서 likejazz님은 아파치 Click을 노 프레임워크라고 소개하고 계신데요.

1. 기사 원문에도 그런 단어가 없을 뿐더러.
2. 기사 번역문도 애매하게 번역한 부분이 없잖아 있지만 직접적으로 노 페임워크라고 업급하지 않았습니다.
3. 충격적으로 아파치 Click 홈페이지에 가보시면 자신이 웹 애플리케이션 프레임워크라고 정의했습니다.

그런데 No Framework 라니요.. 전 소개글 읽다가 "이게 뭐지?" 라고 깜짝 놀라서 하던 일 멈추고 읽게 됐습니다. 그런데.. 지금은.. 그야말로 낚였다는 생각밖에 안 들더군요.

No Framework 가 경량(lightweight) Framework랑 같은 말인건가요? 그건 아닌것 같습니다. 

Apache Click은 프레임워크 대신 HTML 템플릿과 POJO(Plain Old Java Object)만으로 프레임워크의 역할을 대신하는 No-Framework의 일종이다.
likejazz님의 설명입니다. 

그런데..  기사에 올라온 코드만 보셨더라도 Click 프레임워크가 제공하는 클래스(Page)를 상속해서 WelcomPage라는 걸 만드고 있습니다. Page같은 프레임워크 코드를 쓰는데..이게 어떻게 No Framework라고 할 수 있을까요.

Click이 경량 프레임워크라는 데는 동의할 수 있습니다. 스프링처럼 방대한 기능을 제공하지 않는 대신 스프링의 방대항 확장성을 포기하고 Click이 제공하는 간편한 방법. 딱 그 방법으로만 개발을 할 수 있게 해주니까 가벼운 프레임워크라고 볼 수 있습니다. 하지만 그렇다고 해서 그게 프레이워크 없이 POJO로만 개발이 가능하다고 하는 No Framework 랑은 좀 다른게 아닌가 싶습니다. 실제 코드도 안 그렇구요. @_@;


저작자 표시
신고
top


'스프링 3.0 이해와 선택' 강의 후기

모하니?/Thinking : 2010.08.28 23:50


'토비의 스프링 3'을 간추린 내용으로 강의를 세 번 했다. 두번은 한빛ENI에서 4회에 걸쳐서 진행했고 한번은 절반의 내용만 가지고 이동국님 소개로 NHN의 어느 한 팀을 대상으로 진행했다. 6월 말부터 강의를 시작해서 오늘 8월 말까지 거의 쉬지 않고 달려왔다. 하지만 아직도 끝나지 않았다. 앞으로 진행하기로 구두로 계획한 강의가 두개. 최종 합의가 끝난 강의가 하나. 현재 하고 있는 강의가 하나 있다.

강의를 처음 해보는 거라 얼떨떨 하던차에 갑자기 여기 저기서 강의 요청이 들어오는 바람에 더 얼떨떨하고 몸도 약간 피곤하다. 하지만 매우 즐겁고 새로운 아이디어가 많이 떠올라서 좋다.

첫 강의를 준비할 때는 많이 긴장했다. 처음 해보는 강의인데 준비된 자료는 아무것도 없었다. 하지만 난 든든했다. 나에겐 '토비의 스프링 3'이 있었다. 그 책에 있는 내용이 워낙에 좋았다. 강의 할때마다 말하지만 내가 말하고 전달한 내용은 전부 이 책에 들어있다. 난 그거 그것을 최대한 쉽게 이해하고 학습하기 편한 형태로 요약하고 편집해서 준비한 것을 효율적으로 전달하려고 노력하는 것 뿐이다. 그게 나의 '스프링 3.0 이해와 선택'이라는 강의다.

그래서 준비한 것이 우선 소스 코드다. 난 PPT 부터 만들지 않았다. 책 내용 중에 꼭 전달하고 싶은 내용과 꼭 이해해야 할 내용을 소스 코드로 만들었다. 그것도 단계적인 학습 단계에 맞게 또 그걸 편하게 다룰 수 있도록 각 패키지에 번호를 붙여놨고 패키지 순서가 흐트러지지 않게 test00, test01 이런식으로 두가지 숫자를 패키지 명 뒤에 붙여줬다. 그 다음에 준비한 것이 PPT다. 소스 코드만 가지고 이해하기 어려운 내용을 PPT로 보강했다. 이 소스에서 저 소스로 넘어갈 때 무엇 때문에 그렇게 넘어가는 것인지 그 결과는 어떤지에 초점을 맞춰 PPT를 작성했다. 마지막으로 소스코드가 변화하는 과정을 보여주려고 코딩 동영상을 녹화했다. 라이브코딩은 생각보다 시간이 많이들고 리스크가 높다. 라이브코딩의 묘미는 발표자의 실수라지만 이제 그런 시절은 갔다. 라이브코딩의 목적이 재미라면 모르겠지만 그게 아니라면 수강생을 불안에 떨게 하면 안된다고 판단했다.

나름대로 열심히 준비한 발표이다보니 자연스래 별로 긴장하진 않는다. 그래도 새로운 장소에서 강의하게 될 때는 항상 약간은 설레이고 약간은 긴장된다. 그래서 항상 첫강의때 1시간정도 일찍 강의장에 도착해서 노트북을 빔에 연결하고 인터넷을 잡고 이클립스를 띄우고 PPT를 띄워서 마음을 가라앉힌다. 그러고 나면 금새 마음이 편해져서 긴장이라는 말은 금방 잊게 된다. 그 뒤에는 수강생의 반응에 신경을 곤두세운다.

강의가 시작되면 나는 수강생들의 반응을 살피기 시작한다. 얼굴은 반응을 살피기 가장 좋은 표적이다. 나는 설명을 하고 수강생들은 화면을 본다. 나는 수강생들의 얼굴을 본다. 그 얼굴 중에는 '네. 이해가 됩니다.', '그래 알겠어.', '이미 아는거자나', '아. 졸려..', '앗 모르곘는데', '멍...', '앗 머라고?', '어려운걸! 이거 뭐지', '멀라 뭐야 이거 먹는거?' 라는 표정이 들어있다. 그걸 보면서 질문을 던지고 좀 더 내 추측이 확실해지면 그에 따라 부연설명을 하거나 속도를 조절한다.

하지만 아직 뭔가 많이 부족하다. 지난주 금요일 수원형 TDD 강의 때 많은 걸 배울 수 있었는데 TDD 보다는 강의 방식. 즉 교수법을 배울 수 있었다. 강의 내용은 분명 TDD 였지만 현재 나에게는 TDD 보다 수원형의 강의 진행 방식과 사소한 유머과 PPT에 더 관심이 갔다. 3시간이 어떻게 갔는지 모를정도로 순식간에 지나갔다. 그리고 하나도 지치지 않았다. 매우 재미있었다. 학습은 그렇게 재밌어야 한다. 배우는 맛이 있어야 한다. 그런데 과연 내 강의를 수강하는 학생들도 그만큼 재미있고 유익하게 학습하고 있는지 어떤지.. 그것 조차도 잘 모르고 있다. 그저 추축만 할 뿐..

그래서 보완할 방법을 마련했다.

하나는 수원형 TDD 강의때 본 즉석 피드백 수집 방법을 사용하는 것이다. 보통 강의가 끝나면 교육을 받은 업체에서 피드백을 받는다. 그러나 그 내용이 나에게 잘 전달되진 않는다. NHN에서 했던 강의 피드백은 동국님께서 전달해 주셔서 잘 볼 수 있었고 굉장히 유용했다. 하지만 한빛ENI에서 했던 교육의 피드백은 내가 받지 못해서 따로 요청해둔 상태이다. 이제는 방법을 바꿔서 나도 수원형처럼 즉석에서 피드백을 받으려고 한다. 그것도 편한 방법으로 말이다. 구글 양식을 이용하는 방법인데 자세한건 나중에 설명하기로 하고, 일단 오늘 받은 피드백은 이렇다.


이상하게 이름을 안적었는데도 읽어보면 어느게 누구 것인지 쉽게 알 수 있을 만큼 익명성이 철저히 보장된다. ㅋㅋㅋ 대부분 실습 위주의 강의에 매우 긍정적이고 시간이 부족하다는 것을 아쉬워했다. 사실 실습 시간이 부족한 것은 내가 너무 많은 내용을 전달하려고 하는 욕심 때문이기도 하고.. 실습한 내용이 한번에 익혀지는 만만한 내용도 아니라서 그럴 것이다. 이 부분은 앞으로 조금 강의 내용을 개선해서 고쳐나가야 할 부분이다.


 ps: 오랜만에 썼더니 굉장히 장문으로 써진다. (사실 이보다 더 많은 내용을 썼다가 지웠다.) 앞으로는 좀 더 자주 토해내야겠다.

저작자 표시
신고
top


[인텔리J] 메이븐 프로파일 선택하기

Good Tools : 2010.08.19 11:48


뭐 이런 간단한 것을 올리나 하겠지만.. 윤석군이 이클립스에서 프로파일 옵션 줘서 빌드해도 잘 안 바뀐다길래 인텔리J의 우수함을 뽐내 주기 위해 스크린 샷 한장을 올립니다.

윤석군 보아라..

WEB-INF 밑에 classes에 배포된 calendar.properties에 들어있는 내용인데 분명히 production이래자나.. 난 잘 된다고.. 


하지만 안타깝게도 넌 선택권이 없어.. 이클립스를 잘 써... 현업 나가면 어차피 다 이클립스 쓸텐데 인텔리J에 맛들이면 큰일나.. 다른거 못써. ㅋㅋ

이클립스로 어떻게든 빌드 잘 하고 메이븐 플젝 잘 써먹게 되면 그때 넘어오셩.. 그래야 인텔리J 쓰고 놀다가도 후딱 이클립스에서 프로젝트 하지. 안 그럼 난감해ㅋ
저작자 표시
신고
top


[메이븐 프로파일] 운영시 배포할 설정 파일과 개발시 배포할 설정 파일 샤샥

Build/Maven : 2010.08.19 11:02


운영시에 사용할 설정과 배포할 때 사용할 설정이 다르다. 어떻게 해야할까요? 예전에도 이 고민을 한적이 있었는데 마침 윤석군이랑 봄싹에 구글 캐린더 연동 서비스를 구현했는데 이런 상황이 또 발생했습니다.

개발 할때 사용할 구글 캘린더와 실제 운영시 사용할 구글 캘린더는 달라야 합니다. 혹은 개발 할 때는 캘린더 서비스를 무시할 수도 있어야 하는데 이 경우는 일단 제외하고 우선은 설정을 환경에 따라 구분해야 한다는 것에 초점을 맞췄습니다.

설정 정보가 구체적으로 어떻냐에 따라 방법도 달라질 수 있는데 이전에 봄싹에 적용한 방법은 다음과 같습.. 흠... 아닙니다.. 귀찮군요. 그냥 생략하고 메이븐 프로파일이나 정리하겠습니다. 어쨋든 이전에 사용한 방법은 메이븐을 사용하지 않은 방법이었는데.. 그게 다 장,단점이 있습니다.

이번에 사용할 방법은 메이븐 프로파일을 사용합니다.


일단 폴더를 저런식으로 구분했는데 뭐 저런 구조야 맘대로 정하시면 되겠죠. 중요한건 개발시 사용할 설정파일이 담겨있는 폴더와 운영시 사용할 설정파일이 담겨있는 폴더를 구분했다는 것 정도..

이제 pom.xml에서 <build> 부분에 개발시 사용할 설정이 담겨있는 폴더를 소스 리소스 폴더로 인식하도록 설정해 줍니다.

    <build>
        ...
        <resources>
           ...
            <resource>
                <directory>${project.basedir}/resources/development</directory>
                <excludes>
                    <exclude>**/*.java</exclude>
                </excludes>
            </resource>
        </resources>
        ...
</build>

이렇게 말이죠. 대충 엘리먼트 이름만 봐도 아실테니 설명은 패스.

다음은 운영 환경에서는 저 폴더가 아니라 다른 폴더를 리소스 폴더로 등록해줘야 합니다. 따라서 pom.xml에 프로파일을 추가해 주고 그 안에서 재정의할 설정을 넣어주면 됩니다.

    <profiles>
        <profile>
            <id>production</id>
            <build>
                <resources>
                     ...
                    <resource>
                        <directory>${project.basedir}/resources/production</directory>
                        <excludes>
                            <exclude>**/*.java</exclude>
                        </excludes>
                    </resource>
                </resources>
            </build>
        </profile>
    </profiles>

자 요렇게 해주면 더 프로파일을 가지고 빌드 할때는 운영시 사용할 설정 파일이 담겨있는 폴더를 소스 리소스 폴더로 인식해서 그 안에 있는 .java 파일을 제외한 모든 파일을 배포해줍니다.

마지막으로.. 그럼 저 프로파일을 가지고 빌드 하는 방법은?

mvn clean install -Pproduction -X

요런식으로 mvn을 실행할 때 -P프로파일명 을 주시면 됩니다. 저기서 사용한 -X는 디버깅용 출력에 사용하는 옵션이구요. 나머진 아시겠죠.

좋은점
- 빌드 담당자가 아닌 개발자들은 이전과 동일하게 계속 개발하면 된다.
- 저 설정들을 버전관리에 포함시킬 수 있다.
- 운영 서버에서 빌드 스크립트 설정만 한번 바꿔주면 된다. 그 이후로는 간편하다.

불편한점
- 빌드 담당자(SI에 이런 롤이 있는지 몰겠지만)가 메이븐을 쬐끔 알아야 한다.

사실 위에 적은 좋은점 불편한점은 위에서 생략하고 넘어간 이전 방식과 비교를 했을 때 더 분명한데.. 일단은 그 방법을 적기가 다소 귀찮고 본 글의 주제에도 맞지 않으니 그냥 생략합니다. 대충 세가지 방법을 고민해 뒀는데 나중에 정 한가하고 정 심심해지면 정리해봐야겠습니다.
저작자 표시
신고
top


토비의 스프링 3 북 오픈 기념샷

모하니?/Reading : 2010.08.17 21:31



음하핫.. 드디어 받았군요. 제가 마지막에 쿨하지 못해서 넣게된 추천사까지 볼 수 있고 알파리딩 때는 보지 못했던 토비님의 감사의 인사도 볼 수 있어서 감회가 새로웠습니다.  길게 쓰고 싶지만 운동갈 시간이라.. 짧게 남겨도 이해해 주세요.

책에는 이클립스 기준으로 소스코드 실행하는 방법이 있지만 전 인텔리J로 돌리렵니다. 메이븐 프로젝트도 아니니까 이클립스로 돌려도 무난하겠지만... 메이븐 프로젝트는 인텔리J가 백배 좋습니다.
저작자 표시
신고
top


구글 Buzz API와 OAuth 관련 링크

Good Tools : 2010.08.14 22:42


구글 버즈
http://code.google.com/intl/ko-KR/apis/buzz/
http://code.google.com/intl/ko-KR/apis/buzz/docs/libraries.html
http://code.google.com/intl/ko-KR/apis/buzz/v1/using_rest.html#create-activity

OAuth
http://code.google.com/intl/ko-KR/apis/accounts/docs/OAuth_ref.html#GetAuth
http://code.google.com/intl/ko-KR/apis/accounts/docs/OAuth.html
http://googlecodesamples.com/oauth_playground/index.php

OAuth 토큰이 여러개인게 아니라 토큰 종류가 여러 가지인거 였구만... 어려워 어려워 @_@;;
저작자 표시
신고
top

TAG OAuth

이웃나라 (부동산) 이야기

모하니?/Thinking : 2010.08.13 17:27






이제 한국 차례.. 
저작자 표시
신고
top


템플릿-콜백 패턴으로 Try-Catch-Finally 블럭을 무찌르자.

모하니?/Coding : 2010.08.11 18:40


어제부터 계속 정리하고 싶었는데 어젠 이상하게 시간을 쏟아 버리는 바람에.. 이제 정리한다. 자세한 내용은 토비의 스프링 3에 나오는데 이번에 구글 캘린더 API 코딩하다가 써먹을 기회가 와서.. 적용해 봤다. 문제는 내 강의를 들었던 학생은 그걸 하지 못했다는게 아쉽다. 어디 한술에 배부르랴.. 그래도 내가 코딩한 걸 보고 그게 그건지 알아차렸으니.. 그걸로 만족한다.


구글 캘린더 API를 사용하려면 위에 있는 문서만 보면 된다. 친절하게 안내해주고 있어서 쓰기 편하다. 그런데 문제는 예외처리다. 


    public List<CalendarEntry> getMyCalendarList(){
        URL feedUrl = makeUrl(OWN_CALENDAR_URL);
        try {
            CalendarFeed resultFeed = calendarService.getFeed(feedUrl, CalendarFeed.class);
            return resultFeed.getEntries();
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (ServiceException e) {
            throw new RuntimeException(e);
        }
    }


저기서 호출하고 있는 calendarService는 구글에서 제공해주는 API로 IOException과 ServiceException을 던지는 메서드들을 왕창 가지고 있다. 또 그녀석들을 자주 쓰게 된다.

따라서 어떤 호출을 하더라도 위와같은 예외 처리 코드가 생기기 마련이다. 이걸 어떻게 하면 좋을까? 스프링 개발자라면 이런 코드를 스프링과 잘 어울리는 형태로 처리할 수 있어야 한다.

어떻게 할것인가? 어떻게 하면 저 지져분한 Try-Catch(-Filnally) 문에서 벗어날 것인가? 한번 도전 해보자...

결과는..

public List<CalendarEntry> getMyCalendarList(){
        return calendarServiceTemplate(new CalendarServiceCallBack<List<CalendarEntry>> () {
            public List<CalendarEntry> queryForObject() throws IOException, ServiceException {
                return calendarService.getFeed(makeUrl(OWN_CALENDAR_URL), CalendarFeed.class).getEntries();
            }
        });
    }

이것과 비슷한 형태가 될 것이다. 물론 중요한건 결과가 아니라 저렇게 바꾸는 프로세스.. 그걸 이해하고 자신의 스킬로 만드는 것이 중요하겠다. 토비의 스프링 3에서 아주 잘 배울 수 있으니 꼭.. 3장 템플릿을 정독하도록 하자. 연습하고. 또 연습하고. 또 연습하고. try-catch 문이 반복해서 나올 떄 마다 적용해 보도록 하자.

저작자 표시
신고
top


[BlackBerry] 헬로 Whiteship

모하니?/Coding : 2010.08.11 13:55



아이콘은 무료 아이콘 사이트에서 하나 다운 받았고.. 초간단 앱은 역시 헬로 월드.. 

public class HelloWorld extends UiApplication {
final class HelloWorldScreen extends MainScreen {
public HelloWorldScreen() {
super();
LabelField title = new LabelField("Hello App", LabelField.ELLIPSIS | LabelField.USE_ALL_WIDTH);
setTitle(title);
add(new RichTextField("Hello Whiteship!!"));
}
public boolean onClose() {
Dialog.alert("바이바이!");
System.exit(0);
return true;
}
}

public static void main(String[] args) {
HelloWorld app = new HelloWorld();
app.enterEventDispatcher();
}
public HelloWorld() {
pushScreen(new HelloWorldScreen());
}

}

일단 앱은 UiApplication을 상속 받아서 만들고 우선.. 맨 아래에 있는 메서드 pushScreen을 사용해서 MainScreen을 상속해서 만든 화면을 뿌려주고,, enterEventDispatcher 메서드를 호출해서 이 앱에서 발생하는 이벤트들을 감지하도록 설정하는 것 같네요.

흠냐.. 뭘 만들어 볼까나..
저작자 표시
신고
top


[IBM DW 스크린캐스팅] 오브젝트와 의존관계 그리고 스프링3



출처 및 소스 코드: https://www.ibm.com/developerworks/mydeveloperworks/blogs/9e635b49-09e9-4c23-8999-a4d461aeace2/entry/264?lang=en





에이콘 출판사의 토비의 스프링 3의 1장 내용을 스크린캐스팅으로 찍어 봤습니다. 상당히 많은 내용을 압축해서 찍은거라 생략한 설명이나 과정이 많습니다. 책 내용에 대한 일종의 프리뷰라고 생각하시고 자세한 내용은 꼭 책으로 확인하시기 바랍니다.

ps: 오늘 토비님께서 블로그에 올려주셨더니 조회수가 확 뛰었네요. 캬..


저작자 표시
신고
top


[인텔리J] 예외 찍기 방지용 템플릿 수정

Good Tools : 2010.08.10 14:04



이렇게 간단한 템플릿 수정 만으로 예외 먹는 기본 템플릿 코드를 수정할 수 있다. 이클립스에도 try-catch 문 자동 생성시 catch 문에서 예외를 냠냠 하게 되어 있을텐데.. 그보다는 차라리 저렇게 RuntimeException으로 변화해서 던져주는게 더 낫다.

예외를 먹지 않으니까 예외가 발생한 지점 찾기도 좋을 뿐더러, RuntimeException으로 변환해주면 저 API를 사용하는 입장에서 잡아도 되고 안잡아도 되고 선택권이 생기니까 더 좋다. 머.. 잡아서 확실하게 예외를 어떻게 처리할 방법이 있다면 그렇게 처리하는게 더 좋겠지만 대부분은..흠냐..
저작자 표시
신고
top


[스프링 테스트] 웹 테스트용 WebApplicationContext에 request, session 스코프 빈 등록하기

Spring/3.0 : 2010.08.10 12:23


Spring, Junit 에서 session, request scope bean 을 사용하기 

오리대마왕님께서 올려주신 글을 보니 '토비의 스프링 3'에 나오는 웹 테스트 코드가 생각나서 그냥 session 스코프 빈을 한번 등록해 봤습니다. 오리대마왕님 테스트의 주 목적도 이거였을 텐데.. 컨트롤러에 AOP를 등록하고, 현재 request를 담고 있는 HttpRequestHolder를 request 스코프로 만든 걸 봤는데... 테스트 목적에 비해 코드가 다소 장황한 것 같습니다. (사실 올려주신 코드에서 HttpRequestHolder를 request 스코프로 등록하지 않고 그냥 singleton으로 써도 결과는 똑같더군요. 현재 요청을 가로 채고 있던 녀석은 HttpRequestHolder를 request 스코프로 했기 떄문이 아니라 RequestContextHolder 때문인것 같더군요. 그리고 컨트롤러에 설정한 AOP도 그냥 스프링 인터셉터를 쓰시면 더 간단하게.. 처리가 가능한.. 암튼..)

public class SimpleRequestScopeTest {

    @Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
    static class RequestScopedBean {}

    @Test
    public void simpleReqestScopeBean() throws ServletException {
        ConfigurableDispatcherServlet dispatcherServlet = new ConfigurableDispatcherServlet();
        dispatcherServlet.setClasses(RequestScopedBean.class);
        dispatcherServlet.init(new MockServletConfig("spring"));

        WebApplicationContext wac = dispatcherServlet.getWebApplicationContext();
        RequestScopedBean rsb = wac.getBean(RequestScopedBean.class);
        assertThat(rsb, is(notNullValue()));
    }
}

이게 다입니다. RequestScopedBean이라는 클래스를 만들고, 스코프를 설정해준 다음 ConfigurableDispatcherSevlet에 전달해서 빈으로 등록해주었고, DS에서 WAC를 가져온다음 RSB를 getBean 해서 null이 아닌지 확인하면 끝입니다.

단순 빈 등록만 확인하려면 WebApplicationContext를 직접 만들어 쓰면 되겠지만, 여기서는 웹 테스트 용도로 작성하는 테스트라고 가정하면, 요청 매핑이나, 실행 결과 ModelAndView등을 확인하려면 역시 DispatcherServlet을 써먹어야 합니다. 하지만 DispatcherServlet은 ModelAndVIew를 밖으로노출해주지 않죠. 그럴 필요도 없구요. 그래서 테스트용으로 DispatcherServlet을 확장한 것이 바로 저기에 보이는 ConfigurableDS입니다. 이 CDS를 사용한 초단단 웹 @MVC 테스트는 다음과 같습니다.

public class HelloControllerTest {
@Test
public void helloController() throws ServletException, IOException {
ConfigurableDispatcherServlet servlet = new ConfigurableDispatcherServlet();
servlet.setRelativeLocations(getClass(), "spring-servlet.xml");
servlet.setClasses(HelloSpring.class);
servlet.init(new MockServletConfig("spring"));
MockHttpServletRequest req = new MockHttpServletRequest("GET", "/hello");
req.addParameter("name", "Spring");
MockHttpServletResponse res = new MockHttpServletResponse();
servlet.service(req, res);
ModelAndView mav = servlet.getModelAndView();
assertThat(mav.getViewName(), is("/WEB-INF/view/hello.jsp"));
assertThat((String)mav.getModel().get("message"), is("Hello Spring"));
}
}
(출처, 토비의 스프링 3 예제 코드)

그러나. 이것 마저도 복잡합니다. ConfigurableDispatcherServlet 를 만들고 설정한 다음, Request에 URL을 설정하고 그 결과로 나오는 MAV를 확인하는 패턴이 고정적입니다. 따라서 이걸 더 간편하게 사용할 수 있도록 만든 클래스가 있는데.. 그게 AbstractDispatcherServletTest 입니다. ConfigurableDispatcherServlet과 AbstractDispatcherServletTest는 토비의 스프링 3에서 직접 보실 수도 있고, 예제 코드를 다운 받아 보실 수도 있는데 설명이 들어있는 책으로 보시는걸 추천해 드립니다.

여기서는 간단한 사용법만 보여드리자면;;

public class SimpleMVCTest extends AbstractDispatcherServletTest {
@Test
public void simpleHandler() throws ServletException, IOException {
this.setClasses(SimpleHandler.class, SimpleViewHandler.class)
.runService("/hi");
assertThat(this.response.getContentAsString(), is("hi"));
this.runService("/view");
assertThat(this.getModelAndView().getViewName(), is("view.jsp"));
}

@Controller static class SimpleHandler {
@RequestMapping("/hi") @ResponseBody 
public String hi() { return "hi"; }
}
@Controller static class SimpleViewHandler {
@RequestMapping("/view")
public String view() { return "view.jsp"; }
}
}
(출처, 토비의 스프링 3 예제 코드)

이런식으로 초간단 MVC 테스트를 만들 수 있습니다.
저작자 표시
신고
top


JAOO 2010 YOW는 호주 브리스베인에서 12월 6~7일 컨퍼런스 8~9일 워크샵

모하니?/Planning : 2010.08.09 11:05


JAva Object Oriented 소프트웨어 개발 컨퍼런스란 뜻에서 JAOO라고 한다.

http://channel9.msdn.com/posts/Charles/JAOO-2007-Kresten-Krab-Thorup-JAOO-What-How-Why/

컨퍼런스 세부 일정은 아직 안나온듯.. 저기도 가고 싶다. 미국에서 하는 스프링 세미나 보다 호주에서 하는 YOW가 더 가보고 싶다. 이유는 워크샵 때문에.. 직접 실습 해본다고.. 캬.. 그리고 주제도 완전 다양하다.

나중에 스케줄 표라도 나오면 다시 수정해서 올려야지. 지금을 일단 기록용.
저작자 표시
신고
top

TAG JAOO

2010 SpringOne 2GX는 시카고에서 10월 19일부터 22일까지

모하니?/Planning : 2010.08.07 19:55


http://www.springone2gx.com/conference/chicago/2010/10/springone/event_schedule

2008년은 OSGi와 스프링 DM이 한참 뜨는가 했더니... 이번 컨퍼런스에서는 찾아보기 힘들다.  애초에 공부할때도 영.. 힘들다 싶었다. @_@;; 좀 더 사용하기 편해지고 뭔가 모듈화 가이드 라인이 확실해 지면 그떄가서나 다시 시도해볼까.. 그전엔 별로 하고 싶지 않다.

이번 컨퍼런스는 스프링 Roo와 클라우드 컴퓨팅이 대세인것 같다. 그 중에서 듣고 싶은 세션을 선택해 봤다. 아직 일정이 전부 공개된 상태가 아니라 별로 듣고 싶은 세션이 없는 시간대에는 빈곳을 선택해 뒀고.. 둘다 관심이 갈 땐 그냥 둘 다 칠해뒀다.

혹시라도 올해에도 가게되면.. 제작년처럼 한 주제로 올인하고 싶진 않다.



저작자 표시
신고
top


에그2를 샀다



몇일전 네이버에 스프링 3.0 강의를 하러 다녀왔다. 역시.. 똑똑한 분들이 많은 곳이라 그런지 이해력이 상상이셨던 분들이 많았다. 음.. 그런데 그런 좋은 회사들의 단점은.. 외부인의 인터넷 사용에 제약이 크다는 것이다. 이해한다. 외부인이 사내 네트워크에 접속해서 공유폴더라도 뒤지면... @_@.. 그래서 그냥 인터넷 없이 강의를 진행했다.

이미 강의에 필요한 모든 코딩 동영상, PPT, 소스 코드가 세팅되어 있는 맥북을 들고갔으니 굳이 인터넷이 필요하진 않았다. 그래도;; 가끔은 스프링 API 문서를 띄우거나 내 블로그에 정리했던 글을 띄워서 보여드리고 싶었지만 그럴 수 없는 것은 역시 조금 불편했다.

그래서 장만했다. 썬에그..

다 좋은데;; 이게 좀 뜨겁다;;; 


속도는 이정도.. 일단 업로드 속도가 매우 맘에 든다; 이제 집에서도 스크린캐스팅 업로드 할 수 있겠다;; 매번 회사가서 올리느라고 드랍박스로 옮기거나 USB로 옮겨다녔는데 그럴 필요 없어졌다.
저작자 표시
신고
top


서버 시간과 자바 시간 맞추기

Linux : 2010.08.04 11:36


현재 톰캣 위에 돌리고 있는 애플리케이션에서 보여주는 시간이 이상해서 
1. 서버에 들어가서 date를 쳐봤다. 그랬더니 현재 시간이 아니었다. 
2. 그래서 서버의 시간을 맞추고..
3. 다시 톰캣을 돌렸다.

그러나... 시간은 맞지 않았다. 어디가 잘못된 것일까? 톰캣 시간과 서버 시간은 애초에 별개였던 것이다. @_@;; 서버 시간 맞춘다고 자바 시간까지 서버 시간 따라서 맞춰지는게 아니엇다.

1. 서버 시간대 맞추기

export env TZ=KST-09:00:00 
rdate -s time.bora.net 
hwclock --systohc
date
hwclock --show

어디선가 보고 배껴만든 스크립트인데;; 잘 동작한다.

ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
rdate -s time.bora.net

저걸 만들고 보니 이미 예전에 이렇게 만들어둔 스크립트도 있었다. 하지만 잘 되는지 어떤지는 모르겠다. 이미 서버 시간은 맞은 상태였으니까;

2. 자바 시간대 확인하기

public class DateConfirm {

    public static void main(String[] args) {
        System.out.println(new Date().toGMTString());
        System.out.println(new Date().getTimezoneOffset());

        java.util.TimeZone tz = java.util.TimeZone.getDefault();
        System.out.println("Timezone offset from UTC reported as " +
                (tz.getRawOffset() / 1000 / 60) + " minutes");
        if (tz.getRawOffset() % (15 * 60 * 1000) != 0) {
            System.out.println("Warning: not a multiple of quarter-hours");
        }
        System.out.println(new java.util.Date());
        System.out.println(tz);

        TimeZone tz2;
        Date date = new Date();
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss (z Z)");

        tz2 = TimeZone.getTimeZone("Asia/Seoul");
        df.setTimeZone(tz2);
        System.out.format("%s%n%s%n%n", tz2.getDisplayName(), df.format(date));
    }

}

이것도 어디선가 보고 배껴 만든 코드인데 이걸로 기본 TimeZone을 확인한뒤, TimeZone을 서울로 설정한 다음에 다시 날짜/시간을 찍어본다.

4 Aug 2010 02:13:46 GMT
300
Timezone offset from UTC reported as -360 minutes
Tue Aug 03 21:13:46 CDT 2010
sun.util.calendar.ZoneInfo[id="America/Chicago",offset=-21600000,dstSavings=3600000,useDaylight=true,transitions=235,lastRule=java.util.SimpleTimeZone[id=America/Chicago,offset=-21600000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=2,startDay=8,startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=3,endMonth=10,endDay=1,endDayOfWeek=1,endTime=7200000,endTimeMode=0]]
한국 표준시
2010-08-04 11:13:46 (KST +0900)

조금전(8월 4일 오전 11시경..)에 확인한 결과였는데.. 이렇게 결과가 엉망이다. 대신 마지막 값이 제대로 나왔다면 희망이 있다. 즉 TImeZone만 제대로 설정해주면 되는거니깐...

3. 자바 시간 설정하기

톰캣/bin 폴더에 환경 설정용 파일은 setenv.sh가 있으면 그걸 편집하고 없으면 그 안에 자바 옵션을 설정해준다.

export JAVA_OPTS="-server -XX:+UseParallelGC -Xmx768m -XX:MaxPermSize=160m -Djava.awt.headless=true -Dfile.encoding=utf-8 -Duser.timezone=GMT+09:00"

export CATALINA_OPTS="$CATALINA_OPTS -Dorg.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER=true"

다른 설정은 뭐 때문에 추가했는지 모르겠고. 아마도 아틀라샨 지라를 설치하면서 해놨을 법한데.. 기억나진 않는다;

저렇게 해두면 톰캣/bin의 startup.sh 파일을 실행할때 저 환경변수가 적용되고 저 톰캣에서 돌고 있는 애플리케이션의 날짜가 제대로 먹히게 된다.

저작자 표시
신고
top


[GAE 시리즈] 7. 스프링 @MVC

모하니?/Coding : 2010.08.04 04:42


GAE 시작하기 메뉴얼을 따라하면서 들었던 생각은 스프링을 어서 도입해봐야겠다는 것이었다. 특히 PMF 라는 클래스를 만들때 간절했다. JDO의 PersistenceManagerFacotry를 싱글톤으로 사용하려고 만든 클래스인데.. 전혀 좋은 코드가 아니었다. 그뿐아니라 자바 코드와 HTML이 섞여있는 guestbook.jsp도 마찬가지이고, HttpServlet을 직접 상속해서 구현한 GurestbookServlet과 SignGuestbookServlet도 스프링 @MVC 컨트롤러로 고치고 싶었다.

그래서 일단해야 할 일은 스프링의 초간단 @MVC 컨트롤러를 추가하고 그게 동작하는지 확인하는 일이었다. 이전에 라이브러리는 넣어둔 상태라 간단하게 설정만 조금 추가하면 됐다.

web.xml

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext*.xml</param-value>
    </context-param>

    <servlet>
        <servlet-name>spring</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>/app/*</url-pattern>
    </servlet-mapping>

spring-servlet.xml

<context:component-scan base-package="whiteship" use-default-filters="false">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
</context:component-scan>

applicationContext.xml

<context:component-scan base-package="whiteship">
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
</context:component-scan>

그리고 컨트롤러

@Controller
@RequestMapping("/hello")
public class GreetingController {

    @RequestMapping("/{name}")
    public String hello(@PathVariable String name, Model model){
        model.addAttribute("name", name);
        return "/WEB-INF/views/hello.jsp";
    }

}

그리고 뷰

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page isELIgnored="false" %>
<html>
  <head><title>Simple jsp page</title></head>
  <body>잘잤니~ ${name}</body>
</html>

끝이다. 잘 돌아간다.



저작자 표시
신고
top


[GAE 시리즈] 6. 배포하기

모하니?/Coding : 2010.08.03 14:51


http://code.google.com/intl/ko-KR/appengine/docs/java/gettingstarted/uploading.html

드디어 GAE 시작하기 매뉴얼로는 마지막이군요. 하지만 아직 스프링 도입하기가 남았으니 GAE 시리즈는 계속 이어지겠지만 오늘은 오후에 일이 있어서 오늘로는 마지막 포스팅이 될듯 하군요.

https://appengine.google.com/

일단 저기에 접속해서 계정을 만들고 애플리케이션 ID를 생성합니다. 해당 ID를 웹 프로젝트의 appengine-web.xml의 <application> 엘리먼트에 설정해 줍니다.

그리고 이클립스나 인텔리J 같은 IDE에서 직접 업로드 하거나.. 콘솔에서 업로드 할 수도 있습니다. 저는 콘솔에서 해봤습니다. 

http://whiteshipgb.appspot.com



저작자 표시
신고
top

TAG GAE, 배포

[GAE 시리즈] 5. 정적 자원

모하니?/Coding : 2010.08.03 14:23


CSS 파일, JS 파일, 이미지, 플래시, 음악, 무비 등 정적 자원은 서블릿 컨테이너가 아닌 별도의 웹서버로 서비스를 사용해서 서비스 해준다. 

이때 WAR로 패키징되는 애플리케이션의 모든 자원 중 /WEB-INF 밑에 있는 JSP 파일들을 제외하고는 모두 정적 자원으로 처리해준다. 따라서 별도의 설정을 할 필요 없지만.. 만약에 별도로 정적 파일을 지정하고 싶다면 web.xml 근처에 있는 appengine-web.xml 파일에 설정해주면 된다.

appengine-web.xml에 설정파일에 대한 자세한 내용은 http://code.google.com/intl/ko-KR/appengine/docs/java/config/appconfig.html


저작자 표시
신고
top


[GAE 시리즈] 4. JDO

모하니?/Coding : 2010.08.03 13:15


http://code.google.com/intl/ko-KR/appengine/docs/java/gettingstarted/usingdatastore.html

 분산 웹 애플리케이션을 만들려면 고민할께 많은데 GAE를 사용하면 그럴 걱정은 할 필요 없단다. 매력적이다. 하지만 손수 분산 웹서버, 분산 DB 환경을 구축해보고 싶긴하다. 머 어쨋건;; 지금은 GAE 공부 중이니깐;; GAE가 알아서 분산, 복제, 로드 밸런싱을 해주기 때문에 개발자는 그냥 심플한 API만 사용해서 개발하면 분산 환경은 알아서 사용하게 된다.

GAE의 datastore도 그러한 서비스 중 하나인데 두 종류 API를 지원한다. 하나는 JDO 하나는 JPA. JDO는 오래전부터 표준이었고 JPA는 하이버네이트 영향으로 생긴 EJB 3의 표준인데... 어째 둘이 생긴게 비슷하다. JDO가 JPA를 따라서 변형된 것 같은 모습인데 실제로 그런건진 모르겠다. 그러거나 말거나.. 쓰기 편하고 기능이 좋으면 그만이다.

JPA를 쓸때 persistence.xml 설정 파일 만들듯이 JDO를 쓸땐 jdoconfig.xml 파일을 만든다. 이 파일에 대한 자세한 설명은 생략;

http://code.google.com/intl/ko-KR/appengine/docs/java/datastore/usingjdo.html

난 JPA를 쓰고 싶은데, 아니 사실은 하이버네이트를 직접 사용하고 싶은데;; 예제가 JDO라 어쩔 수 없이 일단은 따라해 보기로 했다. 

다음은 도메인 클래스를 만들고 매핑 정보를 애노테이션으로 설정한다. JPA랑 똑같다.  그 다음도 사실 똑같다. PersistenceManagerFactory에서 PersistenceMaanger를 가져가다 사용하면 된다. 하이버네이트로 치자면 SessionFactory에서 Session 가져다 쓰는거랑 비슷하다. JDO에도 HQL 같은 JDOQL이라는 쿼리 언어가 있다. 도무지;; JDO랑 JPA랑 구분이 되지 않는다. 똑같아 보인다. 이럴바엔 하나로 합치는 표준을 하나 만들고 그 API를 쓰게 하는게 좋치 않을까.. 



저작자 표시
신고
top

TAG GAE, JDO

세상에 공짜는 없다.

모하니?/Thinking : 2010.08.03 11:45


그래서 딱히 좋아할 것도 없고
그래서 딱히 아쉬울 것도 없다.
그러니 무척 열심히 살아야 된다. 

예를 들어, 누가 식당에 들어가서 밥을 먹고 우연히 계산을 안하고 나왔다 치자. 이사람은 공짜로 밥을 먹은 것일까? 아니다. 그 사람은 돈을 낼 수도 있는데 돈을 내지 않았다는 죄책감을 받았고, 종업원들로부터 그지같은XX라는 욕도 얻어먹었으니 절대로 공짜가 아니다.

자그럼 누군가 열심히 공부한것을 블로깅 하고 있다. 남들도 다 보라고. 공짜로 퍼주고 있는 것이다. 과연 그럴까? 아니다. 어차피 블로깅이야 내가 공부한 것을 정리하는 목적이었으니 소기의 목적을 달성한 성취감이 돌아오며, 차후 누군가 내 글이 그사람에게 도움이 됐다는 댓글 하나라도 달린다면.. 그게 또 얼마나 맛있는지 모른다.

어찌 생각하면 참으로 공평한 세상 같지만 어찌 생각하면 참으로 무서운 세상인거다. 자식에게 주는 부모님의 사랑. 부부간에 서로룰 존중하는 마음. 남을 배려하는 마음과 태도. 이게 다 눈에 안 보인다고 '공짜'라고 착각하는 사람들이 늘어나면 세상은 흉악해지고 볼품없어진다.

부모가 자식에게 무한대의 신뢰와 사랑을 주지 못하면 자식은 비뚤어지기 마련이고 범죄자가 될 가능성이 높다. 공부해도 모자를 시간에 게임이나 하며 허송세월 하다가는 돈많은 부모둬서 외국나가 띵까띵까 거리던 애들한테 평생 짓눌려 살 수가 밖에 없다. 그러니까 열심히 살아야 한다.

그렇치 기선아? 열심히 살자고.
저작자 표시
신고
top


[GAE 시리즈] 3. JSP와 로깅

모하니?/Coding : 2010.08.03 06:53


http://code.google.com/intl/ko-KR/appengine/docs/java/gettingstarted/usingjsps.html

GAE라고 해서 JSP에 특별한 머시기를 해주는건 아니고 그냥 일반적인 Servlet&JSP 코딩하듯이 코딩하면 된다.

JSP는 web 폴더 밑에 두면 자동으로 매핑 되니까 guestbook.jsp 같은걸 만들고, 그 안에서 직접 자바 코드 호출해서 사용하고 있다. (빨리 스프링 MVC 적용해서 걷어내고 싶다.)  그 다음엔 폼을 추가하고 그 폼 서브밋을 처리할 서블릿을 하나 만들고 (그안에서 로그인 확인 중복 코드 발생한다.) 로그인 여부에따라 java.util.logging.Logger를 사용해서 로그 메시지를 남기고 있다. 그 서블릿 매핑 정보를 web.xml에 추가한다. (이부분도 역시 어서 스프링 MVC를 도입하고 싶게 해주는 부분이다. 귀찮게 맨날 web.xml에 대여섯줄 씩 매핑 정보를;; @_@;)

자.. 이제 끝이 아니라. 로깅을 설정하는게 이게 조금 재밌다.

web/WEB-INF 폴더 밑에 보면 appengine-web.xml이 있는데 드디어 이녀석이 하는 일 중 하나가 밝혀진다. 바로 환경 변수 설정이다. 

    <system-properties>
        <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
    </system-properties>

이런식으로 로깅 파일 위치를 설정해주면 GAE에서 해당 위치에 로깅 파일을 사용하여 어드민 콘솔 이라는 앱으로 GAE에 배포한 앱의 로그 메시지를 기록하고 간편하게 찾아볼 수 있는 서비스를 제공해준다. log4j 설정만 써보고 자바 Logger 설정은 안써봤는데; 의외로 간편하다.

.level = WARNING
whiteship.level = INFO

달랑 요거;


 


저작자 표시
신고
top


[GAE 시리즈] 2. 구글 로그인

모하니?/Coding : 2010.08.03 06:22


http://code.google.com/intl/ko-KR/appengine/docs/java/gettingstarted/usingusers.html

        UserService userService = UserServiceFactory.getUserService();
        User user = userService.getCurrentUser();
        if(user != null) {
            resp.setContentType("text/plain");
            resp.getWriter().println("Hello, " + user.getNickname());
        } else {
            resp.sendRedirect(userService.createLoginURL(req.getRequestURI()));
        }

이 코드가 핵심인데.. 많은 것들을 해준다.

1. 우선 무척이나 간단하다. 이렇게 쉽게 구글 로그인을 연동할 수 있다니... API도 직관적이라 어떤 일을 하는지 쉽게 알 수 있다. 마지막 줄의 코드가 로그인 한 다음 바로 로그인을 요청한 페이지로 이동하기 위한 API 인데 흠.. 괜찮은 것 같다. 권한 관리는 어떻게 하는지..  실제론 스프링 시큐리티랑 연동해서 쓰는지 아님 구글에서 제공하는 인증/권한 관리 API가 있는 것인지.. 있다면 권한 관리 설정은 편리한지 궁금하다.

2. 로그인 화면 자동생성. 로그인이 필요할 때 guestbook 예제에서 봤던 로그인 화면이 등장하는데 나는 그런 JSP 파일을 만든적도 없는데 알아서 만들어줬다. 편리하다.

3. 간편할 뿐 아니라 이 코드는 개발 환경과 배포 환경에 따라 동작 방식이 바뀐다. 오.. 놀라워라; 즉 개발환경에서는 아무런 아이디만 넣어도 로그인이 되고, 관리로 로그인하기 체크 박스가 존재한다. 하지만 GAE에 배포하는 순간 실제 구글 계정으로 로그인 한단다. 아직 GAE에 배포는 안해봤다. 그런데.. 개발할 때 실제 구글 계정으로 테스트해보고 싶으면 어쩌지?? 

4. 로그아웃 URL로 제공한다. userService.createLogoutURL()을 사용하면 된다.


저작자 표시
신고
top

TAG GAE, Java

[GAE 시리즈] 1. 구글 앱 엔진 + 메이븐 + IntelliJ 프로젝트 세팅

모하니?/Coding : 2010.08.03 05:21


구글 앱 엔진 시작하기 메뉴얼을 보며 예제를 실습해봤다. 그러나.. 내 입맛에 맞지 않는 구석이 몇개 있었다.

1. 라이브러리를 맘대로 추가할 수 있으니 코딩하는데는 문제가 안되는데 빌드가 보통 앤트를 사용하는 듯하다. 이건 불편하다. 그래서 메이븐을 썼다. GAE가 원하는 프로젝트 구조를 건드리지 않으면서도 필요한 라이브러리는 쉽게 가져다 쓸 수 있도록 메이븐을 설정했다. 이전에도 계속 써오던 형태라 대충 복사해서 붙여넣기고 당장 필요없는 라이브러리는 뺐다. (사실 스프링은 남겨뒀다;;)

2. 이클립스 종속적인 가이드였다. 인텔리J도 GAE 플러긴이 있으며 업데이트 사이트를 추가하는 귀찮은 작업 없이도 간편하게 플러그인을 찾아서 설치할 수 있었다.

3. 배포 설정

웹 서버에 배포할 때 프로젝트 이름/out 폴더 밑으로 웹 컨텐츠를 전부 복사해서 배포하게 되어 있는데 난 프로젝트/web에 배포하게 설정했다. 이래야 재배포 하지 않고도 JSP를 수정할 때 마다 바로바로 적용된다. 


저작자 표시
신고
top

TAG GAE, IntelliJ, Java

2010년 계획 (늦은) 중간 점검;;

모하니?/Planning : 2010.08.02 20:40


http://whiteship.me/2556 
  • IELTS general 6.0
  • Java Persistemce with Hibernate 번역
  • Spring Enterprise Recipe 번역
  • 몸무게 표준체형으로;;
  • 회사 시스템 여름까지 개발
  • 오픈소스 프로젝트 개발
  • 커뮤니티 활동 열심히
큰일이다. 이제 몇달 안남았는데 IELTS는 아직 시험도 안봤고 SER 번역은 절반 정도 하고 나서 무한정 쉬고 있고 운동은 전혀 안했고 회사 시스템은 개발중이긴 한데 과연 여름내에 끝낼 수 있을지 미지수.. 오픈소스 프로젝트는 10월까지 어떻게든 될 것 같다.

하아... 이대로 가다간 IELTS 6.0과 운동 그리고 SER 번역까지 미지수다. 번역은 그냥 하면 되니까 가장 쉬운편인데 가장 중요한건 운동과 IELTS 6.0이다. 이 두개에 더 신경을 써야겠다. 정신차려.. 기선아..

저작자 표시
신고
top







티스토리 툴바