Whiteship's Note

'2009/07'에 해당되는 글 51건

  1. 2009.07.31 [SES 프로젝트] 베타 버전 완성~~!! (4)
  2. 2009.07.31 [SES 프로젝트] Self English Study 프로젝트를 시작합니다. (2)
  3. 2009.07.31 090731 Unit 5, 6 정리 (6)
  4. 2009.07.30 [smack] 라이브러리 추가 및 기초 코드 (4)
  5. 2009.07.30 [smack] 구글 토크 봇 - 파일럿 프로그래밍 (2)
  6. 2009.07.30 구글 토크 트위터 봇(bot) 추가하기
  7. 2009.07.30 090730 Unit 3, 4 정리
  8. 2009.07.29 스프링 이메일 확장하기 (4)
  9. 2009.07.29 090729 Unit 1, 2 정리 (6)
  10. 2009.07.28 영어 공부 계획 (2)
  11. 2009.07.28 [하이버네이트] OneToMany에 FetchType.EAGER 사용시 어떤 일이 생길까?
  12. 2009.07.27 아틀라샨 이클립스 플러그인
  13. 2009.07.27 [Mockito] mock 객체 쉽게 만들기 (2)
  14. 2009.07.27 메이븐에서 컴파일이 되지 않을 땐, 인코딩 의심하기 (2)
  15. 2009.07.27 스프링의 이메일 기능 지원과 테스트를 살펴보자 (2)
  16. 2009.07.24 JPA 구현 패턴 (4)
  17. 2009.07.24 한국의 비양심
  18. 2009.07.24 러시아의 양심 (4)
  19. 2009.07.23 약속의 힘 (2)
  20. 2009.07.23 [하이버네이트]롹킹과 성능 사이에 서다. (1)
  21. 2009.07.22 JUnit 4.7 새 기능 @Rule (2)
  22. 2009.07.22 힘들 때 일수록 공부를 열심히 하자.
  23. 2009.07.22 스프링 Roo 1.0.0.RC1 배포~
  24. 2009.07.22 윈도우에서 모나코 폰트 이쁘게 쓰기 (6)
  25. 2009.07.21 에러 잡기 7단계
  26. 2009.07.21 영어 공부하자 (4)
  27. 2009.07.20 내일은 꼭 Monaco 폰트 설치해야지 (8)
  28. 2009.07.20 클래스파일 보기 (5)
  29. 2009.07.17 스프링 시큐리티 2.X -> 스프링 시큐리티 3.X (2)
  30. 2009.07.15 모르겠네.. @_@ (2)

[SES 프로젝트] 베타 버전 완성~~!!

모하니?/Coding : 2009.07.31 16:36


아... 이런 감격적인 순간에는 스크린캐스팅을 찍어야 하는데... 스크린캐스팅은 나중에 집에가서 찍기로 하죠.

이번에는 사용법만 간략히 설명드리죠.

1. SES 베타 버전 친구 추가하기.

구글토크에 SES(s2cmailer@gmail.com)를 추가해 줍니다.


2. 말을 걸어 봅니다. 채팅창에 보이지 않는다면, 검색해서 찾아줍니다.


3. 이제 이걸 가지고 즐겁게 영어 공부를 합니다.

3-1. 일단은 문제를 몇 개 넣어보세요.

q:질문 a:답변

또는

q:질문 a:답변 r:o

형태로 넣어주세요. 이때 주의할 것이 있는데
- q: 왼쪽으로 빈공간이 있으면 안 됩니다.
- q: 와 질문 사이에 빈 공간이 생기면 안 됩니다
- 질문과 a: 사이의 공간은 딱.. 스페이스 하나 입니다. 더도 덜도 안 됩니다.
- a:와 답변 사이에도 빈공간이 들어가지 않습니다.
- r:o를 입력하지 않을 때는 답변 맨 뒤에 빈공간이 오면 안 됩니다.
- 답변과 r:o 사이의 공간도 딱... 스페이스 하나 입니다. 더도 덜도 안 됩니다.
- r:o 뒤에 빈공간이 있으면 안 됩니다.
- r:o에서 o는 영어 소문자 입니다.
- r:o를 입력하면, 질문과 답변을 맞 바꾼 문제도 추가됩니다.
(q:apple a:사과 입력시 q:사과 a:apple 문제도 추가됩니다.)

3-2. 입력한 문제들을 확인해 보세요.

list

간단하죠. 그러면 문제 목록이 쫙.. 나올껍니다.

3-3. 질문을 받으세요.

q

그럼 SES가 질문을 던집니다.

3-4. 답변하세요.

질문에 대한 답을 입력하세요.

끝입니다!. 참~ 쉽죠~잉


꺄오~~~ 만들었어 만들어~~~ 예에~~

ps: TDD로 만들었어요~(러너 뺴고)
top

  1. Favicon of http://toby.epril.com BlogIcon 2009.07.31 16:42 PERM. MOD/DEL REPLY

    일은 언제하는겨?

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2009.07.31 16:46 신고 PERM MOD/DEL

    일은... 이제부터요.(__)/

  2. 머큐짱 2009.07.31 19:33 PERM. MOD/DEL REPLY

    와우~~ 완존 신기~~

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2009.07.31 21:59 신고 PERM MOD/DEL

    ㅋㅋ글쵸

Write a comment.


[SES 프로젝트] Self English Study 프로젝트를 시작합니다.

모하니?/Coding : 2009.07.31 13:30


영어 공부도 스스로 하는거죠. 스스로 할 때 도움이 되는 프로그램을 만들까 합니다. 제가 주로 사용하고 있는 구글토크에 SES를 친구로 등록해주시면 다음과 같은 일을 할 수 있습니다.

1. 문제 추가하기

예제 1)
q:apple a:사과 r:o
=> OK q:apple a:사과 r:o

예제 2)

q:I ____(cycle) home yearterday when a man ____ (step) out into the road in front of me. a:was cycling, stepped
=> OK q:I ____(cycle) home yearterday when a man ____ (step) out into the road in front of me. a:was cycling, stepped

예제 1은 질문과 답변이 바껴도 상관없는 문제를 추가한 것이고, 예제 2는 질문 답변이 바뀌면 안 되는 문제를 추가한 것입니다. r:o로 질문과 답변이 바껴도 되는지 결정하는데, 기본값이 r:x 인거죠.

2. 문제 요청하기

q
=>q:apple

대화창에 q를 입력하면 입력한 문제 중에 랜덤으로 선택해서 질문을 합니다.

3. 답변하기

예제 1)
=>q:apple
사과
=> OK

예제 2)
=>q:apple
몰라...
=> (바보 멍청이 똥개 멍게 말미잘 해삼) a:사과

그냥 답을 입력하면 되며, 맞으면 OK, 틀리면 정답을 알려줍니다.

4. 문제 목록 보기

list
=>
q:apple a:사과 r:o
q:I ____(cycle) home yearterday when a man ____ (step) out into the road in front of me. a:was cycling, stepped

채팅창에 list를 입력하면 화면에 위와 같이 질문/답변 목록을 뿌려줍니다.

5. 초기화하기

clear
=> clear!

clear를 입력하면 저장해두었던, 문제들이 모두 날아가고, 응답으로 clear!를 출력합니다.

--------------------------
오늘은 일단 여기까지 만들어서 구글토크에 올려두는 것이 목표고 현재까지 생각난 추가로 할 일들은 다음과 같습니다.

1. 메시지 바인더를 추가할 것.
2. 특정 문제 수정.
3. 특정 문제 삭제

top

  1. Favicon of https://helols.tistory.com BlogIcon is윤군 2009.07.31 14:03 신고 PERM. MOD/DEL REPLY

    봄싹용도 하나 .. 제작 해주삼..ㅋㅋ

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2009.07.31 14:11 신고 PERM MOD/DEL

    봄싹용도 만들어야지ㅋㅋ
    재밌어 재밌어~ 완전 재밌어~

Write a comment.


090731 Unit 5, 6 정리

모하니?/English : 2009.07.31 09:35


Unit 5. Past simple(I did)

과거형은 보통 -ed가 붙는다.
불규칙하게 변하는 동사들도 많다.
의문문 또는 부정문을 만들 때 did/didn't를 사용한다.
do를 주동사로 사용할 때 didn't do/What did you do
be 동사의 과거형은 was/were(주의 할 건, you는 단수든 복수든 were)
I/he/she/it was
we/you/the were

외울 문장

1. Did you go out last night or were you too tired?
2. Yes, I went to the cinema, but I didn't enjoy the film much
3. I didn't do anything.
4. Was the weather good when you were on holiday?

틀린 문제 7

I never have lunch --> 과거형으로(she)
=> She didn't have lunch.

She never had lunch라고 써서 땡.

불규칙 동사 변화
teach -> taught
catch -> caught
spend -> spent
leave -> left

___________? Yes, but it was very hot - sometimes too hot.
=> Was the weather good?

yes it was로 대답을 했으니 Was로 물어봐야 한다.

Unit 6. Post continuous(I was doing)

과거 진행형: 과거에 무엇을 하던 중이었을 때 사용한다.
과거는 이미 종료된 상황을 말한다.
주로 과거와 과거 진행형을 같이 사용해서 과거에 무엇을 하던 중에 어떤 일이 있었다는 것을 표현한다.
순차적인 발생한 사건들을 이야기 할 떄는 과거형을 사용한다.
특정 동사는 과거 진행형을 사용하지 못한다.(Unit 4 참조)

외울 문장

1. What were you doing at 10 o'clock last night?
2. It was raining when I got up
3. I hurt my back while I was walking in the garden
4. I saw Dave. So I stopped, and we had a chat.
5. We knew each other well.

틀린 문제 3

I ____(cycle) home yearterday when a man ____ (step) out into the road in front of me.
=> was cycling, stepped


나머지 두 개는 역시 인칭 문제

Were you 인데, was you 라고 쓴 것.

'모하니? > English' 카테고리의 다른 글

[BBC News] Naples pizza protected by EU  (5) 2010.02.18
[BBC News] Ukraine and Russia argue about spies  (2) 2010.02.17
[EGIU] Unit 19, 20정리  (0) 2009.09.02
[EGIU] Unit 13, 14 정리  (0) 2009.08.11
[EGIU] 20090807 Unit 9, 10 정리  (0) 2009.08.07
20090801 Unit 7, 8 정리  (2) 2009.08.01
090731 Unit 5, 6 정리  (6) 2009.07.31
090730 Unit 3, 4 정리  (0) 2009.07.30
090729 Unit 1, 2 정리  (6) 2009.07.29
영어 공부 계획  (2) 2009.07.28
영어 공부하자  (4) 2009.07.21
top

  1. Favicon of http://blog.naver.com/j81811 BlogIcon aStRe 2009.08.06 23:52 PERM. MOD/DEL REPLY

    불규칙 동사는 A-A-A / A-B-A-/ A-B-B-/ A-B-C의 형태가 있으니, 무턱 대고 외우지 말고 형태에 맞게 쭉쭉외우길;; 난 그래도 중학교때 미친듯이 외워 둬서 불규칙이 어렵진 않은뎅..
    그나저나 텝스나 한 번 볼까? 몇 점이나 나올지..OTL이겠지? 예상 100점 정도 떨어지겠지?
    작히가 먼저 본 후에 봐야 겠다. ㅋ

    Favicon of http://whiteship.tistory.com BlogIcon 2009.08.07 00:11 PERM MOD/DEL

    그냥 문제집을 실전처럼 풀어서 테스트 해보지뭐..
    나도 중딩때 외웠었는데 다 까먹었어 @_@

  2. Favicon of http://blog.naver.com/j81811 BlogIcon 아쓰 2009.08.07 01:57 PERM. MOD/DEL REPLY

    뭐.. wish u want U can!
    go get'em!!!

    Favicon of http://whiteship.tistory.com BlogIcon 2009.08.07 08:07 PERM MOD/DEL

    늦게도 잤네;;
    그래서 아직도 못 일어나고 있구만;

  3. Favicon of http://blog.naver.com/j81811 BlogIcon 아쓰 2009.08.07 10:24 PERM. MOD/DEL REPLY

    난 흡혈귀인지 몰라...박쥐형인간..

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2009.08.07 21:50 신고 PERM MOD/DEL

    ㅇㅇ

Write a comment.


[smack] 라이브러리 추가 및 기초 코드

모하니?/Coding : 2009.07.30 16:40



교묘하게 비번을 가렸습니다. 후훗. 저 계정은 저희 스터디에서 쓸 계정이기 때문에 유충되면... 다른 아이디를 만들면 됩니다.ㅋㅋ

참조: http://www.andrejkoelewijn.com/wp/2008/12/30/using-google-talk-from-java-example/

위 코드를 참조했고, 라이브러리는 일단 메이븐 리파지토리를 추가해줍니다.

        <repository>
            <id>m2-repository-smack</id>
            <url>http://maven.reucon.com/public</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>

다음으로 의존성을 추가해 줍니다.

        <dependency>
            <groupId>org.igniterealtime.smack</groupId>
            <artifactId>smack</artifactId>
            <version>3.0.4</version>
            <exclusions>
                <exclusion>
                    <groupId>javax.servlet</groupId>
                    <artifactId>servlet-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.igniterealtime.smack</groupId>
            <artifactId>smackx</artifactId>
            <version>3.0.4</version>
            <exclusions>
                <exclusion>
                    <groupId>javax.servlet</groupId>
                    <artifactId>servlet-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

끝~ 3.0.4 버전 말고 더 최신 버전도 나온 듯 한데.. 그건 아직 안 받아봤습니다.
top

TAG smack
  1. Favicon of http://toby.epril.com BlogIcon 2009.07.30 18:05 PERM. MOD/DEL REPLY

    테스트는 어딨어?

    Favicon of http://Whiteship.me BlogIcon 2009.07.30 18:44 PERM MOD/DEL

    이제부터 만들아야죠

  2. Favicon of http://toby.epril.com BlogIcon 2009.07.30 21:16 PERM. MOD/DEL REPLY

    테스트-이제부터-개발(TED) 방식이네.

    Favicon of http://whiteship.tistory.com BlogIcon 2009.07.30 22:37 PERM MOD/DEL

    파일럿-펄스트-개발(FFD) 방식이에요

Write a comment.


[smack] 구글 토크 봇 - 파일럿 프로그래밍

모하니?/Coding : 2009.07.30 16:04


구글 토크 봇을 만들고 싶어서 이것 저것 찾아보다가 결국엔 가장 중요한 사이트인 http://www.igniterealtime.org/ 이곳이 사이트 점검 중이라 막막해졌습니다. 이 사이트에서 제공하는 Smack(자바로 XMPP 프로토콜을 사용할 수 있게 해주는 프레임워크)을 사용해야 조금이라도 더 편하게 봇을 만들 수 있을텐데 사이트가 막혔으니..

'XMPP와 Jabber 책을 보면서 코딩해야되는건가... 아이 귀찮아... 하지 말까...' 하는 고민에 빠졌습니다.

그러나~~ 저 사이트에는 못 들어가더라도 누군가 메이븐 jar를 어느 리파지토리엔가는 올려놨겠지.. 그래! 그냥 라이브러리를 받고 관련 아티클 찾아서 코딩해보자~. 마음 먹고.. 구글신을 통해 이것 저것 찾아본 결과..


자바 코드로 구글토크에 접속해서 제 계정으로 메시지 하나(hello 기선)를 보내놓고 나가버리는 봇을 코딩 해볼 수 있었습니다. 음하하핫 재밌어요 재밌어~~ 이걸로 구글 토크 봇만들기 파일럿은 성공했다고 봐도 되겠습니다.

보아하니.. 서버 프로그래밍을 해야 할 것 같은데, 동시성 제어도 하고 이것 저것 많은 공부가 될 듯 하네요. 요즘 한참 인기가 상승하고 있는 아이폰 프로그래밍을 해볼까 생각했었는데, 그럴 여유가 없겠군요.

만들고 싶은건 요즘 공부중인 영어 문장들을 한글로 물어보면 저는 영어로 답변을 해주고 그럼 서버에서 그 영어가 맞았는지 틀렸는지 판별해주는.. 그런 영어 학습 봇입니다. 오늘 외울 문장들을 저장할 수 있는 기능도 있어야겠고, 전체 목록을 보여주는 기능도 있어야 하고.. 뭐 기타 등등 이건 한 번 정리를 해봐야겠네요.

또 스터디용 봇. study? 라고 치면 봇이 이번주 몇시부터 몇시까지 어디서 무슨 스터디를 한다고 정보를 주는거죠. 스터디 공지도 메시지로 쫙 뿌려주구요.

캬~~

소스코드와 Smack 라이브러리를 메이븐으로 추가하는 방법은 비밀입니다. 영원히~ 어쩔 수 없어요. 이제 세상의 이치에요.
top

  1. Favicon of http://toby.epril.com BlogIcon 2009.07.30 21:17 PERM. MOD/DEL REPLY

    내가 최초로 산 Manning책이2002년에 산 Jabber 책인데.. 추억의 기술이로구만.

    Favicon of http://whiteship.tistory.com BlogIcon 2009.07.30 22:40 PERM MOD/DEL

    http://www.igniterealtime.org/ 여기 이제 열렸네요. 아우... 낮에 그렇게 들어가고 싶어서 안달이 났었는데...

    책 구하기 힘들던데;; 그걸 벌써 2002년에 보셨군요;; 어익후@_@

Write a comment.


구글 토크 트위터 봇(bot) 추가하기

Good Tools : 2009.07.30 13:25


참조: http://www.labnol.org/internet/most-useful-google-talk-bots/4347/

예전에 사부님이 알려주신 구글 토크 사전 봇 en2ko.dict@bot.talk.google.com을 추가해서 요긴하게 쓰고 있는데, 갑자기 jabber와 xampp에 관심이 가서 자료를 찾아 보던 중 윗글을 발견했습니다.

그 중에 하나로 트위터가 있더군요. 간단하게..

twitter@twitter.com

이 녀석을 친구추가 해주시면.... 안 됩니다.

초대를 받아주질 않네요. 일정 시간이 되면 친구 검색해서 일괄처리하나...@_@ 기다려보죠. 뭐.

낚아서 죄송합니다~ㅋㅋ

top

Write a comment.


090730 Unit 3, 4 정리

모하니?/English : 2009.07.30 09:19


Unit 3. Present continuous and present simple 1

현재 진행형: 말하고 있을 때를 기준으로 어떤 일이 벌어졌지만, 아직 끝나지 않았을 때 사용.
현재형: 일반적이거나 반복적으로 일어나는 일을 말할 때 사용.
be + Always + -ing: 자주(very often) 어떤 일이 발생할 때 사용.
Always + be: 항상 어떤 일이 발생하거나, 그렇지 않을 경우에 사용.

외울 문장

1. The water is boiling. Can you turn it off?
2. Water bolis at 100 degrees Celsius.
3. The population of the world is increasing very fast.
4. Every day the population of the world increases by about 200,000 people.
5. You're always watching television.
6. I always go to work by car.

틀린 문제 갯수 4.

Paul is never late. He's always getting to work to work on time.
=> He always gets

앞 문장에서 never를 사용했기 때문에, 현재형을 써야 함.

Hurry up! Everybody ____ (wait) for you.
=> is waiting

Everybody는 단수형이다.

나머지 두 개 중 하나는 인칭 단복수 구분을 못했다.
나머지 하나는 stay에 s를 붙을 때 staies라고 했다. -_-;;; stays인데.

Unit 4. Present continuous and present simple 2

현재 진행형을 사용할 수 없는 동사
like love hate want meed prefer
know realise suppose mean understand believe remember
belong fit contain consist seem
Think가 'belive' 또는 'opinion'의 의미일 때는 현재형.
Think가 'consider'의 의미일 떄는 진행형.
'be + being + 행위'는 원래는 그렇치 않은데 특이한 행동을 할 때 사용한다. 예) 요즘 점점 싸가지가 없어진다.
'be + 행위'는 원래 그럴 때 사용한다. 예) 원래 싸가지가 없다.
지각 동사(see hear smell taste)도 진행형을 쓰지 않는다. 주로 can과 조합을 이룬다.
Look, Feel은 쓰기 나름. 진행형과 현재형 모두 사용할 수 있다. 주의 할 것. 빈도부사(ex. usually)와 함께 쓰면 현재형을 써야한다.

외울 문장
1. I'm feeling hungry. or I'm hungry
2. I want something to eat.
3. What do you think about my plan?
4. I'm thinking about what happened. I often think about it.
5. I can't understand why he's being so selfish. He isn't usually like that.

틀린 문제 갯수. 6

I'm feeling hungry. Is there anything to eat.
=> 맞는 문장.

look과 feel은 진행형이나 현재형 둘 다 혼용할 수 있다.

Excuse me. (anybody / sit / there)? _____________
=> Is anybody sitting there?

흠.. 자리가 누군가 현재 앉아있다면 눈에 보일텐데 이걸 왜 진행형으로 물어볼까..생각하고 현재형을 썼었다.
하지만, 그 자리가 평생 그 사람 건 아니니까 자리에 아무도 없더라도 진행형으로 물어보는게 맞나보다.

Why ins't Steve at work today? ___________ ill?
= is he

is he being을 썼었다. 아파지는게 아니라 그냥 아픈거니까 being은 빼는게 맞나보다.

나머진 세 개는 또 인칭, 단 복수 구분을 못했다. 정말 이젠 실수가 아니라 몰라서 틀린것 같이 느껴진다.

좋아. 달리자~ 달려~

'모하니? > English' 카테고리의 다른 글

[BBC News] Naples pizza protected by EU  (5) 2010.02.18
[BBC News] Ukraine and Russia argue about spies  (2) 2010.02.17
[EGIU] Unit 19, 20정리  (0) 2009.09.02
[EGIU] Unit 13, 14 정리  (0) 2009.08.11
[EGIU] 20090807 Unit 9, 10 정리  (0) 2009.08.07
20090801 Unit 7, 8 정리  (2) 2009.08.01
090731 Unit 5, 6 정리  (6) 2009.07.31
090730 Unit 3, 4 정리  (0) 2009.07.30
090729 Unit 1, 2 정리  (6) 2009.07.29
영어 공부 계획  (2) 2009.07.28
영어 공부하자  (4) 2009.07.21
top

Write a comment.


스프링 이메일 확장하기

모하니?/Coding : 2009.07.29 21:49


Gmail의 SMTP를 이용하여 회원 가입시 메일을 보내서 회원 인증 링크를 보낸다. 그리고 해당 링크를 클릭할 시 회원 가입을 승인한다.

이러한 요구사항이 있습니다. 여기서 앞부분에 스프링 이메일을 사용하여 기능 구현을 하려고합니다.

먼저 GmailSender라는 녀석을 만들었습니다. 그러나 그런 클래스는 필요가 없었습니다. host, port, username, password만 설정하면 스프링이 제공하는 JavaMailSender가 GmailSender와 같은 녀석이 되기 때문이죠. 혹여나 그런 설정 이외에도 send()의 결과를 확인하고 싶어서 boolen 값을 반환해주도록 JavaMailSender의  send 메서드를 try-catch로 랩핑한 클래스를 만들었습니다. 하지만, 생각해보면 어차피 MailException은 런타임 예외기 때문에 false를 반환한다는 건 불가능한 일입니다. 오직 true 값을 반환하거나/MailExcpetion을 던지는 메서드가 되고 마는데... 이런 녀석이 존재할 필요가 있을까 싶어서 없애기로 결정했습니다.

없앨 코드 1.

    public boolean send(SpringSproutSimpleMailMessage mailMessage) {
        try {
            mailSender.send(mailMessage);
        } catch (MailException e) {
            throw e;
        }
        return true;
    }

또 하나 떠오르는 녀석은 SignupMailSender입니다. 이 Sender는 특정 Member를 인자로 받으면 해당 Member의 email로 Signup 관련 URL을 만들어서 보내주는 녀석입니다. 하지만 이 녀석도 잘 생각해보면, Sender의 책임이 두 가지가 되고 말았습니다. SRP를 위반하게 된거죠. 메시지를 만드는 일과 메일을 보내는 일이 합쳐졌습니다. 따라서 아래 코드의 대부분은  MailMessage 쪽으로 넘기는게 좋겠습니다.

리팩토링할 코드 2

    public boolean sendConfirmMail(Member receveMember) {
        List<Member> receives = new ArrayList<Member>();
        receives.add(receveMember);
        String authUrl;
        try {
            authUrl =
                    "http://localhost:8080/springsprout2/signupconfirm.do?email="+
                    URLEncoder.encode(receveMember.getEmail(), "UTF-8") +
                    "&authCode="+
                    URLEncoder.encode(receveMember.getAuthCode(), "UTF-8");
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException("can not encoding url", e);
        }

        SpringSproutSimpleMailMessage message = new SpringSproutSimpleMailMessage(
                "[봄싹 SpringSprout] 사용자 인증 메일",
                "사용자 계정을 활성화 하려면 다음 링크를 클릭하세요. <a href=\""+authUrl+"\">"+authUrl+"</a>",
                receives);
        return mailSendService.send(message);
    }

마지막으로 한 개의 클래스가 더 떠오르는데, 바로 위에 보이는 MailMessage를 확장한 S3M2(SpringSproutSimpleMailMessage) 클래스입니다. 하지만 이 클래스의 이름에서 클래스가 무슨 일을 하는지 의도를 파악하기가 힘듭니다. 이 클래스는 생성자로 subjer, text, member list를 받아서 from, subject, text, to 등의 속성을 세팅해주는 클래스 입니다. 아쉬운 건 아직 이 녀석 생성자에 단일 member 객체를 받는 생성자가 없다는 것이죠. 그래서 위의 코드를 보면 Member List를 만들어서 보내는 모습을 볼 수 있었죠.ㅎㅎ 이 MailMessage는 봄싹에서 사용할 기본 메일 메시지를 설정하기 때문에, Abstract 클래스로 만들고, 좀 더 구체적인 메시지로 가입승인메시지(SignupConfirmMailMessage) 같은 녀석이 그것을 확장하는 것이 좋아보입니다. 그러면 클래스의 이름에서 의도도 알 수 있고, S3M2에 있던 과중한 업무도 분담이 될테니 말이죠.

결국 아래와 같은 구조가 될 듯 합니다. 오늘 밤... 코드를 조금 뜯어 고쳐야겠습니다. 새기능 만들것도 많은데 이번 주는 뜯어 고치는데 시간을 다 쓰네요~ 유후~


ps: 참..오늘의 영어과제부터 하고나서
top

  1. Favicon of http://toby.epril.com BlogIcon 2009.07.29 22:28 PERM. MOD/DEL REPLY

    달려

    Favicon of http://whiteship.tistory.com BlogIcon 2009.07.29 22:58 PERM MOD/DEL

    두번 이나..

  2. Favicon of http://toby.epril.com BlogIcon 2009.07.29 22:28 PERM. MOD/DEL REPLY

    달려

    Favicon of http://whiteship.tistory.com BlogIcon 2009.07.29 22:58 PERM MOD/DEL

    달려야 하나요.

Write a comment.


090729 Unit 1, 2 정리

모하니?/English : 2009.07.29 10:22


Unit 1. Present continuous(현재 진행형)

- be + -ing 로 현재 진행을 나타낸다.
- 뭔가를 시작했지만, 아직 끝나지 않았을 때 사용한다.
- 꼭 말하는 당시 하고 있지 않아도 된다.
- today/this week/this year와 함께 쓸 수 있다.
- 현재 어떤 일이 발생했을 때 사용하며, 특히 다음 단어들과 함께 자주 사용한다.
get/change/become/increase/rise/fall/grow/improve/begin/start

외울 문장

1. I'm reading a really good book at the moment.
2. What's going on?(=What's happening?)
3. It isn't raining any more.
4. You're working hard today.
5. I'm becoming to enjoy it now.

연습문제 틀린 갯수 1개

1. he isn't enjoyng his work at the moment.

dosen't enjoing 이라고 써서 틀림.

문법적으로 첫 번째에 정리했듯이 현재 완료는 be + -ing 형태기 때문에 does가 오면 안 됨.
현재 진행 부정문은 be + not + -ing

Unit 2. Present simple(현재형)

- 일반적인 것들(things in general)을 말할 때 사용한다.
- 3인칭 단수에는 s/es가 붙는다.
- 의문문과 부정문을 만들 때 do/does를 사용한다.
- 빈도를 나타낼 때도 사용한다.
- 무언가 말할 때 그 행위를 언급하기도 한다.
I promise/I suggest/I apologise/I advice/I insist/I agree/I refuse

외울 문장

1. What do you do? (첫 번째 나온 do는 의문문을 만들기 위한 do)
2. How often do you go to the dentist?
3. The cafe opens at 7:30 in the morning.
4. Rice dosen't grow in cold climates.
5. I promise I won't be late.

연습문제 틀린 갯수 5개

1. but I don't use it much.

I doesn't 라고 써서 틀림.

정신 차리자. @_@ I는 1인칭이지 3인칭 단수가 아니자나..

2. Liars are people who dont' tell the truth.

doesn't 라고 써서 틀림.

역시.. 정신 차리자. 복수자나.

3. Vegetarians don't eat meat

doesn't 라고 써서 틀림.

역시.. 복수닷.

4. An atheist doesn't believe in God.

doesn't believe가 아니라 believe라고 써서 틀림.

Atheist의 단어 뜻을 몰라서 문맥적으로 말이 안되게 작성함.
Atheist는 무신론자. a(not) + theo(god) + ist(person)

5. The River Amazon flows into the Atlantic Ocean.

flowes라고 써서 틀림.

발음을 해보자. 불편하다.
s/es 붙이는 것과 관련해서는 Appendix 6를 보자.

Unit 140까지 70일 남았다. 달리자. 하루에 무조건 두 개씩. 하루도 안 빼고 블로그에 정리하기가 목표.
 
목표를 달성하면 상을 받자.. 그런데.. 뭐 받고 싶은게 있어야지.. @_@ 그럴듯한 당근이 있음 좋을텐데...
일단 채찍은 이명박. 한나라당. 조중동.

'모하니? > English' 카테고리의 다른 글

[BBC News] Naples pizza protected by EU  (5) 2010.02.18
[BBC News] Ukraine and Russia argue about spies  (2) 2010.02.17
[EGIU] Unit 19, 20정리  (0) 2009.09.02
[EGIU] Unit 13, 14 정리  (0) 2009.08.11
[EGIU] 20090807 Unit 9, 10 정리  (0) 2009.08.07
20090801 Unit 7, 8 정리  (2) 2009.08.01
090731 Unit 5, 6 정리  (6) 2009.07.31
090730 Unit 3, 4 정리  (0) 2009.07.30
090729 Unit 1, 2 정리  (6) 2009.07.29
영어 공부 계획  (2) 2009.07.28
영어 공부하자  (4) 2009.07.21
top

  1. Favicon of http://http://blog.naver.com/j81811 BlogIcon aStRe 2009.07.29 10:59 PERM. MOD/DEL REPLY

    기초가 튼튼해야죠~ 좀 더 detail 하게 해봐봐..
    어렵지만.. 인칭에서 틀리는건 쫌...

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2009.07.29 11:05 신고 PERM MOD/DEL

    졸려서 그래.. -_-; 어제 12시 넘어서 공부했다고
    설마 몰라서 틀렸겠어.

    Favicon of http://toby.epril.com BlogIcon 2009.07.29 15:13 PERM MOD/DEL

    몰라서 틀렸음 [O]

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2009.07.29 17:27 신고 PERM MOD/DEL

    으윽... 오늘은 다 맞춰버리겠어~~~

  2. Favicon of http://http://blog.naver.com/j81811 BlogIcon aStRe 2009.07.29 11:15 PERM. MOD/DEL REPLY

    그런거 같어..
    어제 너무 피곤해 보이더라~
    난 오늘 부터 tofeling 다시 보고 자기가 주는거 다 풀어 보고
    단어 정리하고 단어 외우고 하려고. 편입 영단어도 같이 외워 버릴라고.
    고등학교때 배웠던거 찾아보고 것도 다시 보고.

    오늘 혼. 비.백. 산. 정신줄 놓였어.

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2009.07.29 11:32 신고 PERM MOD/DEL

    공부하기 전에 건강부터 챙겨.
    한약은 언제 만들러가?

Write a comment.


영어 공부 계획

모하니?/English : 2009.07.28 21:39


읽기부터 자신감이 생길 만큼 충분히 하자.

- 말하는 사람의 속도로 책을 읽어도(1문장 당 1~2초) 이해하고 넘어갈 수 있는 정도.
- 다양한 문법 형태도 구분할 수 있을 정도로 문법 이해 합시다.
- 문장 표현, 어휘 마스타.
- 시드니 셀던 책을 보자.
- 그래머 인 유즈로 문법 공부.

읽기가 어느 정도 된다면 듣기를 하자.

- 원고를 구할 수 있는 짧은 뉴스를 완벽하게 듣는 연습을 하자.
- 받아쓰기.
- 취약한 리스닝 부분을 고쳐나가기
- CNNeZ

말하기, 쓰기는.. 위에 것들을 충분히 하다보면 자연스레 어느정도는 길러지리라 믿는다. 뭐 그건 또 그 때가서 방법을 알려주시겠지/

'모하니? > English' 카테고리의 다른 글

[BBC News] Naples pizza protected by EU  (5) 2010.02.18
[BBC News] Ukraine and Russia argue about spies  (2) 2010.02.17
[EGIU] Unit 19, 20정리  (0) 2009.09.02
[EGIU] Unit 13, 14 정리  (0) 2009.08.11
[EGIU] 20090807 Unit 9, 10 정리  (0) 2009.08.07
20090801 Unit 7, 8 정리  (2) 2009.08.01
090731 Unit 5, 6 정리  (6) 2009.07.31
090730 Unit 3, 4 정리  (0) 2009.07.30
090729 Unit 1, 2 정리  (6) 2009.07.29
영어 공부 계획  (2) 2009.07.28
영어 공부하자  (4) 2009.07.21
top

  1. Richpapa 2009.07.28 22:30 PERM. MOD/DEL REPLY

    저도 읽기에 올인을 했었는데(http://richpaparyan.tistory.com/167), 지금은 생각이 다릅니다. 영어의 요소가 6개라면(어휘, 문법, 리딩, 리스닝, 라이팅, 스피킹) 그 중 리딩-라이팅이 한 묶음이고 리스닝-스피킹이 한 묶음임을 깨달았습니다.

    그런데 아무리 생각해봐도 따로따로 해서는 원하는 영어를 구사하기는 힘들어 보이더라구요. 글쎄 사람마다 스타일이 있어 거기에 맞게 하면 되겠고, 지향하는 목표도 각각 다르겠지만...

    저는 원서사서 읽고 그 원서 오디오북 구해서 듣고 받아쓰고 30분씩 읽고 있습니다. 이것도 하다보니 참... 못할 짓, 몹쓸짓이네요. 그런데 2-3년은 해볼라고 노력중이죠.

    그런데, 기선님은 번역도 하실만큼 리딩은 충분하지 않나요?

    참, 전에 지금까지 학습하신 로드맵을 한 번 부탁한 적이 있는데... 혹시 정리가 되셨다면 공개해 주실 수 있나요?

    Favicon of http://whiteship.tistory.com BlogIcon 2009.07.28 23:21 PERM MOD/DEL

    아핫.. 로드맵 요청하셨던 분이시군요.
    아직 정리해본적이 없어서요;; @_@

    흠.. 번역이랑은 좀 다른 것 같아요.
    기술서적 영어는 DDD같은 책이 나이고서야..
    쉬운편이니까요.

    로드맵이라;; 한 번 그려보지요.

Write a comment.


[하이버네이트] OneToMany에 FetchType.EAGER 사용시 어떤 일이 생길까?

모하니?/Coding : 2009.07.28 20:28


Plan -> PlanDetail 관계에서 Plan 쪽에서 PlanDetail로 OneToMany 관계를 설정하고, fetch 모드를 EAGER로 설정하면,, 엄청난 문제가 생길 수 있습니다. @_@

P 1 <-- PD 1
P 1 <-- PD 2
P 2 <-- PD 3
P 3

이렇게 PD 두 개가 같은 P에 속해있을 경우, P 목록을 뿌리고자, createQuery("from P").list(); HQL로 이렇게 작성하면.. 쿼리는 다음과 같이 날아가게 됩니다.

(양방향 관계에서 mappedby 설정했다고 가정하면..)
~~ from P p left outer join PD pd on p.id = pd.p_id ~~

(양방향 관계에서 mappedby를 설정하지 않았다고 가정하면.. 이건 거의 최악)
~~ from P p left outer join P_PD p_pd on p.id = p_pd.p_id ~~

LEFT OUTER JOIN 인거죠...ㄷㄷㄷ..

결과는 아래와 같은 모습일 겁니다.

P 1 - PD 1
P 1 - PD 2
P 2 - PD 3
P 3 - null

그래서 DB에서는 레코드가 한 줄인데, 화면에는 두 줄이 나타납니다. 크하하하..  그런데.. 이게 .. 이상한 일일까요? 글쎄요. 그런 것 같진 않습니다. P가 가지고 있는 컬렉션을 EAGER 패치로 가져오란 얘기가 곧 DB 관점에서는 P를 왼쪽에 두고 LEFT OUTER JOIN해서 P와 연관 맺고 있는 PD도 가져오란 얘기가 될 테니.. 하이버는 그저 시킨대로 한 죄 밖에는 없습니다. 결국 자연스러운 일입니다.

그렇다면 애초에 원했던 결과는 무엇이었을까요? 바로 P 목록만 가져오는 것이었습니다. 그러려면 P를 가져올 때 PD는 내비두고 오로지 P만 가져오게 해야겠죠. 어차피 P 목록을 보려고 하는데 PD 까지 가져올 필요는 없자나요. 패치모드를 LAZY로 바꾸면 from Plan 같은 HQL을 보내면 아예 join을 하지 않습니다.

~~ from P ~~

아마도 이런 SQL을 보시게 될 겁니다.

논외로  하이버 HQL, Criteria로 발생하는 SQL 쿼리를 이해하는 개발자가 되는 길은 멀고도 험한듯 합니다.

예를 들어 이번 이슈(P->PD)에서 패치모드, 방향성, mappedby의 변화로 생기는 쿼리 형태를 조사하려면 몇 가지 경우의 수를 고려해야 할까요?

- 방향성: 총 2가지(P->PD, P<->PD)
- 패치모드: 총 2가지(P->PD Lazy, P->PD Eager)
- mappedby: 총 2가지(P의 pd에 붙인 @OneToMany에서 mappedby="p")

정답은 그렇다면 2 * 2 * 2 = 8 가지? 글쎄요.

몇 번 해보시면 MappedBy 설정은 거의 영향이 없다는 걸 아실 수 있습니다. mappedby를 하면 좋은 점은 연관 테이블 수를 줄일 수 있다는 것. 하지만 결과에 영향이 없는 이유는 연관 테이블(P_PD)과 PD의 row 수가 같기 때문이죠. P가 PD와 left outer join을 하나, P가 P_PD와 left outer join을 하나 결과는 같으니까요.

따라서 2 * 2 = 4 가지 일까요? 그런데 만약 전제로 했던 P -> PD로의 방향성이 PD -> P 방향성 이라면?? ManyToOne이 되는데, 이때는 어떤 변화가 있을까요? @OneToMany의 fetch 속성 기본값은 LAZY 입니다. 별다른 설정을 하지 않으면 위와 같이 원하지 않았던 결과는 발생하지 않겠죠. 하지만 @ManyToOne의 fetch 속성 기본값은 EAGER입니다. 어떻게 될까요? 무슨 일이라도 생길까요? 앞선 경우처럼 DB에 들어있는 PD의 갯수보다 더 많은 PD의 갯수가 출력될까요?

그렇진 않습니다. ManyToOne 관계니까 그럴리는 없습니다.

PD 1 <- P 1
PD 2 <- P 1
PD 3 <- P 2
            P 3

PD를 왼쪽에 두고 left outer join을 해봤자. 이런 관계라고 할 때 결과는 다음과 같겠죠.

PD 1 - P 1
PD 2 - P 1
PD 3 - P 2

결과 row과 PD row와 동일한 상태가 됩니다. 따라서 ManyToOne에서도 fetch 모드를 별도로 설정하지 않더라도 HQL로 from PD를 날리면 예상하던(?) 결과를 얻을 수 있습니다. ㅎㅎ 재밌지요.
top

Write a comment.


아틀라샨 이클립스 플러그인

Good Tools : 2009.07.27 21:52




http://www.atlassian.com/software/ideconnector/eclipse.jsp

앗.. 몰랐네~ 좋구만~
top

Write a comment.


[Mockito] mock 객체 쉽게 만들기

모하니?/Coding : 2009.07.27 21:15


이지목(easymock)을 사용할 때는 인터페이스의 목만 만들 수 있어서 불편했습니다. 물론, 이지목 확장팩(?)을 이용하면 클래스의 목객체도 만들 수 있었는데, 별도의 라이브러리를 추가해야 하는것이.. 좀 귀찮았죠. 요즘은 어떤지 몰겠습니다. 라이브러리 버전 올리면서 통합 할 법도 한데 말이죠.

암튼.. 저는 이지목보다 조금 더 간편하고 직관적인 라이브러리인 목킷투를 사용하고 있었는데, 예전에 살짝 공부한 상태에서 다시 별로 안 썼더니 그새에 많은 변화가 있었더군요. 그 중 가장 큰 변화가 애노테이션인 듯 한데요. 애노테이션을 이용해서 목객체를 아주 편리하게 만들 수 있었습니다.

@RunWith(MockitoJUnitRunner.class)
public class MemberServiceTest {

    MemberService memberService;
   
    @Mock MemberRepository mockMemberRepository;
    @Mock SignupSendService mockSignupSendService;

    @Before
    public void make() throws Exception {
        memberService = new MemberService();
        memberService.repository = mockMemberRepository;
        memberService.signupSendService = mockSignupSendService;
        assertNotNull(memberService.repository);
        assertNotNull(memberService.signupSendService);
    }

...

}

끝입니다. mock(MemberReposiroty.class); 같은 static 메서드 호출(이클립스에서 junit은 static import를 지원하지만 mockto는 지원하지 않아서 수동으로 static import 문을 적어줘야 하는 수고가 있죠.) 없이도 목 객체를 만들어(?) 사용할 수 있습니다. 그 비밀은 바로 @Runwith의 MockitoJUnitRunner에 있지요. 저 러너 설정하는 것이 귀찮다면 JUnit @Before 메서드에서 MockitoAnnotations.initMocks(this); 를 직접 호출해도 되지만, 개인적으로는 이걸 없애고 @RunWith를 사용하는 편이 코드가 더 깔끔한 듯 합니다.

목킷투~ 괜찮다~~
top

TAG @Mock, Mockito
  1. Favicon of http://toby.epril.com BlogIcon 2009.07.27 21:32 PERM. MOD/DEL REPLY

    인생을 넘 쉽게 살려는거 아냐

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2009.07.27 21:55 신고 PERM MOD/DEL

    그런가봐요. 전 쉬운게 좋아요. 개발도 쉽게 쉽게~

Write a comment.


메이븐에서 컴파일이 되지 않을 땐, 인코딩 의심하기

Build/Maven : 2009.07.27 12:59


mvn compile을 했는데.. 다음과 같은 에러가 발생하는 경우가 있습니다.


직관적으로 인코딩 문제인지.. 의심할 수가 없는 에러 메시지지만, javac를 이용해서 직접 컴파일을 하려고 들면 한글이 깨진 상태로 컴파일이 되지 않는 모습을 볼 수 있습니다.

구글신을 통해 같은 문제를 겪은 분의 글을 보고 이 문제 원인을 알 수 있었습니다. 어딜가나.. 이놈의 인코딩 문제는 정말 괴롭습니다.

해결책은 매우 간단합니다. 메이븐 컴파일러 플러그인의 configuration에 encoding 엘리먼트를 추가해주면 해결됩니다.

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>


top

  1. Favicon of https://helols.tistory.com BlogIcon is윤군 2009.07.27 14:22 신고 PERM. MOD/DEL REPLY

    설마 햇는데...ㅋ
    이놈이;;ㅋ 문제엿네요 ;ㅋ 무튼 ㅊㅋ ㅋㅋㅋ

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2009.07.27 17:17 신고 PERM MOD/DEL

    인코딩 문제 지겨워 지겨워~

Write a comment.


스프링의 이메일 기능 지원과 테스트를 살펴보자

Spring/etc : 2009.07.27 12:20


스프링이 지원하는 이메일은 JavaMail과 JAF라는 것이 있습니다. 사용법은 간단하니.. 다음에 심심할 때 살펴보기로 하고, 지금은 사부님이 올리신 글과 관련 된 부분을 찾아보는게 급선무입니다.

스프링 이메일 기능은 context.support 모듈에 들어있습니다. 주요 클래스는 o.s.mail.javamail에 들어있는 JavaMailSender 인터페이스와 그 구현체인 JavaMailSenderImpl 클래스입니다. 인터페이스의 API를 읽어보면 다음과 같은 내용이 있습니다.

...

Clients should talk to the mail sender through this interface if they need mail functionality beyond SimpleMailMessage. The production implementation is JavaMailSenderImpl; for testing, mocks can be created based on this interface. Clients will typically receive the JavaMailSender reference through dependency injection.

...

The entire JavaMail Session management is abstracted by the JavaMailSender. Client code should not deal with a Session in any way, rather leave the entire JavaMail configuration and resource handling to the JavaMailSender implementation. This also increases testability.

A JavaMailSender client is not as easy to test as a plain MailSender client, but still straightforward compared to traditional JavaMail code: Just let createMimeMessage() return a plain MimeMessage created with a Session.getInstance(new Properties()) call, and check the passed-in messages in your mock implementations of the various send methods.

즉, 이 API를 만든 의도에 사용성 편의 뿐만 아니라, 테스트 편의성도 포함되어 있다는 암시를 읽어낼 수 있습니다. JavaMail의 Session API를 사용하지 않고 스프링의 JavaMailSender를 목킹해서 테스트 하라는 것인데, 왜 그렇게 했는지는 맨 마지막 부분의 JavaMail의 Session API 사용법(Session.getInstance(new Properties())에서 볼 수 있습니다. 바로 static 메서드입니다.

JavaMail 레퍼런스에서 그 사용법을 보면, 다음과 같은 코드로 JavaMail을 이용하는 모습을 볼 수 있습니다.

//메시지를 만들고,,
     Properties props = new Properties();
     props.load(new FileInputStream(propfile));

     Session session = Session.getInstance(props, null);
     MimeMessage msg = new MimeMessage(session);

...

//전송합니다.
    // Set the content for the message and transmit
    msg.setContent(mp);
    Transport.send(msg);

코드 대부분을 생략했습니다. 중요한 부분은 위에 다 나와있습니다. 바로 static 메서드를 사용한다는 것이 중요한 부분입니다.

이런 API 사용을 클래스를 단위 테스트 하려면 막막합니다. 도무지 static 메서드를 호출하는 부분을 mock으로 바꿀 수가 없습니다. 그렇다고 테스트를 하는데 실제로 메일을 매번 보내기도 뭐하고 말이죠. 그래서 테스트 하려면 static 메서드 호출을 사용한 클래스를 거의 다시 만들다시피 구현한 stub을 만들어서 테스트 해야 하는데 이건 엄청난 수고가 필요합니다. JavaMail 예를 들면 거의 Transport를 테스트용으로 다시 구현해서.. sendMessage에서 실제로 메일을 보내지 않고 그냥 보내는 메시지 목록에 메시지만 모아두는 식의 작업이 필요해집니다. 그리고 테스트 할 떄는 그런 스텁 Transport를 사용하는 또 다른 스텁 MailSender가 필요해지겠죠.(실제로 이 작업들은 스프링의 JavaMailSenderTests에서 수행하고 있습니다.)

하지만, 테스트를 편하게 하는 방법이 아주 없는 건 아니었습니다. 오늘 톱님께서 올리신 글을 보면 static 메서드를 호출하는 코드를 비교적 편하게 테스트하는 방법 세 가지를 알 수 있습니다.

하나는 JavaMailSender처럼 static 메서드 호출 부분을 랩핑한 클래스를 만들고, 그 클래스를 목킹한 다음 해당 메서드가 호출되는지 테스트하는 것입니다. 그렇게 만들어 두면, 테스트 하려는 대상이 JavaMail의 Transport.send 같은 static 메서드를 호출하지 않고, 그것을 사용한 JavaMailSender를 사용하기 때문에 JavaMailSender의 mock을 만들고 그 객체의 send가 호출될 때 어떤걸 하라고 mocking 한다던지 해서 호출이 제대로 됐는지, 어떤 메시지가 넘어갔는지 등을 확인할 수 있겠습니다.

두 번째 방법은 로드존슨이 만들었다는 AspectJ를 이용하는 방법이고, 세 번째 방법은 PowerMock을 이용하는 방법인데, 둘 다 결국 바이트코드를 조작해서 static 호출 부분을 mock으로 호출로 교체하는 기술 인듯합니다. 이 두 가지는 일단 논외로 치

결론은.. 스프링의 JavaMailSender를 사용하면 JavaMail의 static 메서드 호출과 관련하여 테스트를 어떻게 작성할까 고민할 필요없이, JavaMailSender를 목킹해서 테스트를 만들면 된다는 것입니다.

덤으로 JavaMail의 static 메서드 호출을 사용한 JavaMailSender의 테스트 클래스를 보면, static 메서드 호출을 하는 클래스에 대한 테스트 실마리를 얻을 수 있습니다. static 메서드를 호출해서 가져오는 객체를 가져오는 부분을 별도의 메서드로 분리하고 그 부분을 테스트 용으로 재구현하고 그것을 테스트에서 사용하는 방법인데.. 이거 이거.. 귀찮아서 원... @_@..  그래서 static은 테스트의 적인가 봅니다. 그래도 이길 수 있는 적이라는거..
top

  1. openmaya 2010.01.18 12:08 PERM. MOD/DEL REPLY

    굉장히 예전에 쓰신글을 이제야 봅니다 ㅋstatic 메서드와 호출관련해서 비슷한 경험을 한적이 있는데요. 다름이 아니라 HTTP호출을 하는 클래스를 static으로 선언한 경우 입니다. 데이터 자체는 openapi를 이용해 가져오고 HTTP 호출을 하기위해서는 인증을 위해 헤더값 추가까지 하는 경우에 하려는 것에 비해 Method클래스 등등 많은 작업이 필요하게 되는데요. 이 부분이 다른 분이 작성한 부분이라서 결국엔 랩핑클래스를 만들고 그 클래스를 테스트 해야 했지요. 이런경우에 단점이 기존의 다른 분이 만드신 코드들은 래핑클래스를 사용하지 않는 상황이라서 코드가 이원화 되어버린 상황이랄까요.

    Favicon of http://whiteship.me BlogIcon 기선 2010.01.19 10:52 PERM MOD/DEL

    "HTTP호출을 하는 클래스를 static으로 선언한 경우"

    어이쿠.. 그렇군요. 스프링 3.0에 추가된 RestTemplate인가하는 클래스랑은 대조적이네요.

Write a comment.


JPA 구현 패턴

Hibernate/etc : 2009.07.24 23:52


http://blog.xebia.com/2009/07/13/jpa-implementation-patterns-wrap-up/

차근 차근 봐둬야 할 글목록이 있군요.

Basic patterns

Advanced patterns


맨 위에 있는 DAO랑 맨 마지막에 있는 Testing만 읽어봤는데, 내용이 괜찮네요. DAO는 현재 사용하는 방식과 비슷하고, 테스트 쪽엔 모르는 것들이 있더군요. ObjectMother랑 Finess를 봐봐야겠습니다.

테스트 데이터를 DBUnit으로 넣을까 ObjectMother를 사용할까.. 고민이로군요. 간단한건 DBUnit으로 XML 데이터 만들어서 넣고, 복잡한 객체 집합은 ObjectMother를 쓸까나?? 아니.. 그냥 둘 중 한 방법으로 쓴느게 햇갈리지도 않고 좋겠죠? 그러고보면 DB 스키마 기반으로 코딩한 것도 아닌데 굳이 XML로 DB 데이터 만들어 넣는건 좀.. 그렇네요. 객체 기반으로 코딩했으니... 테스트 데이터도 팩토리를 이용해서 만드는게.. 어울리는 듯하고.. 흠...

일단은 댄스 연습 좀 하고 자야겠네요.

top

  1. Favicon of https://helols.tistory.com BlogIcon is윤군 2009.07.25 02:53 신고 PERM. MOD/DEL REPLY

    엄청 공부하면 머리커진데요;;; ㅋ

    댄스연습도 하고 ~~ 잼있겠어요;;ㅋㅋ 신혼생활..ㅋㅋ

    Favicon of http://whiteship.tistory.com BlogIcon 2009.07.26 09:39 PERM MOD/DEL

    댄스 재밌쥐~ 스탭~ 스탭~ 롹 스탭~

  2. Favicon of http://blog.lckymn.com BlogIcon Kevin 2009.07.29 00:00 PERM. MOD/DEL REPLY

    전 이 아이디어에
    http://www.ibm.com/developerworks/java/library/j-genericdao.html
    개빈 킹이 쓴 하이버네이트 책에 나온 샘플 코드에 있는 generic parameter 가져오는
    reflection 코드를 참고해서 만들어 썼는데,
    (전엔 주로 JDK 1.4 위주로 써서 generics 하고 별로 안 친했거든요. :) )
    결국 기선님게서 거신 링크에 있는 글이나 그게 그거네요.

    아참, 거기다가 개인적으로 AspectJ를 이용해서
    EntityManager 사용전에 null인지 아닌지
    확인하게 만들어서 쓰고 있습니다. null 체크는 method 마다
    들어가기 때문에, crosscutting concern 으로 분류해 버린거죠.

    이러면 Aspect하나로 Generic Repository 상속해서 구현한
    repository들 전부 null 테스트가 가능해서 편하긴 한데,
    현재는 privileged aspect로 EntityManager field에
    접근할때마다 검사하게 해놔서
    method안에서 EntityManager를 두번이상 사용하는 경우
    null 테스트도 그 갯수만큼 하는 상황이...ㅡ_ㅡ;
    그래서 repository 안에 있는 method별로
    method 실행전에 검사하는걸로 바꾸려고 하고 있습니다. :)

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2009.07.28 21:16 신고 PERM MOD/DEL

    오호.. AspectJ를 이용해서 null 체크를 하는 AOP를 하시는군요. 좋네요~ ㅎㅎ AOP 공부는 쬐끔했어도.. 잘 써먹질 못하고 있는데.. 잘 활용하시는 분들 보면 멋져요~

Write a comment.


한국의 비양심

모하니?/Watching : 2009.07.24 19:46



할 말이 없네요.
top

Write a comment.


러시아의 양심

모하니?/Watching : 2009.07.24 11:28




이제 이런 거 퍼오면 저작권 위반으로 잡혀가서 빨갱이 아니냐고 고문당하다가 죽는건가요?
난 빨갱이가 뭔지도 모르는 세대인데..

'모하니? > Watching' 카테고리의 다른 글

인터넷의 의미 - 친절  (0) 2009.11.17
[WCG 2009] 요즘 하고 있었군요.  (4) 2009.11.13
초고속 로보트 손  (0) 2009.09.15
허경영의 콜미  (0) 2009.08.13
한국의 비양심  (0) 2009.07.24
러시아의 양심  (4) 2009.07.24
콜 오브 듀티(COD) Modern Warfare 2 어여 나와라~  (0) 2009.06.08
프랑스도 멋진 나라구나..  (6) 2009.05.25
핀란드 멋진 나라네요.  (11) 2009.05.21
못살겠다 대한민국  (7) 2009.04.17
한국에도 이런 개그가 통할까?  (0) 2009.01.15
top

  1. Favicon of http://ryys1993.tistory.com BlogIcon 윤성철 2009.07.24 13:33 PERM. MOD/DEL REPLY

    EBS 의 지식채널은 정말 좋은 프로같습니다

    EBS 에서는 좋은걸 참 많이 하는거같네요~~

    역시 교육방송 답습니다.~~.

    Favicon of http://whiteship.me BlogIcon 기선 2009.07.24 14:25 PERM MOD/DEL

    넹 좋은 방송이에요.ㅋㅋ

  2. Favicon of http://moova.tistory.com BlogIcon moova 2009.07.24 14:12 PERM. MOD/DEL REPLY

    나도 빨갱이 모르는세대인데....
    기선이도 EBS보는군.:)
    그나저나 이거 한국 빨랑 떠야제. 빨갱이들이 파랑옷 입고 있고, '잘한다 잘한다' 그러고 앉아있는 세상이니 원.

    Favicon of http://whiteship.me BlogIcon 기선 2009.07.24 14:28 PERM MOD/DEL

    저야 뭐 가끔 돌아다니는 동영상만 봐요.ㅋ
    아마도 제 2의 독립운동이 일어나지 않는 이상 이대로 쭉 살겠죠.

Write a comment.


약속의 힘

모하니?/Thinking : 2009.07.23 21:20


저 같은 경우는 약속을 소중히 여기는 스타일이라, 왠만하면 지키려고 노력하는 편입니다. 그래서 스터디 할 때도 주로 발표를 하겠나고 나서는 편이죠. 그래야 발표하려고 공부를 하니깐 말이죠.ㅋㅋ

이상하게 그냥 해도 될 일인데, 누구랑 약속을 하지 않고 그냥 두면 잘 안하더라구요. 천성이 게을러서 그런거겠죠. 하지만 약속만 하면... 뭔가 참 괴롭지만 지키려고 조금이라도 더 노력을 하고 그러면서 조금이라도 더 목표에 가까워지는 것 같습니다.

약속을 하는 상대도 중요한데, 그냥 자기 자신한테 약속하는 것보다 너무 친하지도 너무 멀지도 않은 상대가 좋은 것 같습니다. 예를 들어 스터디에 참석하시는 분들의 경우. 아주 친하지도 않지만 그닥 멀지도 않죠. 발표를 한다고 해놓고 준비를 하나도 안 해가면... 상상도 할 수 없는 짓이지요.

약속은 여러 명이랑 하는 것이 한 명이랑 하는 것 보다 좋은 듯 합니다. 그래야 더 많은 신용도가 걸려있기 때문에 필사적으로 지키려고 노력할테니까 말이죠.

하지만, 사람에 따라서는 많은 사람들과의 약속도 별거 아닌 듯 구라치고 사는 사람들도 있다는 거...

(톱님 따라하기) 오늘의 결론은... 착한 사람은 피곤하다.


top

TAG 약속
  1. Favicon of http://blog.lckymn.com BlogIcon Kevin 2009.07.23 22:50 PERM. MOD/DEL REPLY

    뜨끔!
    오늘 일정이 꼬이는 바람에 뛰어다니다가 약속을 제때 못 지킨게 있는데...
    반성합니다... ㅠ_ㅠ

    Favicon of http://whiteship.me BlogIcon 기선 2009.07.24 07:25 PERM MOD/DEL

    저도 역시 약속을 다 지키진 못한답니다..ㅋㅋ

Write a comment.


[하이버네이트]롹킹과 성능 사이에 서다.

모하니?/Coding : 2009.07.23 18:09


하이버네이트에 Optimistic 롹킹을 지원해주는 기능으로 버저닝이 라는게 있습니다. version 필드를 하나 만들어 주면 해당 엔티티에 변화가 일어날 때 마다 version 값을 증가시키는데, flush 하기 직전에 해당 객체의 version이 DB에 있는 version 값과 같은지 확인하는 작업입니다. 버전이 같지 않으면 StaleObjectStateException을 던져줍니다.

하이버네이트의 특징 중 하나로 연관 객체의 id만 알고 있다면, 굳이 DB에서 해당 엔티티를 가져오지 않고, id 만 가지고 있는 (가짜) 객체를 만들어서 세팅해주면, 나중에 flush() 할 때 FK로 잘 들어간다는 겁니다. 이런 특징을 이용해서 다대다, 1대다 관계에 있는 것들을 연결 시켜줄 때, DB에 다녀와야 할 쿼리를 상당 수 줄일 수 있습니다.

예를 들어, Member 정보를 추가할 때 Member가 속한 Group 정보를 선택한다고 했을 때, Group 목록을 가져오는 쿼리를 보내서 Group 목록을 가져오고.. 그 중에 하나를 선택해서 해당 Group의 id를 알아냈다면, 이제 이 id를 가지고 실제 Group을 가져오는 쿼리를 보내서 Group 객체를 꺼내온 다음에 사용해야겠지만...그러지 않고 그냥 새 Group 객체를 만든 다음 id값만 세팅한 상태로 Member에 추가해주면 되는거죠.

Fake Object 참조
  1. 2008/11/27 PropertyEditor 활용 예제 (8)
  2. 2008/11/19 하이버네이트 사용시 Association Fake Object라는 기술을 사용해 보세요. (2)

하지만, 방금 말한 이런 작업은 versioning을 하지 않을 때에나 가능한 이야기 입니다. DB에 flush()가 되는 순간 버전 확인이 이루어지고 version 정보가 없기 때문에 하이버네이트는 이 객체가 transient 객체라는 걸 눈치챕니다. 그리고선 transient를 flush하기 전에 저장하라는 에러를 뱉어내게 되죠.

@Entity
@Configurable
@DomainInfo("권한")
public class Role {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    Integer id;
    @Version
    Integer version;

예를 들어 위와 같은 엔티티가 있는데 이 녀석을 어딘가에서 Fake 객체로 new Role(1); 이런식으로 만들어서 User.addRole(new Role(1)); 이렇게 했다면... 문제가 생기게 됩니다.

그렇다면, versioning을 하지 않는다면 어떻게 될까요? 위에서 얘기한 것처럼 아무런 에러 없이 잘 동작합니다. 즉, 그냥 DB에 들어가버리죠. 해당 id 값은 FK 필드에 고대로 들어간체 말이죠. 하이버는 이 객체가 transient라는 사실을 모릅니다. id를 가지고 있기 때문에 persistent 상태인 줄 알겠죠.

결론은.. 그래서 고민입니다.

version을 그래도 두고 매번 DB에서 가져오도록 할까.. 하지만 version을 빼고 지금처럼 Fake를 사용할지 말이죠.

하이버네이트를 속여서 미안하지만, DB 쿼리를 줄이고 last commit wins를 선택하고 싶어집니다. 굳이 동시 접근을 막고 싶다면, 애초에 접근 자체를 막아버리고 팝업창으로 현재 다른 사람이 작업 중이라는 메시지 정도를 띄우는 pessimistic locking을 해버리고 말지.. 실컷 입력 다 해놓고 확인.. 누르자마자 에러.. 이건 좀.. 사용자가 많이 짜증날 것 같아서 말이죠.

update 할 때만 Session.load(Class class, Serialiazle id, LockMode lockMode)  이용해서,  LockMode.WRITE)로 가져오게 하면 되지 않을런지.. 흠.. 어찌할까나~

ps: 하이버네이트 낙관적인 롹팅을 사용하면서 OSIV 쓸 때는 주의할 것이 있더군요. 그건 이따 집에서..
top

  1. Favicon of http://www.timberlandbaratas.com BlogIcon Mujer Timberland 2012.12.25 12:33 PERM. MOD/DEL REPLY

    Motoconchos, the motorcycles that will honk at you on a whim, http://www.timberlandbaratas.com Timberland, could be the most versatile means of getting from point A to point B, but the potential for injury or theft makes it a resource you should only consider with high guard.Gua-guas, or mini busses, http://www.timberlandbaratas.com timberland, aren't much better; save that you're on four wheels instead of two and no one will try to cop your stuff because everyone is practically sitting on top of one another. Although they require a seriously high level of tolerance, they area cheap mode of transportation.Publicos are similar to taxis except, http://www.timberlandbaratas.com outlet timberland, again, they are shared with other people that you may or may not already know. They are a staple for the Dominican, however, as they offer on of the most cheap and reliable commutes to and from work, http://www.timberlandbaratas.com Hombre Timberland.For tourists, http://www.timberlandbaratas.com Timberland shops, the final and surest transport is Dominican Airport Transfers. They're seasoned, reliable, http://www.timberlandbaratas.com botas timberland, and priced fairly. They cover short to long distances and will usher you from airport to that Dominican Republic luxury resort without skipping a beat.Related articles:


    http://www.iceworld.net/516 Un attentat suicide perpétré

    http://springframework.tistory.com/82 The hotel also has extras for guests to enjoy

Write a comment.


JUnit 4.7 새 기능 @Rule

모하니?/Coding : 2009.07.22 23:21


http://www.infoq.com/news/2009/07/junit-4.7-rules

Rule은 기본적으로 각각의 테스트에 부가적인 기능을 추가할 수 있는 확장 매커니즘이랍니다. 뭔지 잘 감이 오지 않으신다면, 일종의 인터셉터라고 생각하시면 될 듯 합니다. 테스트 메서드에 인터셉터를 적용할 수 있다는 거겠죠. 하지만, 만든 사람이 Rule이라고 하니까 그냥 룰이라고 부르고, 익숙해지는게 좋을 듯 합니다.

기본으로 제공할 룰이 몇 개 있는 듯 합니다.

    *  TemporaryFolder: 테스트 할 때 필요한 파일과 폴더를 만들 수 있게 해주고, 테스트가 끝날 때 만든 것들을 전부 지워준다는군요. 아주.. 아주 아주.. 원하던 기능입니다. 배포되면 바로 써먹어 봐야겠습니다. 최근 만들었던 테스트 중 일부가 파일이랑 폴더를 만들거든요.

    * ExternalResource: 소켓, 내장 서버 같은 외부 자원을 미리 설정할 필요가 있을 때 사용하고 테스트 실행 뒤에 제거 해준다는군요. 주로 이런 테스트를 작성해보질 않았는데, 이 녀석 떄문에 좀 더 쉽게 테스트를 만들 수 있다면 좋겠습니다.

    * ErrorCollector: 테스트가 하나 실패해도 나머지를 계속 테스트 하고 테스트 끝나면 모든 에러를 보고 하도록 해주는 룰

    * ExpectedException: 예측한 예외와 에러 메시지가 발생하는지 확인할 때 사용. 이 녀석도 보통 하는 테스트니까 자주 사용하게 될 듯 하네요.

    * Timeout: 클래스에 있는 모든 테스트에 동일한 타임아웃 적용. 타임아웃은 거의 사용해본 적이 없네요. 흠..


public class DigitalAssetManagerTest {

    @Rule
    public TemporaryFolder tempFolder = new TemporaryFolder();

    @Rule
    public ExpectedException exception = ExpectedException.none();

    @Test
    public void countsAssets() throws IOException {
        File icon = tempFolder.newFile("icon.png");
        File assets = tempFolder.newFolder("assets");
        createAssets(assets, 3);

        DigitalAssetManager dam = new DigitalAssetManager(icon, assets);
        assertEquals(3, dam.getAssetCount());
    }

    private void createAssets(File assets, int numberOfAssets) throws IOException {
        for (int index = 0; index < numberOfAssets; index++) {
            File asset = new File(assets, String.format("asset-%d.mpg", index));
            Assert.assertTrue("Asset couldn't be created.", asset.createNewFile());
        }
    }

    @Test
    public void throwsIllegalArgumentExceptionIfIconIsNull() {
        exception.expect(IllegalArgumentException.class);
        exception.expectMessage("Icon is null, not a file, or doesn't exist.");
        new DigitalAssetManager(null, null);
    }
}

테스트 코드를 보면 countsAssets 테스트에서 TemporaryFolder를 이용해서 파일과 폴더를 만드는 걸 볼 수 있습니다. 저렇게 만든 것들이 테스트가 끝나면 자동으로 없어진다니... 조금 더 테스트가 편해지는 것 같습니다.

두 번째 테스트는 일단 예상하는 예외와 에러 메시지를 ExpectedException한테 알려준 뒤에, 예외가 발생하는 코드를 작성했네요.

음... 뭐.. 그렇군요.

Rule을 잘 써서 Runner들을 대체 할 수 있겠군요. SpringJUnit4~~Runner도 잘하면 Rule로 대체 할 수 있겠지요.

덤으로..  @Configurable 클래스를 테스트 할 때 javaagent 옵션을 설정해줘야 되서 매우 불편한데, 테스트를 실행할 때 특정 자바 아규먼트를 가지고 실행하도록 코드에서 설정이 가능하면 좋겠습니다. 흠.. 이슈에 올려볼까요. 켄트 벡 아저씨가 만들어 주실려나.. @_@
top

  1. Favicon of http://toby.epril.com BlogIcon 2009.07.23 07:07 PERM. MOD/DEL REPLY

    @Rule의 원래 이름은 @Interceptor. 막판에 이름을 바꾼거지.

    Favicon of http://whiteship.tistory.com BlogIcon 2009.07.23 07:22 PERM MOD/DEL

    그렇다더군요~

Write a comment.


힘들 때 일수록 공부를 열심히 하자.



http://polinews.co.kr/viewnews.html?PageKey=0101&num=91800

정말 스트레스 받는 일이다.

어디까지 가려는지 모르겠다.

이럴 때 일 수록 더 열심히 공부하자.

체 게바라는 '억압하는 모든 것에 저항하라'고 했지만..

힘 없는 정의는 무능이고 정의 없는 힘은 폭력일 뿐이라고 하지 않았나...

난 무능하다.

그러니까 열공하자.


top

Write a comment.


스프링 Roo 1.0.0.RC1 배포~

Spring Roo/etc : 2009.07.22 18:39


스프링 루 1.0 RC1이 배포됐네요.

    * Bundlor project support (written by Adrian Colyer)
    * Extra developer support on Windows (thanks to Rod Johnson)
    * Support for relationships in dynamic finders
    * Default error handlers for web applications
    * DataSource improvements (now DBCP by default, plus JNDI support)
    * No more beeps from the Roo shell under Windows
    * Enhanced development mode diagnostic information

주요 개선 사항들입니다. GA 버전으로 잡혀있는 이슈가 3개 밖에 안 되는걸 보면, 8월 초 쯤에 1.0 정식 버전이 배포 될 듯한 느낌이네요.

윈도에서 삑삑 소리 나던게 없어졌나 보군요.ㅋㅋㅋ
암튼 참 재밌는 프로젝트 같아서 요기 조기 뜯어보고 싶어지네요.

'Spring Roo > etc' 카테고리의 다른 글

스프링 Roo 1.0.0.RC1 배포~  (0) 2009.07.22
Getting Started with Spring Roo  (0) 2009.05.28
스프링 Roo petclic 예제 실행 성공  (2) 2009.04.30
Roo 설치하기  (0) 2009.04.30
스프링 Roo 프로젝트 이름 투표하기  (0) 2009.04.30
Spring Roo가 나왔습니다.  (0) 2009.04.30
top

Write a comment.


윈도우에서 모나코 폰트 이쁘게 쓰기

모하니?/Coding : 2009.07.22 14:58



디스플레이 설정 -> 화면배색 -> 효과를 클릭하고, 위에 보이는 것처럼 화면 가장자리를 ClearTpe으로 다듬어 주시면 이쁘답니다. 톱님이 알려주셨어요. 땡큐~


캬.. 맥북에서 쓰는 이클립스랑 거의 같아 보이네요. 폰트 10은 좀 커서 9로 줄였습니다. 이제 좀 이쁘게 개발해 보아요.ㅋㅋ
top

  1. Favicon of http://toby.epril.com BlogIcon 2009.07.22 16:08 PERM. MOD/DEL REPLY

    톱님이 짱인듯!

    Favicon of http://whiteship.me BlogIcon 기선 2009.07.22 17:20 PERM MOD/DEL

    그런듯!

  2. Favicon of http://sonegy.egloos.com BlogIcon 소내기 2009.07.22 20:27 PERM. MOD/DEL REPLY

    나도 깔았어!

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2009.07.22 20:32 신고 PERM MOD/DEL

    ㅊㅋㅊㅋ
    완전 이쁘죠ㅋ

  3. Favicon of http://toby.epril.com BlogIcon 2009.07.22 20:44 PERM. MOD/DEL REPLY

    윈도 테마도 맥 테마로 바꺼

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2009.07.22 21:29 신고 PERM MOD/DEL

    리소스 먹히는 것 때문에 그건 안 하려구요.
    예전 노트북에서 지겹게 썼었어요.ㅋㅋ

Write a comment.


에러 잡기 7단계

모하니?/Coding : 2009.07.21 16:09


참조: http://www.makinggoodsoftware.com/2009/06/14/7-steps-to-fix-an-error/

디버깅 왜 중요한가?

디버깅이란 소프트웨어 개발자가 버그를 고치는 행위를 말한다. 훌륭한 디버거가 되는 것은 훌륭한 개발자가 되기 위해 중요한 부분이다.

에러 잡기 7단계

스탭 1: 에러 식별하기

버그가 뭔지 알아야겠죠. "앗 버그다" 이러고 그냥.. 멍~~ 이러고 있으면 안 되겠죠. 무슨 버그인지 에러 메시지를 잘 읽어보거나, 에러를 다시 재현해 본다던가 말이죠.

스탭 2: 에러 찾기

정확히 에러가 어느지점에서 발생하는지 찾아야 합니다. 보통 이클립스 콘솔을 보면 메서드 호출 스택 중에서 프레임워크 패키지로 시작하는 것들 말고, 제가 작성한 패키지로 시작하는 부분을 보면 해당 클래스의 몇 번째 줄에서 예외가 발생했는지도 알 수 있죠. 대부분 그 지점에서 뭔가가 잘못됐을테죠. 아니면 ClassNotFound 같은 건 라이브러리 문제니까 특정 지점을 찾을 필요는 없곘네요. 쉽게 찾을 수 없는 경우 로깅, 디버깅, 작성했던 코드 빼기. 등을 사용해서 버그가 생긴 지점을 알 수 있겠습니다. 테스트를 작성해서 CI를 하는 이유 중 하나가 바로 이 에러가 발생한 지점을 찾을 때 생각해 볼 범위가 테스트에 반비례하기 때문인듯 합니다.

스탭 3: 에러 분석

해당 부분에서 무엇이 잘못됐는지 알아내는 겁니다. 확실하지 않다면 가설을 세워도 좋겠죠.

스탭 4: 분석 증명

이전 단계에서 분석을 했거나, 가설을 세웠다면 그것이 맞는지 테스트 코드를 이용해서 증명하는 단계입니다. 버그를 재현하는 테스트를 작성해서, 실패하는 테스트를 만듭니다. 테스트의 소중함을 알면서도 저는 보통 이 단계를 빼먹곤 하지요.

스탭 5: 연쇄 데미지 방지

분석 증명까지 끝났다면 바로 버그를 수정하는게 아니라, 수정하기 전 상태를 확인합니다. 이전 테스트들을 모두 실행해서 무사히 패스 하는지 확인하는 거죠. 이로써, 지금 수행할 버그 수정 작업이 이전 상태에 또 다른 버그를 만들지는 않는지 확인할 수 있습니다.

스탭 6: 버그 수정

수정하는 거죠~

스탭 7: 검증

모든 테스트를 실행하고 패스하는지 확인.

몇 가지 추천사항

버그와 그 수정 사항을 문서화 하라.
로깅을 하라.
툴을 사용하라.(이슈 트래커, 소스 관리, 디버깅 툴)
top

Write a comment.


영어 공부하자

모하니?/English : 2009.07.21 09:50


일단 시험을 보고, 점수 올리는 것을 목표로 달릴 생각입니다. 시험은 IELTS로. 토익은 안 쳐준다네요. 후훗. 열심히 해서 IELTS 6.5 넘는 걸 목표로 ㄱㄱㅆ 그래야 호주 대학에 들어 갈 수 있다더라구요.

첫 번째 목표는 시험을 보고 현재 수준을 파악하는 것. 좌절하는 것. 내 영어 수준에 화를 느끼는 것.

두 번째 목표는 영어 발표 스터디 참석하기. 어디있는지도 모르고 어떤 제약이 있을지 모르지만, 되도록이면 매주 참석해서 말하기 듣기를 연습 할 것.

세 번째 목표는 매일 매일 학습하기. 문제집도 매일 매일 풀고 단어 공부랑 쓰기 연습 매일 할 것.

네 번째 목표는 데드라인 설정하기. 수준을 파악한 다음 적절한 목표를 정하고 그 목표를 달성하는데 걸릴 시간 설정. 달성하지 못하면 벌칙. 달성하면 다음 목표 설정.

마지막 목표. IELTS 7.0

노력하자.. 노력하자.. 노력하자..

'모하니? > English' 카테고리의 다른 글

[BBC News] Naples pizza protected by EU  (5) 2010.02.18
[BBC News] Ukraine and Russia argue about spies  (2) 2010.02.17
[EGIU] Unit 19, 20정리  (0) 2009.09.02
[EGIU] Unit 13, 14 정리  (0) 2009.08.11
[EGIU] 20090807 Unit 9, 10 정리  (0) 2009.08.07
20090801 Unit 7, 8 정리  (2) 2009.08.01
090731 Unit 5, 6 정리  (6) 2009.07.31
090730 Unit 3, 4 정리  (0) 2009.07.30
090729 Unit 1, 2 정리  (6) 2009.07.29
영어 공부 계획  (2) 2009.07.28
영어 공부하자  (4) 2009.07.21
top

  1. Favicon of http://blog.lckymn.com BlogIcon Kevin 2009.07.22 21:59 PERM. MOD/DEL REPLY

    혹시 호주 대학에 입학하려고 하시는건가요?
    IELTS가 토익보다는 영어 실력 평가하기 좋은 방법이긴한거 같은데,
    이것도 시험이라서, 이 시험을 잘 보는 방법을 공부해야 점수를 올릴수 있습니다.
    즉, IELTS 공부가 영어 실력 향상과 관계가 없거나, 관계가 있어도
    그 효과가 미비할수 있다는거죠. 아니면 영어 공부를 해서 영어 실력을 높여도
    점수가 좋아지지 않는 경우도 있습니다.

    IELTS 점수로 인한 혜택이 있다면, (입사시 혹은 대학 입학 목적, 기타등등)
    시험을 대비해서 공부하시는게 좋지만,
    아니라면, 시험 비용도 만만찮은데, 쟤들 돈 퍼주는게 될 가능성이 있습니다.

    만약 호주 대학 입학이 목적이시라면, IELTS 보다는 다른 방법을 추천합니다.
    문제는 대학에서 쓰는 영어인 Academic English와 일상생활에서 쓰는
    General English 가 차이가 많이 난다는 점인데, Academic English는 따로
    공부를 하지 않으면 아무리 10년이고 20년이고 영어권에 살아도
    실력이 절대 늘지 않습니다.

    진짜 좋은 방법은 IELTS 시험 점수를 받아서 대학 입학 하는거보다
    호주에 있는 Academic English 전용 영어학교에 입학해서
    영어 공부를 하는것입니다. 여기서 일정 레벨이상 통과하면,
    대학 입학 자격이 주어집니다. 그런 학교들은 호주 대학에서 요구하는 수준의
    Academic English를 가르치는데, Presentation 하는 방법부터
    Report, Opinion Text, Graph 설명하는 방법, Essay 쓰는 방법등등을
    제대로 가르칩니다.

    Academic English는 따로 안 배우면 원어민이라도
    잘 할수 있는게 아니라서,
    호주애들 과제한거 보면 이런게 엉망인 경우도 많습니다.
    오히려 영어 학교에서 제대로 배운 유학생들이 나은 경우가 있죠.

    확실한건 IELTS 점수 받아서 입학한 사람하고
    영어학교에서 공부한 사람하고는 그 차이가 꽤 많이 난다는겁니다.
    오죽했으면 요즘은 대학에서 영어 과목을 필수로 가르치더군요.
    학생들 영어가 워낙 엉망이라서... 주로 writing 문제죠.
    (요건 제가 나온 학교 IT과 얘깁니다. :) )

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2009.07.22 22:27 신고 PERM MOD/DEL

    흠. 그렇군요.

    저는 일단 general로 준비해서 영주권을 얻는게 목적이구요. 그 뒤에 호주로 가게 되면 academic을 다시 준비해서 대학을 가려고 했습니다. 시험료도 비싸고 학원비도 비싸서 감당이 안 되네요. 혼자 할 수 있는 건(읽기, 듣기) 혼자하고 쓰기랑 말하기 같은 건 어딘가 있을 법한.. 스터디를 찾아 다닐 생각입니다.

    좋은 정보 감사합니다. academic은 전용 영어 학교를 다녀야겠군요.

  2. Favicon of http://blog.lckymn.com BlogIcon Kevin 2009.07.22 22:53 PERM. MOD/DEL REPLY

    아... 그러시군요. 하긴 진짜 학비가 장난이 아니죠.
    대학도 유학생은 1년에 2만 달러 좀 넘게 들어가는데,
    호주애들은 3년동안 (호주 대학은 영국처럼 3년제) 1만 7천달러 가량이니
    유학생들 1년 학비 수준도 안 되는거죠.
    거기에 일단 다니고 나중에 일하면서 학비를 갚는것도 가능 합니다.

    기선님 정도면 General 6.5는 어렵지 않을껍니다.
    제일 좋은 방법은 호주에서 출판된 IELTS 교재를 구입해서
    공부하시는게 아닐까 싶군요.
    http://www.uts.edu.au/international/ielts/preparation/purchase.html
    책이 저희 학교에서 나오는데, 저희 학교꺼라 추천하는게 아니고
    여기가 시드니쪽 IELTS 시험 총괄하는 곳이라서 알려드리는겁니다.
    시드니에서 시험보면 저희 학교 건물에서 시험을 봅니다.
    UTS: Insearch (UTS부설 어학원및 디플로마 학교) 교사가 채점을 하거나
    스피킹 시험 인터뷰를 하는 경우가 많구요.
    교재 절대 그냥 저거 고르지 마시고, 알아보시고 더 좋은거 있으면 그걸로 하세요...^^;

    시험은 우리나라에서 보는게 호주에서 보는거 보다 좀 쉬운편이라고들 얘기하는데요.
    그렇든 아니든 우리나라에서 보시는게 나을껍니다.
    절대 기선님을 무시하는게 아니고, 혹시 실수라도 해서 (보통 그래서 첫시험은
    시험이 어떤지 알아보기 위해서 그냥 보는 경우가 많아요) 원하는 점수가 안 나오면
    다시 봐야 하는데, 여기 응시자가 폭주해서 몇달을 기다려야 합니다.
    그래서 아예 처음부터 접수를 몇주간격으로 두번 해놓고 시작하는 사람들도 많구요.

    나중에 원하시면, 영어학교 좋은데 알려드릴께요.
    아... 시드니에 한해서요...^^;

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2009.07.22 23:27 신고 PERM MOD/DEL

    ㅋㅋ저 영어 잘 못해요.

    교재는 뭘 보더라도 다 도움이 될 것 같더라구요. 워낙 뭐 아는게 없으니.. 다행히(?)도 인터넷에 자료가 넘쳐서 어제 하루 모은 자료만 벌써 7G가 넘네요.

    시험은 한국에서 굉장히 자주 있는 듯 한데 문제는 응시료죠.너무 비싸서 자주는 못 보겠고 2~3달 텀으로 볼까 합니다.

    열심히 해서 호주가게 되면 영어 학교 소개 부탁드릴꼐요.ㅎㅎ 감사합니다.

Write a comment.


내일은 꼭 Monaco 폰트 설치해야지

모하니?/Coding : 2009.07.20 23:13


모나코 폰트는 맥용 이클립스에서 기본으로 사용하는 폰트입니다. 평소 아주 이쁘고 깔끔하다고 생각만 하고 윈도에 설치할 생각을 못했었는데, 몇 일전 톱님께서 알려주신게 생각났습니다.

http://digg.com/programming/Monaco_Font_Free_for_Windows

여기서 어떻게 타고 들어가면 구할 수 있을 것 같으니.. 일단 링크 하나 걸어둡니다. 오늘도 맥북으로 봄싹 사이트 개발 때문에 끄적 거리다가.. 괄호를 쳤는데 한 눈에 딱.. 구분이 되니 아주 좋습니다.


위 코드는 제이쿼리 탭이며, 탭 내의 링크들이 컨테이너 밖으로 나가지 않고 그 안에 뿌려지게 해주는 코드랍니다. 출처는 제이쿼리 UI 홈입니다.ㅋ

top

  1. Favicon of http://blog.lckymn.com BlogIcon Kevin 2009.07.21 00:26 PERM. MOD/DEL REPLY

    저는 리눅스 쓰는데, 저도 Monaco 사용합니다. :)
    예전에 캐나다쪽에서 나온 OSGi관련된 PPT였던가? 암튼 보다보니 소스코드 부분에
    사용한 폰트가 가독성도 좋고 너무 괜찮길래 찾아봤죠.
    무슨 폰트인지 알턱이 없었지만, 딱보니 이쁜게 "이건 맥이다!"
    싶어서 맥용 fixed width font 찾으니까 모나코가 뜨더라구요.
    그당시 제가 찾은 링크가 이건데,
    http://www.gringod.com/2006/11/01/new-version-of-monaco-font/
    다행히 윈도용 뿐 아니라 리눅스용도 있더라구요.
    혹시 이거보다 더 새버전 아시면 좀... :)

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2009.07.21 09:53 신고 PERM MOD/DEL

    넹ㅎㅎ아마 리눅스 용은 같이 스터디하는 친구들이 구할지 싶네요. 최신 버전 구한 친구가 있으면 알려드리겠습니다.

  2. Favicon of http://justinchronicles.net BlogIcon 쟈스틴 2009.07.21 09:05 PERM. MOD/DEL REPLY

    개인적으로 윈도우환경에서 쓰실 요량이라면 Consolas 폰트를 추천합니다. 오피스2007과 비스타에서 기본적으로 제공하는 폰트이지요. 아마 마이크로소프트 웹사이트 뒤져보시면 찾으실 수도 있겠구요.

    윈도우환경에서 모나코 폰트는 렌더링이 좀 이상하더라구요.

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2009.07.21 09:52 신고 PERM MOD/DEL

    음... 아직 Monaco 폰트를 적용해보지 않았는데요.
    참고하겠습니다. 감사합니다. :)

  3. Favicon of http://kyeomstar.tistory.com BlogIcon 이석겸 2009.07.22 09:13 PERM. MOD/DEL REPLY

    이거 적용해봤는데 첨엔 좀 이상하다가 적응하니 이쁘고 괜춘하다.ㅎㅎ

    Favicon of http://whiteship.me BlogIcon 기선 2009.07.22 12:05 PERM MOD/DEL

    난 해봤다가 영.. 이상해서 다시 원래 폰트로 돌아갔어.
    역시.. 맥북에서 써야 제맛인듯. 캬캬

  4. Favicon of http://blog.lckymn.com BlogIcon Kevin 2009.07.22 21:26 PERM. MOD/DEL REPLY

    걸어 놓은 링크에 윈도용도 있는데, 벌써 찾아서 잘 쓰고 계신 모양이군요. :)

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2009.07.22 22:28 신고 PERM MOD/DEL

    넵ㅎㅎ 디스플레이 설정에서 뭔가를 바꿔줬더니 아주 이쁘더라구요.

Write a comment.


클래스파일 보기

Java : 2009.07.20 17:10


javap -c 클래스파일명(확장자빼고)

예) javap -c Sample

이클립스에서 보려면 네비게이터 뷰에서 타겟 폴더로 이동해서 보시면 되죠.

public class JavaPSample {

    public void test(){
        String a = "a";
        String b = "b";
        String c = a + b;
        String d = "ab";
    }
   
}

이 녀석을 컴파일 한 클래스의 모습니다.

// Compiled from JavaPSample.java (version 1.6 : 50.0, super bit)
public class sandbox.JavaPSample {
 
  // Method descriptor #6 ()V
  // Stack: 1, Locals: 1
  public JavaPSample();
    0  aload_0 [this]
    1  invokespecial java.lang.Object() [8]
    4  return
      Line numbers:
        [pc: 0, line: 3]
      Local variable table:
        [pc: 0, pc: 5] local: this index: 0 type: sandbox.JavaPSample
 
  // Method descriptor #6 ()V
  // Stack: 3, Locals: 5
  public void test();
     0  ldc <String "a"> [16]
     2  astore_1 [a]
     3  ldc <String "b"> [18]
     5  astore_2 [b]
     6  new java.lang.StringBuilder [20]
     9  dup
    10  aload_1 [a]
    11  invokestatic java.lang.String.valueOf(java.lang.Object) : java.lang.String [22]
    14  invokespecial java.lang.StringBuilder(java.lang.String) [28]
    17  aload_2 [b]
    18  invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [31]
    21  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [35]
    24  astore_3 [c]
    25  ldc <String "ab"> [39]
    27  astore 4 [d]
    29  return
      Line numbers:
        [pc: 0, line: 6]
        [pc: 3, line: 7]
        [pc: 6, line: 8]
        [pc: 25, line: 9]
        [pc: 29, line: 10]
      Local variable table:
        [pc: 0, pc: 30] local: this index: 0 type: sandbox.JavaPSample
        [pc: 3, pc: 30] local: a index: 1 type: java.lang.String
        [pc: 6, pc: 30] local: b index: 2 type: java.lang.String
        [pc: 25, pc: 30] local: c index: 3 type: java.lang.String
        [pc: 29, pc: 30] local: d index: 4 type: java.lang.String
}

중간에 보시면 StringBuilder의 append를 사용하는 모습을 볼 수 있는데, 한 줄에있는 + 연산은 StringBuilder의 append를 이용함을 알 수 있습니다. 따라서, 연달아 append를 할 경우에는 굳이 StringBuilder를 사용할 필요 없이 + 연산만으로도 충분할 것 같습니다.

앞에 숫자들은 라인 넘버인것 같고, 그 다음 문자열들(idc, astore, aload, invokevirtual, invokestatic, invokespecial 등)은 JVM 명령어라고 합니다.

ASM, BECL, Javassist 이 세 가지가 대표적인 바이트 코드 조작 라이브러리 인데, CGLIB은 이 중에서 ASM을 사용하고, AspectJ는 BECL을 사용 한다네요.

음.. 기본은 항상 다져야 되나 봅니다. 모르는 것도 많고 예전에 본것도 다 까먹네요.
스펙이랑 자바퍼즐러라도 볼까봐요.
top

  1. Favicon of http://blog.lckymn.com BlogIcon Kevin 2009.07.20 21:19 PERM. MOD/DEL REPLY

    Bytecode에 관심이 있으시다면, Eclipse용 plugin인 Bytecode Outline plugin for Eclipse
    한번 써보세요. :) (아... 이미 쓰고 계시려나?)
    http://andrei.gmxhome.de/bytecode/index.html

    전 Performance 검사라던가, "내가 이거 제대로 하고 있는거야?" 등을
    확인하기 위해 즐겨 쓰고 있습니다. :)

    String의 경우
    String text = "something" + "something else";
    하면 Java Compiler 가 똑똑하기 때문에 합쳐서
    "somethingsomething else" 을 만들어 버립니다. :)

    근데 variable을 추가하면 StringBuilder로 바뀌져.
    String a = "test"
    String text = "something" + "blah" + a + "test" + "something else";
    이렇게 되면, "somethingblah" 까지는 하나로 합쳐서
    StringBuilder 생성하면서 Constructor 파라메터로 넘기지만,
    일단 variable이 등장하면 그 뒤는 다 따로 append됩니다.
    즉, a뒤쪽에 있는 "test" 와 "something else" 부분도 따로 append 되는거죠.

    String test = "a";
    test += "b";
    test += "c";
    이거 하면 추가시마다 메모리가 각각 새로 할당되서 속도가 느려진다는건
    다 아는데, 실제로 compile된 bytecode에서는
    +로 추가 할때마다 StringBuilder가 새로 생성되면서
    글자 추가하고 toString()으로 재할당 하더라구요.
    즉, builder가 두번이나 생성되는거죠.


    Spring이나 Hibernate 같은 frameworks 쓰면 쓸수록 느껴지는게
    나한테 필요한 혹은 내가 만드는 application에 딱맞는 framework를
    개발해서 쓰고 싶다는 겁니다.

    Spring이나 Hibernate가 충분히 편하고 좋긴 하지만,
    저한테 딱 맞는 기능이 없다거나, 어떤건 필요도 없는데
    들어있어서 덩치만 늘어난거 같은 느낌이 든다거나...
    여러가지 일반적인 혹은 흔한 상황을 두루 만족시켜주기 위해서
    당연한 거겠죠.

    그러다 보니 일반적인 용도보다 제게 필요한 녀석을
    하나 만들고 싶은 생각이 드네요.
    그냥 하나라기 보다 어플 종류에 따라 그때그때 변형해서
    쓸수 있도록 해야겠죠.

    암튼 그래서 ASM 좀 사용해 보려고 하는데, 현실은...

    바빠서, 댓글에 적어놓은 String 관련 내용 포스팅도
    못하고... ㅠ_ㅠ (이 말을 4월에도 하고 아직도... ㅡ_ㅡ; )

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2009.07.20 23:27 신고 PERM MOD/DEL

    캬... 이번에도 어김없이 포스팅급 댓글을 주셨네요.ㅎㅎ

    + 연산에 변수가 껴있는 것과 그렇치 않은 것과 차이가 있었군요.

    사실 전 아직까지도 바이트코드엔 별로 관심이 없습니다. 오늘도 톱님께서 위에 내용을 알려주지 않았다면 아마.. 평생 관심을 끄고 살았을지도 모르겠네요.

    조금 들어보고 나니 바이트코드를 직접 조작해서 제니퍼같은 모니터링 툴도 만들고 AspectJ도 그렇게 동작한다고 하니.. 중요한 걸 외면하고 있었단 느낌이 들더라구요.

    흠.. 스프링, 하이네이트. 넘 어려워요. @_@

  2. Favicon of http://blog.lckymn.com BlogIcon Kevin 2009.07.21 00:43 PERM. MOD/DEL REPLY

    저도 바이트코드에 크게 관심이 있었던건 아니구요,
    작년초쯤인가에 스테판이 프로그래밍을 바이트코드 조작해서 한다고 하길래
    아... 프레임워크 만들자면 속도등을 고려해서 그렇기도 하겠구나 라고만
    생각한거 정도에다 말씀드린 성능 검사등등을 위해서 보는 정도였는데
    최근에 "내가 만든 framework가 필요해!" 라는 생각을
    하고 부터 관심'만' 가지고 있습니다. :)
    아... 어서 빨리 ASM을 익혀서...

    근데 생각해 보니 일단 시작은 reflection만 가지고 해도 될것 같아요.
    (가 아니라 이미 그렇게 해서 대충 쓰고 있었네요... @_@; )
    어차피 이것도 필요할수 있는게,
    Android같이 bytecode 조작을 할수없는 환경에서는
    어쩔수 없이 일반 reflection을 써야 할테니,
    Google Guice가 그래서 2.0버전에서는 bytecode 조작 못하는 환경을 위해
    AOP분리한 버전을 따로 내놨죠.

    근데, 스프링과 하이버네이트 잘 쓰는분이
    어렵다고 하시다니요... :)
    역시 겸손하시군요.

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2009.07.21 09:58 신고 PERM MOD/DEL

    넹 저도 리플렉션은 간간히 이용하고 있어요.
    우와.. 구글 쥬스와 안드로이드까지 @_@
    관심갖으시는 기술 영역이 정말 넓고 깊으신듯해요.

    댓글로 많이 배우고 있습니다.
    감사합니다. :)

    스프링 하이버는 이제 조금 유저로써 익숙해진 것 뿐이지 그리 깊게 알진 못한답니다.

  3. Favicon of http://blog.lckymn.com BlogIcon Kevin 2009.07.22 21:24 PERM. MOD/DEL REPLY

    헉! 절대 아닙니다...@_@;;;

    쟁쟁한 제 친구들에 비하면 새발의 피죠...
    http://www.ryanheise.com/tetris/tetris_artificial_intelligence.html
    제 친구는 구글 페이지랭크 알고리즘을 이용해서 테트리스를 가장 효과적으로
    플레이하는 인공지능 프로그램을 개발 했더군요.
    중간에 watch replay 해서 한번 보세요. :)
    웹브라우저용 Java Plugin이 필요합니다.

Write a comment.


스프링 시큐리티 2.X -> 스프링 시큐리티 3.X

모하니?/Coding : 2009.07.17 19:52


하루동안 시큐리티를 두 번 각각 다른 버전으로 적용해보니 차이점이 보입니다.

시큐리티를 확장할 수 있는 포인트가 하두 여러 가지라 그만큼 확장하는 방법도 다양하겠지만, 저는 톱님 코드를 보고 그대로 적용해 봤습니다.

적용하는 방법은 별도의 UserDetailsService와 UserDetails를 구현하는 방법입니다. 그리고 여기서 구현한 UserDetailsService를 빈으로 등록해 주는 거죠.

    <http>
        <intercept-url pattern="/admin/**" access="ROLE_ADMIN" />
        <intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
        <form-login login-page="/login.do"
            authentication-failure-url="/login.do?login_error=t"
            default-target-url="/main.do" />
        <logout logout-success-url="/main.do" />
        <anonymous/>
        <remember-me />
    </http>

    <authentication-provider user-service-ref="customUserDetailsService" />

    <global-method-security secured-annotations="enabled"
        jsr250-annotations="enabled" />

설정은 이렇게 간단해졌지만, 내부에서 해주는 일은 여전히 필터체인프록시 와 여러 개의 필터, 프로바이더, 엔트리포인트 등이 수고 해 줍니다.

일단 위 설정은 2.X 대의 설정인데, 왜냐면, <anonymuos />가 있기 때문입니다. 이 녀석은 익명사용자를 나타내는  IS_AUTHENTICATED_ANONYMOUSLY를 쓸 때 필요한데, 3.X에서는 이 엘리먼트를 사용하지 못합니다. 하지만 IS_AUTHENTICATED_ANONYMOUSLY는 기본으로 쓸 수 있습니다. 클래스가 없어졌거나 패키지 이동을 했을 겁니다.

패키지가 바꼈습니다. 확장해야 할 인터페이스 2개

import org.springframework.security.userdetails.UserDetails;
import org.springframework.security.userdetails.UserDetailsService;

이 녀석들이 3.X에서는

import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;

이쪽으로 옮겨갔습니다. 이밖에도

import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.GrantedAuthorityImpl;

이 녀석들도 같이 이동했습니다. 다행히 클래스 이름이 같기 때문에 마이그레이션 할 때 별 어려움은 없을 것입니다.

마지막으로 인터페이스가 바뀐 녀석이 있습니다. UserDetails는 2.X에서

public GrantedAuthority[] getAuthorities()

이런 인터페이스를 가지고 있었는데. 3.X에서는 List 타입을 반환하도록 바꼈습니다. 배열을 채워줄때는 배열 사이즈를 미리 알아야 하기 때문에 불편한 코딩이 조금 추가되는데, 3.X에서는 사이즈 상관없이 그냥 add만 해주면 되니까 조금 더 간편해 졌다고 느껴지네요.

(톱님 따라 저도) 오늘의 결론
- 시큐리티 2.X에서 3.X로 넘어가는 길이 아주 편한건 아니지만, 그리 불편하지도 않네요.







top

  1. Favicon of http://toby.epril.com BlogIcon 2009.07.17 21:15 PERM. MOD/DEL REPLY

    톱님은 누구야?

    Favicon of http://whiteship.tistory.com BlogIcon 2009.07.17 21:33 PERM MOD/DEL

    글쎄요. 누굴까요?

Write a comment.


모르겠네.. @_@

모하니?/Coding : 2009.07.15 19:07


도메인 객체에 @Configurable을 사용해서 DAO 객체를 주입하는데 하이버네이트 SessionFactory를 만들다가 에러가 납니다... 허헐.. 이것 참..

@Configurable은 그대로 두고, 도메인 객체에 주입했던 DAO들을 주석처리하면 SessionFactory도 잘 만들어 주고 그 뒤엔 나머지 모든 빈들도 다 잘 만들어지고 테스트도 잘 돌아갑니다.

하지만...도메인 객체에 DAO만 주입했다... 하면... 아래처럼 결국은 DAO를 주입한 클래스의 인스턴스를 만들지 못해서 SessionFactory를 만들지 못하고 그로 인해 ApplicationContext도 제대로 만들지 못해서 아무런 테스트가 돌아가질 않습니다.

Caused by: org.hibernate.InstantiationException: could not instantiate test objectkoma.domain.User

이것이 핵심으로 보이는데. 왜 그런지 잘 모르겠네요. 희한한건 스프링 3.0.0.M3을 쓰면 아무 문제 없이 잘 돌아간다는 겁니다. 톱님께서 제공하시는 최신 버전의 스프링으로 버전을 바꾸면 이런 현상이 벌어진다는 겁니다.

몇 가지 추측을 해볼 수 있는데...

1. 스프링 최신버전과 하이버네이트 버전이 맞지 않음.

2. 스프링 최신버전과 AspectJ 버전이 맞지 않음.

3. 최신 스프링 코드에 문제가 있음.

다행스러운건... 정식배포버전은 스프링 3.0.0.M3에서는 무사히 잘 돌아간다는 겁니다. 현재 스프링 의존성 매트릭스를 참조해서 하이버와 Aspectj 버전을 맞춰봤지만.. 여전히 아래와 같은 에러 로그가 떨어집니다.


또하나는 위버와의 궁합이 안맞을지 모른다는 생각인데...

3.0 M 버전들은 배포할 때 with-doc 만 배포하면서 그 안에 weaver들을 포함시켜주지 않았습니다. with-dependencies를 보면 dist/weaver 폴더에 들어있는데 말이죠.

최신 버전에서 위버와 뭔가 궁합이 안맞을 수 있겠다는 생각도 해봤었지만, 최신 위버를 찾을 수가 없어서 뒤로 재쳐두고 있었는데..

문제 실마리가 안 보이네요. @_@
top

  1. Favicon of http://toby.epril.com BlogIcon 2009.07.15 19:29 PERM. MOD/DEL REPLY

    궁합이 문제야...

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2009.07.15 20:00 신고 PERM MOD/DEL

    네 궁합이 문제일듯..

Write a comment.