Whiteship's Note


닷넷에서 DataSource 사용하기

DotNet : 2008.07.21 15:25


1. 컴포넌트에서 끌어다가 놓는다.
2. 프로퍼티창에서 Tables를 클릭해서 테이블 하나를 만든다.
3. Tables 창의 오른쪽 창에서 컬럼들을 추가해준다.

사용자 삽입 이미지

예전에 하루 정도 배운적이 있는데, 기억이 안나서 한참 해맸습니다. 이렇게 해두면 다음에 좀 기억이 잘 나겠죠.

'DotNet' 카테고리의 다른 글

텍스트박스에서 엔터키 누르면 ~~~하기  (0) 2008.07.23
닷넷에서 웹 서비스 참조하기  (0) 2008.07.21
닷넷에서 DataSource 사용하기  (0) 2008.07.21
top

Write a comment.


Late Binding in Java

Spring DM/exercise : 2008.07.20 17:04


참조 : http://neilbartlett.name/blog/osgibook/

OOP의 목적 중 하나는 의존성을 최대한 낮춰서 코드의 재사용성과 유연함을 늘리는 것이다.

자바에서는 인터페이스를 사용해서 이런 목적에 접근 했다. 인터페이스는 불편하고 그것을 구현한 구현체만 바꾸면 인터페이스를 사용하고 있는 클라이언트 코드는 변경할 필요가 없었기 때문이다. 하지만, 한계가 있는데, 객체를 생성하려면 어차피 구현한 클래스를 클라이언트 쪽에서 알고 있어야 한다는 것이다.

그래서, 스캐너의 생성자를 사용해서 문자열을 받고 그 문자열로 분기문을 돌려서 구현체를 기반으로 객체를 만드는 코드를 사용하기도 하는데, 역시나 새로운 구현체가 생기거나 하면, 또 코드를 바꿔야 된다.

이에 대한 대안으로 스캐너를 사용하지 않고, "다른 뭔가"가 그 객체를 제공해주게 하는 것이다. 그래서 등장한게 "Assembler" 다. "Assembler"를 여러 곳에서 만들어 쓰다가 패턴이 발견되었고, 그 패턴을 구현한 프레임워크가 스프링과 구글쥬스다.

이 들을 Dependency Injection 프레임워크라고 한다. (물론 스프링은 그게 전부는 아니지만) 불행히도, 이런 Assembler Pattern도 정적이라는 특성 때문에 몇 가지 문제가 있다. 객체들의 연관 관계를 정적으로 한 번 생성하고 말기 떄문에, 객체 생성 순서를 신경 써야 한다. B가 A 객체를 참조하려면 A 객체를 먼저 만들어야 된다. 그리고 객체간에 상호 참조(Circular Dependency)도 조심해야 된다.

또 다른 문젠 동적으로 업데이트 하는 것이 불가능하다. 이렇게 정적으로 묶여있는 의존성 그래프에는, 아주 작은 객체 연관 관계를 변경하려고 해도 전체 시스템을 껐다가 켜야 한다.

OSGi는 바로 이 문제를 동적인 "서비스"를 이용해서 해결한다.

서비스는 DI 프레임워크에서의 빈 처럼 평번한 자바 객체(POJO)다. 서비스는 하나 이상의 인터페이스 이름으로 OSGi 서비스 레지스트리에 의해 제공된다. 서비스는 다른 서비스를 사용할 수 있고 고정적인 그래프로 묶이는게 아니라, 서비스는 언제든지 동적으로 등록되고 해지될수 있다. 따라서 서비스들 사이의 관계는 임시적인 관계이다.

객체 생성 순서 문제는 다음과 같이 해결한다. B가 A를 필요로 하는 상황에서 B 객체를 만들 때 A 객체가 있는지 화인하고 안 만들어져있으면 이 객체를 이용할 수 있을 때 까지 잠시 대기한다. 그리고 A 객체를 B가 이용하고 있는 도중에 A가 사라지고 새로운 A' 객체를 등록하면 서비스 B한테 이벤트를 날려서 교체하게 해준다.


인터페이스 -> Scanner -> Assembler -> DI Framework -> OSGi


top

  1. 선영욱 2008.07.21 00:42 PERM. MOD/DEL REPLY

    아~OSGi가 그런 내용이였군요.
    저는 옛날부터 뭔가 필요한 때가 아니면 관심도, 찾을려고도 안해서 기선님의 블로그에서 요즘 OSGi만 나왔는데도 Pass했었는데, 윗 글을 통해서 중요한 정보를 얻은 것 같습니다.
    이거~기선님 아티클 처음부터 읽어봐야 겠네요. ^^;;
    감사합니다.

    Favicon of http://whiteship.tistory.com BlogIcon 기선 2008.07.21 00:53 PERM MOD/DEL

    사실 제 아티클이라고 할 순 없죠. 전 그냥 제가 읽은 것을 요약한 것일 뿐, 저 글들은 참조 링크에 걸어둔 본문을 참조 요약한 것입니다.

Write a comment.


Whiteship's 스프링 DM 레퍼런스 1.0 m3 배포

Spring DM/etc : 2008.07.20 12:20



지난 배포 뒤에 시간좀 오래 걸렸습니다. 크게 달라진 건 없고, 10장과 Appendix A, B, C, D, E를 추가했습니다.


생략한 표들을 추가하는 작업까지 완료하면, 1.0 정식판이 완성 될 것 같습니다.
top

Write a comment.


AnyFrame 프레임워크에 대한 소견

모하니?/Thinking : 2008.07.19 22:07


말 그대로 소견입니다. 제가 뭐 프레임워크를 논할 만큼 경력이 있거나 대단한 개발자도 아니고, 이제 막 개발 7개월차인 개발자일 뿐입니다. AnyFrame을 보고나서 느낀 점들을 조금 더 일반화해서 생각을 정리해봤습니다. 소스 코드를 보다가 화가나서 Anyframe 보다가 흥분 해버렸네요. 이런 글도 적었었지만, 지금은 저에게 좋은 교훈이 되어준 것에 대해 고마운 감정도 생깁니다.

프레임워크에 대한 소견들은 KSUG 포럼에 정리해 두었습니다. 매우 쉬운, 딱 제 수준에 맞게 쓴 글들이니까, 보시면서 여러 의견들을 나눌 수 있으면 좋겠습니다.

AnyFrame 프레임워크에 대한 소견1. 소스 코드 베끼기
AnyFrame 프레임워크에 대한 소견2. 오픈 소스 오용하기
AnyFrame 프레임워크에 대한 소견3. 패키지 구조가 스파게티
AnyFrame 프레임워크에 대한 소견4. 필요 없는 코드


top

  1. 2008.07.20 12:27 PERM. MOD/DEL REPLY

    비밀댓글입니다

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2008.07.20 12:37 신고 PERM MOD/DEL

    그 해결책은 이미 제 블로그에 정리해 두었었습니다. 아드리안이 TSE 2007에서 발표한 내용이었죠.

    http://whiteship.tistory.com/1372

    이걸 참조하시면 됩니다. 읽으시다가 이해 안 되는 것이 있으시면 물어봐주세요. 하이버네이트의 세션 상태에 대해서만 이해 하신다면 뭐 간단합니다.

  2. 2008.07.20 15:17 PERM. MOD/DEL REPLY

    비밀댓글입니다

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

    증거는 전부 소스코드에 있습니다. 오픈 소스니까.. PM님이 소스 코드를 볼 줄 아신다면, 팀원들이랑 같이 전부 빔프로젝트로 쏘면서, 한 번 들여다 보는 시간을 갖는게 좋지 않을까요?

  3. 2008.07.20 16:51 PERM. MOD/DEL REPLY

    비밀댓글입니다

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

    혹시 N사 아니세요? ㅋㅋ 기대되는데요.

  4. Favicon of http://sayjava.egloos.com BlogIcon sayjava 2008.07.24 09:57 PERM. MOD/DEL REPLY

    가끔 기선님이 쓴 글을 봅니다. 그런데 오늘은 링크를 건 글의 제목이 좀 눈에 거슬리는데요... 배끼기는 베끼기로 고쳐주시면 눈에 덜 거슬릴 것 같습니다. ^^; 그리고 "좋치"는 "좋지"로... 아 이거 참.. 기술적인 문제로 댓글을 달아야 바람직한데, 그래도 많은 분들이 보는 글일 것 같아서 적습니다.

    Favicon of http://whiteship.tistory.com BlogIcon 기선 2008.07.24 10:31 PERM MOD/DEL

    감사합니다. 수정하겠습니다. :)

  5. 지나가다 2008.08.01 01:44 PERM. MOD/DEL REPLY

    우선....저는 s사와 아무런 관계도 없습니다. 전혀~~
    님이 아는 사람도 아닙니다. 전혀~~
    개발자도 아닙니다. 오픈소스엔 관심 많습니다.~~
    우연치 않게 님이 쓴 글을 봤습니다.


    저도 Spring을 이상하게 가져다 쓴 구조나 로그, hibernate등이 맘에 들지 않았습니다.
    오픈소스 정책을 무시한 것도 이상하구요......
    상업적으로 좀 이상하게 이용당한다는 생각도 들었습니다.
    게다가…자기들이 만든 플러그인은 거의 없더군요…
    신문에 어찌나 대대적으로 선전을 하던지 귀도 따갑구요...글로벌 어쩌고 하면서 말이죠...

    그러나 기업이 무언가를 오픈하면서 이런 저런 것을 시도했다는 것으로 만족하면 어떨까 합니다.
    그것만으로도 매우 훌륭한 시도가 되지 않을까 싶고요.... 보나마나 저 프레임워크 S사 직원 몇분이 개발했을 텐데.... 넘 뭐라 하시네요...
    그분들이 이 님이 쓰신 글을 꼭 봤슴 좋겠습니다.
    그렇지 않다면 여기에 올리지 마시고... 그곳의 홈피에 올리심이~~~^^

    저 팀의 역량이 생각외로 낮고... 저 product가 진정한 오픈소스라면 그곳의 포럼에 글을 올려주시면 좀 더 좋지 않을까...라고 생각해봤습니다.


    혹시 정말 정말...무언가 서로가 서로에게 도움이 되길 원한다면...
    저 프레임워크 만든 사이트에 이런 글을 올리고 자유롭게 토론하면서 성숙된 프레임워크를 만드는 것이 중요하지 않을까 싶습니다. 조언을 받으려고 오픈한 것이 아닐까라는 생각이 드네요... 비판보다는....

    --> 오픈소스 발전을 위해서 정말 프레임워크 하나 만들어서 배포해 보는 것도 큰 의미가 있겠네요...
    가븐킹이나 로드존슨...같은 멋진 분들처럼 말이죠~~
    우리나라에도 껍데기만 있는 오픈소스 말고... 정말 비지니스에 도움이 되는 오픈소스....

    이전에 모사이트에서 "틀"이라는 프레임워크를 배포하는 것을 보고 아.... 이 사람은 정말 개발을 알고.... 품성도 좋다라는 생각을 해봤습니다.
    코드도 정성이 가득했구요...
    sf.net 에 있는 소스 받아서 보고 있으면 화날때도 많이 있습니다. 개발자도 아닌 제 눈에도 안차는 소스가 많이 있죠...

    비판도 품위있게 하시면... 서로가 서로에게 좋은 결과를 가져오지 않을까...라는 생각을 조심스럽게 해봤습니다.
    제 이야기가 좀 이상하다면.... 그냥 저런 사람도 있나부다...하고 생각해주세요...그럼 이만....

    ps :
    좋은 것도 많이 있더군요...
    문서화를 잘 하려고 노력한점… 실제 개발자들이 이해가능하도록 말이죠...

    개발자들이 신경 안 쓰는 부분들에 대해서 조금씩 파고들고 있는 점.

    그러나 님이 말하고 있는 보편적인 잘못된 점들….
    아무리 잘 만든 프레임웍도 비즈니스 개발하는데 도움이 안되면 그냥 코드예술일 뿐이겠죠… 이런때 나오는 말이 문서화이고....

    코드를 작성하면 털어서 먼지 안나는 코드는 없다고 생각합니다. 특히 개발의 세계에선 말이죠…...

    참 속상한 날입니다.
    외산 오픈소스 프레임워크 연구를 하고.... 따라가기 급급하고... 그런걸 노하우라고 말하고...
    그 프레임워크를 공부하는게 개발의 다임을 착각하는 자들도 많이 생기고...

    s사의 기사는 10년 노하우라고 말하던데... 그러나 공개 초기이니... 좀더 좋은 결과가 나오지 않을까..긍정적으로 생각해 봄다.~

    그게 마치 모든 것인듯 말이죠....
    그것이 모든것을 대변하는 표준인 것처럼 말이죠...
    좀 개발한다는 분들도 자기의 코드를 잘 공개 안하죠...가끔 코드를 공개하시는 분들 보면..용기 있어 보이십니다. ~~ 님은 코드를 공개해 본적 있으신가요?

    아참 anyframe은 이전부터 제가 아는 회사에서 사용해온 java framework의 이름인데... 저렇게 사용한 것도 맘에 안드네요... ^^;;; 거의 5-7년동안 저 이름 사용했는데...
    그곳 사장님 화 많이 날듯...

    Favicon of http://whiteship.tistory.com BlogIcon 기선 2008.08.01 08:31 PERM MOD/DEL

    http://forum.ksug.org/viewtopic.php?f=9&t=131&sid=20f6dddcdd81a7af41593f0368e3c80b

    이 글을 참조하세요. 무지 긴 댓글.. 가...감사합니다.

Write a comment.


2MB 정부 환율방어 문제점

모하니?/Watching : 2008.07.19 19:53




주제: 모르는 건 하지 말자. 괜히 경제도 잘 모르면서 주식에 손 댔다가는 외국 투자자들한테 돈만 퍼준다는거~
top

Write a comment.


Java Concurrency In Practice 번역서 등장

모하니?/Reading : 2008.07.18 17:52


와우~~ 미투데이 하다가 알게 되었습니다. OSGi를 잘 알고 잘 사용하려면 최소한 클래스로딩과 컨커런시를 잘 이해하고 사용할 수 있어야 되는데, 저 책이 좋다고 자바 개발자라면 저 책을 꼭 끼고 있으라는 글을 어느 영문 아티클에선가, 블로그 글이었던가, 댓글에선가 본적이 있는데, 안 그래도 어려운 내용이 영어라서 학습하기 부담스러웠는데, 정말 잘 됐습니다. 번역도 기대 만큼 잘 되어있기를 바라면서 출간을 기다려 봅니다.

사용자 삽입 이미지


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

[거꾸로 읽는 세계사] 드레퓌스 사건을 보고서...  (0) 2010.03.10
TDDBE 2부 xUnit 실습  (0) 2008.09.08
도와주세요! 팀장이 됐어요  (0) 2008.08.25
내가 시집을 읽게 될 줄이야...  (4) 2008.08.05
불신자를 위한 JSF 시리즈  (0) 2008.07.22
Java Concurrency In Practice 번역서 등장  (0) 2008.07.18
이외수의 생존법 하악하악  (0) 2008.04.07
책 지름신 오셨네~  (0) 2007.12.26
Head First SQL  (4) 2007.12.21
읽을 책 정리  (2) 2007.12.21
괴짜경제학  (4) 2007.12.10
top

Write a comment.


20080718 GMP

모하니?/GMPing : 2008.07.18 09:38


News

restaurant 레스쳐란
suspended 매달린

Finally, a new restaurant that takes the idea of going out to eat to a whole new level. It's called "dinner in the sky". It involves table and chairs suspended from a crane.

Screen English

Mitchi. What are you doing?
Marri bought some books but I thought she should read a real book by a real writer.
No no no. That's not a good idea.
Oh contre(under contrary).
Please Don't
This is the best book I've ever read.
Hey best book. maybe the only book you've ever read.

Pop's English

But you don't know me and I wish you did.
But you don't know me ullalalala
You don't know me

I wish + 과거(~ 했으면 좋겠어)

Talk Play Learn

Do you feel like ~ing? (~하고 싶어요?)

Do you feel like drinking?
Do you feel like dancing?
Do you feel like going out?
Do you feel like walking out?
Do you feel like walking a little?
Do you feel like taking a break?
Do you feel like eating something?

Sound Sound Play

p 발음 다음에 u 나오는 경우 '쀼"

help you
keep you
drop you
stop you
develope you
ex) Don't skip you meal.

Learn More

세상 참 좁다. = It's a small world.
선입견을 가진 = biased (ex. Don't be biased.)

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

20080731 GMP  (0) 2008.07.31
20080730 GMP  (0) 2008.07.30
20080728 GMP  (0) 2008.07.28
20080724 GMP  (0) 2008.07.24
20080721 GMP  (0) 2008.07.21
20080718 GMP  (0) 2008.07.18
20080717 GMP  (0) 2008.07.17
20080716 GMP  (0) 2008.07.16
20080715 GMP  (0) 2008.07.15
20080710 GMP  (0) 2008.07.10
20080708 GMP  (0) 2008.07.08
top

TAG GMP

Write a comment.


Radiohead - Exit Music

모하니?/Listening : 2008.07.17 23:41






"Exit Music (For A Film)"

Wake.. from your sleep
The drying of your tears
Today we escape, we escape

Pack.. and get dressed
Before your father hears us
Before all hell breaks loose

Breathe, keep breathing
Don't lose your nerve
Breathe, keep breathing
I can't do this alone

Sing.. us a song
A song to keep us warm
There's such a chill, such a chill

You can laugh
A spineless laugh
We hope your rules and wisdom choke you
Now we are one in everlasting peace

We hope that you choke, that you choke
We hope that you choke, that you choke
We hope that you choke, that you choke


명곡이군요. 캬...

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

[우리 부부를 위한 랩] 네것인 내가  (2) 2009.10.14
내사랑 내곁에  (0) 2008.10.09
그리움만 쌓이네  (0) 2008.10.06
독백  (4) 2008.08.19
Radiohead - Exit Music  (0) 2008.07.17
If You Want Me  (0) 2007.11.29
살다보면 그런거지  (0) 2007.08.31
Podcast: Rod Johnson and Spring 2.1  (0) 2007.08.11
내 마음의 강물  (0) 2007.03.22
멋진 사람이군요.  (0) 2007.02.07
아침에는 신나는 노래로  (0) 2006.11.24
top

Write a comment.


Anyframe 보다가 흥분 해버렸네요.

모하니?/Thinking : 2008.07.17 16:31


"Devil's Advocate 엔딩곡"

Why did you just copy and paste another souce code? This is an unnessecary work. Just make a reference of that class. Isn't it a duplication?

=> 왜 다른 소스코드를 복사해서 붙여넣으셨나요? 그냥 레퍼런스 변수 하나 만들면 될 뿐인데요. 중복 아닌가?

증거? anyframe.common.util.AnyFrameProperties 클래스에 있는 주석과 org.apache.commons.configuration.PropertiesConfiguration 클래스에 있는 주석이 일치합니다. 이상하게 주석이 영문 API 스럽게 달려있는 걸보고 혹시나 해서 검색해 봤더니 구글이 바로 알려줍니다.

복사해서 붙여 넣을 꺼면 그냥 참조하면 되는데, 왜 굳이 AnyFrame 이름을 달려고 한건지 이해가 안 되네요~ @.@ 이건 중복이자나요. 중복.

Why are you using static logger? static logger can cause some serious problems on multithreading server platforms. Have you ever seen this article?
=>왜 static 로거를 사용하셨나요? static 로거는 멀티쓰레드 기반 서버 플랫폼(톰캣을 비롯한 대부분의 WAS)에서 static 로거는 자칠 심각한 문제들을 발생시킬 수 있습니다. 이 글을 본적 없으신가요?

로거들을 전부 static 으로 쓰고 있는데, 그럴 경우 멀티 쓰레드 기반으로 동작하는 서블릿 컨테이너들의 클래스로더 계층 구조 땜시 별에별 문제들이 발생할 수 있습니다. 그것과 관련해선 아래 글에 정리해둔 적이 있습니다. 스프링에서도 일부 static 로그를 사용하고 있지만, 테스트 용도로 debug 레벨의 로그만 남기는 정도 입니다. 하지만 애니프레임은 무분별하게 사용하고 있는것 같네요. 로거 객체에 별로 무관심 한 것 같습니다.

2008/05/09 - [Java] - Logging/StaticLog

What is your package organization strategy? I feel dizzy.
=> 패키지 구조 정책이 어떻게 되는겁니까? 어지럽습니다.

애니프레임 코어에도 anyframe.core.hiberante라는 패키지가 있고, 애니프레임 웹 프로젝트에도 똑같은 패키지가 있는데 애니프레임 웹 프로젝트에 갑자기 왠 DAO 코드가 있는건지 몰겠습니다. ICommonDAOHibernate라는 클래스가 웹 프로젝트에 있어야 하는건지.. 몰겠습니다. 애니프레임 코어에는 ICommonService라는 인터페이스가 anyframe.core.hiberante라는 패키지에 들어있던데 정말 어지러워 죽을 지경입니다.

Do you know Hibernate?
=> 하이버네이트를 알고 확장하신건가요?

하이버네이트를 알고 확장하신 건지 의문입니다. 왜 flush()를 모든 메소드에서 호출한 겁니까? 그러면 하이버네이트 세션 컨텍스트가 매번 DB와 싱크하기 때문에 하이버가 최대한 늦게(정말 싱크가 필요한 시점에) DB에 반영하는 특징을 전혀 살릴 수 없잖습니까? 저건 하이버네이트를 죽이는 일입니다. 저 코드를 개빈킹한테 보여주면 열받아서 코드를 찢어버릴지도 모릅니다. 개선이 필요합니다. 아니 그전에 하이버네이트를 좀 공부하신다음에 확장하시는게 어떨까요? 아니면 아예 하이버네이트는 지원하지 않으셨으면 합니다. 저런 식으로 하이버네이트를 오용하는 코드가 확산되면 오히려 괜한 오해만 사고 하이버네이트의 엘레강트 한 면모를 더럽힐 수 있으니까요.

Don't you know Spring MVC Interceptor?
=> Spring MVC의 interceptor를 모르시나요?

왜 AnyframeController에 preprocess()와 postprocess()라는게 있는지 의문입니다. 인터셉터로 할 수 있는 일을 굳이 전처리 후처리 메소드를 추가해야 했는지 몰겠네요. MAC랑 SFC를 합쳐서 AnyFrameController를 만드실 정도로, Spring MVC를 공부하셨다면 인터셉터 정돈 알고 계시지 않나요?? 그리고 해당 클래스의 테스트 코드들은 직접 작성 하신 겁니까? 아니면 스프링 코드에 있는 테스트 코드를 붙여 넣은 겁니까? 더 이상 확인해보고 싶지 않아서 손을 안 댔지만, 혹시 붙여 넣은 거라면 뭔가 좀 문제 있는거 아닐까요? 아무리 오픈소스고 테스트 코드라고 하지만 양심적으로 피쳐링 수준이 아니라 표절 수준이 되면 문제라고 생각이 되는데요;




이밖에도 계속하고 싶지만, 더 이상 코드를 봤다가는 이성을 잃어버릴 것 같아서 못 보겠습니다.
top

  1. Favicon of http://benelog.egloos.com BlogIcon benelog 2008.07.17 23:39 PERM. MOD/DEL REPLY

    저도 볼려다가 아직 못 보고 있었는데 우려했던 상황들이 벌어지고 있는것 같네요;

    preprocess와 postprocess 메소드는 struts 기반의 구버전에 있었던 코드를 그냥 옮기어 온 것으로 보입니다.. 뭐 스트럿츠에서도 더 좋은 방법이 있었을 것 같기도 합니다..

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

    다행이시네요. 절대로 보지 마세요. 저는 본 걸 너무 많이 후회하고 있습니다. 판도라 상자를 열어본 기분입니다. 수 많은 부정적인 생각들이 머리를 채워주더군요.

    지금은 그냥 라디오헤드 노래나 들으면서 머리를 식히고 싶을 뿐입니다.

  2. keunseok 2008.07.18 09:37 PERM. MOD/DEL REPLY

    이번 플젝 1차 때는 스프링 기반으로 했는데, 2차는 삼성이 주사업자인 관계로 애니프레임을 쓰게 될 것 같은데, 큰일이네. (그런 사실 때문에 플젝 초기부터 의욕 엄청 떨어졌음)
    워낙에 소스 코드 들여다 보는걸 좋아하지는 않지만, 애니 프레임 문제가 심각한가 보네. 하긴, 그대로 베꼈을 것이라는 추측은 많이 했지만서두...
    역시 삼성이 하면 뭔가 다른가보다. 아침부터 욕 나오고 혈압 오른네

    Favicon of https://springframework.tistory.com BlogIcon 영회 2008.07.19 12:16 신고 PERM MOD/DEL

    꼭 그렇지만은 않아. 애니프레임을 더 자세히 봤다면.. ^^
    아마도 기존에 SDS가 갖고 있던 유산인 시스테미어를 완전히 걷어낼 수는 없었던 것으로 추정되는데 그건 내가 모르는 일이고
    확실한건 굳이 Web-tier를 Struts 기반으로 만들어야 하는 것은 아니니까.
    그렇게 되면 애니프레임이기 보단 스프링을 그냥 쓰는 것이 되겠지만.. 애니프레임이 그걸 막는 것은 아니니까.

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2008.07.19 19:48 신고 PERM MOD/DEL

    형.. 큰일이네요. 하이버네이트 위에 올린 그 클래스는 정말 쓰면 안 되요. 작명에도 일관성이 없고 패키징 구조가 엉망이어서 도대체 어떤 기준으로 core랑 web으로 묶은건지 알 수가 없어요. dao는 web 프로젝에 있고 service는 core에 있으니 이건 뭐;; -_-;;

  3. Favicon of https://springframework.tistory.com BlogIcon 영회 2008.07.19 13:02 신고 PERM. MOD/DEL REPLY

    트랙백이 막혀있군

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2008.07.19 19:42 신고 PERM MOD/DEL

    앗? 그런가요? 흠.. 특별히 설정을 바꾼적이 없는뎅.
    다시 한 번 줘보시겠어요? Max님 트랙백은 잘 받았는데요.

  4. Favicon of http://www.ologist.co.kr BlogIcon ologist 2008.07.20 21:51 PERM. MOD/DEL REPLY

    공통으로 프레이워크를 만든다는거 레거시를 가지고 새로운 개념을 적용한다는 것은 쉬운일이 아니죠. 다른 것들은 SDS사정을 잘 모르니 그렇다 치고, PropertiesConfiguration라는 기존에 있던 코드를 카피해서 사용하고 그걸 공개하는 것은 좀 그렇네요...^^;

    Favicon of http://whiteship.tistory.com BlogIcon 기선 2008.07.20 21:54 PERM MOD/DEL

    네 와 오랜만에 뵙네요. 복사 해서 붙여 놓은 코드는 그거 하나만이 아닌거 같아서 참 씁쓸합니다.ㅋㅋ

  5. bylee 2010.06.06 18:36 PERM. MOD/DEL REPLY

    anyframe에 대해 검색해서 글을 보다 여기 들렸습니다.

    본문중에 언급하신 log관련 글을 엄밀히 말해서 상관없는 내용입니다.( 클래스 로더 누수 문제 )

    좀 뜬금없는 글이라고 해야 할까.

    static을 쓴다고 발생하는 것도 아니고 private을 쓴다고 해서 안 발생하는 것도 아닙니다.

    아마 복잡한 구조를 설명하기 귀찮아서 쓰지 말라고 한 게 아닌가 싶습니다.

    글에서 설명한 문제가 발생하지 않게 하기 위해서는 Logger를 상위 클래스 로더에 로딩시키면 됩니다. 따라서 static logger를 썼냐 안썼냐는 중요하지 않습니다.

    Favicon of http://whiteship.me BlogIcon 기선 2010.06.06 21:49 PERM MOD/DEL

    그렇군요.

    흠.. 너무 오래되서 이미 해당사항이 없는 내용이 많은 글이 되버렸답니다.

Write a comment.


Code Organization Guidelines for Large Code Bases - 유겐 휄러

Spring/TSE 2006 : 2008.07.17 15:43


왜 코드 조직화를 걱정하는가?
패키지 interdependencies
모듈 나누기와 레이어링
커다란 코드 기반 진화시키기
케이스: 스프링 진화
아키텍처 분석 도구

왜 코드 조직화를 걱정하는가?
- 전체 코드 이해를 돕고, 보다 편하게 네비게이션 하기 위해서.
- 자바에는 패키지와 서브 패키지 개념을 제공하긴 하지만, 어떻게 적용해야 할지에 대한 권고 같은건 없다.

신경써야 할 것들
- 코드는 원래 구조에서 계속 진화할 필요가 있다.
- 리팩터링과 애자일 개발은 좋다. 근데 그렇게 개발하면서도 이전에 배포한 코드와의 호환성은 어떻게 유지할 것인가..
- 원래 설계에서 의도하지 않았던 의존성들이 모듈을 나누다 보면 생길 수 있다.
- (점점 커지나까) API를 유지하면서 모듈을 좀 더 세밀한 모듈로 조갤 수 있을런지..

패키지 상호의존성
- 패키지 구조를 설계하는 건 놀랍도록 중요하다.

왜 단방향 의존성이 중요한가?
- 즉, 왜 순환 참조(CD)가 안 좋을까?
- 코드를 악화 시킨다,.
- 패키지 재사용에 제한이 생긴다.
- B를 사용하려면 A를 컴파일 해야 하는데 A는 다시 B를 컴파일 해야 하는 상황 발생한다.

그러니까
- CD를 없애라.
- 패키지들을 개념적인 모듈로 묶어라.
- 모듈을 만들어 낼 땐 개념적인 경계와 더불어 배포도 고려해야 한다.

모듈 decomposition과 레이어링
- 모듈의 특성(다른 모듈과 낮은 종속성, 모듈내에선 높은 결집도)
- 모듈은 소스 관리와 배포 단위 만듬이나 개념적인 단위다.
  - cognitive 오버로드를 피하라.
  - 개별적으로 사용 할 수 있어야 한다.(전체 시스템의 일부 기능)
- 모듈 간에 CD를 가지고 있으면 안 된다.
- 모듈 간에 의존성들은 그들이 가지고 있는 패키지에 의해 만들어진다.
- 레이어링은 패키지 구조에 있어서 중요한 논리 뷰다. 상위 계층에서 하위 계층을 참조하고 그 반대로는 안 되도록..
- 모듈 레이러링 보다는 개발 consideration에 의해 도출 된다.

그러니까
- 코드 베이스 내에서 자연스러운 개념적인 경계를 만들어라.
  - 자연스러운 패키지 네이밍
  - 편한 네비게이션
- 가장 힘든 도전은 코드를 진화시키는 거다.
  - code deteriorate를 놓치지 않고..
  - 아키텍처 질을 떨어뜨리지 않고..
- 하위 호환성과 아키텍처 품질 사이의 트레이드오프를 생각해야 한다.
  - 완전 100% 하위 호환성은 보장할 수가 없게 된다.
  - 물론 가끔 아키텍쳐 품질을 양보하지 않아도 되는 방법이 항상 있을 수 있음을 생각해야 한다.
- 물론 몇 가지는 쉽게 바꾸기가 힘들 것이다.
  - public API에 있는 패키지 이름
  - 그렇다고 정리하는걸 주저하면 안된다. 아키텍처 품질을 위해 deprecation 해버리자.

케이스 스터디: 스프링
- 스프링 코드 복잡한 SPI, 다양한 곳에서 사용하는 많은 API, 다양한 요구사항 속에서 3.5년을 어떻게 버텨왔을까?
- 매우 엄격한 아키텍쳐 관리
  - loosely counpled package with welldefined interdependencies
  - 패키지 단에서 CD가 없다. 만약에 CD가 생기면 다시 살펴보고 심각하게 고민하다.
- 스프링이 가지고 있던 CD (수정 후 dependency)
  - core <-> util (core <- util)
  - beans <-> aop (beans <- aop)
  - beans <-> context (beans <- context)
  - transaction <-> dao (transaction -> dao)
  - transaction <-> jdbc (transaction -> jdbc)
(소스 코드로 좀 보여주지 말로만 설명하네. 힘들게 시리 ㅠ.ㅠ)

CD 확인하는 도구
- JDepend
- SonarJ
- 공식 배포 하기 전에 JDepend를 한 번 돌려보는 건 어떨까!!
top

Write a comment.


20080717 GMP

모하니?/GMPing : 2008.07.17 14:09


News

Eiffel Tower 에펠탑
helping 헬삥
make over 수리, 개조
monument 기념물

The Eiffel Tower is getting a 267 million dollar make over, designed to improve the expierience for visitors and make the monument greener helping the environment.

Screen English

I'm sorry. I was way way out of line.(내가 정말 좀 심했다.)
No. you are never out of line. You are my brother.
No no. I think you understand.
Listen bro. There is nothing say or do that could upset me.
Whom am I met at the book store,,
Can I just say one thing?

Pop's English

My mind is wandering. It is pondering in this cheap cafe.
Wring poetry so thoughtlessly. mental fabric frayed.
Smocking cigarettes trying to forget, while my lungs decay
I'm wondering what you'd say.

Talk Play Learn

Do you know why I was (너 내가 왜~ 했었는지 알아?)
Do you know why I was sad?
Do you know why I was late?
Do you know why I was sick?
Do you know why I was busy?
Do you know why I was upset?
Do you know why I was afraid?
Do you know why I was miserable?
Do you know why I was nurvous?

Learn More

피장 파장 = tit for tat


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

20080730 GMP  (0) 2008.07.30
20080728 GMP  (0) 2008.07.28
20080724 GMP  (0) 2008.07.24
20080721 GMP  (0) 2008.07.21
20080718 GMP  (0) 2008.07.18
20080717 GMP  (0) 2008.07.17
20080716 GMP  (0) 2008.07.16
20080715 GMP  (0) 2008.07.15
20080710 GMP  (0) 2008.07.10
20080708 GMP  (0) 2008.07.08
20080707 GMP  (0) 2008.07.07
top

TAG GMP

Write a comment.


헉.. Hot Reloading 을 지원하는 MVC 웹 프레임워크 Induction

Good Tools : 2008.07.16 22:48


참조 : http://www.theserverside.com/news/thread.tss?thread_id=50068

대단들 하죠. 정말 멋져부러요. 모델, 뷰, 컨트롤러간에 타입으로 DI를 해주고, 확장가능한 형태라는데 일단 코딩해보기 전까진 모르겠지만, JSP 페이지가 아닌 애플리케이션 코드를 동적으로 릴로딩 해준다는거.. 그것도 웹로직같은 WAS 단에서 하는게 아니라 MVC 프레임워크가 해준다니....

시작하기 문서를 살펴본 결과, 스프링처럼 DispatcherServlet을 하나 등록해서 쓰면 되고, URL 맵핑은 풀패키지 명이 붙은 클래스 이름을 사용하고 있습니다. URL 맵퍼를 확장할 수 있는 방법은 해당 문서에 보이질 않는데, 아마도 있겠죠. 독특한건 핫 리로딩 하기 위해서 클래스 파일들의 위치를 지정해준다는 겁니다. 흠.. 저 부분만 스프링 MVC로 가져다 쓰고 싶은데 어떻게 안 될런지 몰겠네요.

좋아 좋아. 오픈 소스니까 소스코드를 좀 보면서 어떻게 만든건지 구경이라도 해야겠습니다.

ps : 아무리 프레임워크 단에서 핫 릴로딩이 되더라도, 서버쪽에서 요청을 잠시 잡아서 대기 시켜주지 않으면 불상사는 발생하기 마련이겠죠?? 아님 혹시 프레임워크 단에서 그런 일도 해줄까나~ 멋지겠는데~ Dispatcher가 잡아서 잠시 들고 있으면 될라나..ㅋㅋ
top

TAG Induction

Write a comment.


블로그 위젯 - W(더블유)

Good Tools : 2008.07.16 22:24


원랜 하루 10건 무료 문자 위젯인 엄지를 설치할려고 간거였는데, 체험단 모집이 끝났나보네요. 물마시러 갔다가 세수하고 온다고 옆에 더블유라는 위젯이 있길래 봤더니 재밌어 보여서 설치해봤습니다.

http://w.wzd.com/

다마고찌 + 영어공부 + 날씨 용을 겸하고 있는 위젯이네요. ㅋㅋ전 사내아이 한 명을 키우고 있습니다. 방명록을 먹고 산다는 이 아이가 쑥쑥 커주길 바랍니다.

사용자 삽입 이미지

top

Write a comment.


exclusion을 하까마까

Build/Maven : 2008.07.16 14:19


옛날에 애마좐(Amazon) 유역에 사는 '치카마카'라는 거미의 거미줄로 실을 짜서 쫄티를 만들었다는 분이 있었는데 그걸 보면서 정말 웃겨 죽는 줄 알았던 기억이 납니다. 생각난 김에 동영상을 추가해둘까요? ㅋㅋ

13분 정도 되는 동영상을 잼난 부분만 편집한 동영상인데도 8분이나 합니다.ㅋㅋ

Maven의 폼(pom.xml)관리를 하다보면, 겪게 되는 의존성 헬.. 의존성 헬을 해결하려고 exclusion을 하다보면 발생하는 XML 헬.. 지옥의 연속을 겪게 됩니다. 그런데, 오늘 사부님과 M2Eclipse 플러긴 얘기를 하다가 화장실에 갔을 때 갑자기 exclusion을 하지 않아도 되는 아이디어가 떠올랐습니다. 제가 왜 그동안 exclusion을 했는지 모르겠더군요.

먼저 메이븐 폼 관리를 하다보면 겪게 되는 의존성 헬이란, A-> B, C->B 이런 참조 구조에서 A와 C가 참조하는 B 라이브러리의 버전이 다를 경우에 발생하는 문제인데요. 이 문제를 헬이라고 표현하는 이유는 저런 참조 구조를 발견하는게 쉽지 않기 때문입니다. 얽히고 얽혀있는 라이브러리들 간의 의존 관계에서 저러한 참조 관계를 찾아 낸다는 것은 참으로 피곤한 일 중에 하나 일 겁니다. 그래서 pom.xml에 의존성을 추가할 때 같이 딸려오는 의존성들을 일일히 확인하면서 추가할 필요가 있습니다.

Maven을 쓴다고 해서 종속성을 안중에서 Out 시킬 수 있느냐?  (2)

저 같은 경우 일일히 추가하는 라이브러리들의 pom.xml을 열어서 그 안에서 어떤 라이브러리를 어떤 버전을 사용하는지 보고, 스프링을 기준으로 그 보다 하위 버전을 가져올 경우에는 전부 exclusion을 시켰었습니다. 그랬더니, 수 많은 exclusion 설정(특히 하이버네이트 추가할 때)으로 pom.xml이 상당히 길어지고, 가독성도 떨어졌습니다. 그래서 pom.xml에 정의되어 있는 의존성들을 별도의 pom으로 각각 빼내고, spring.pom와 hiber.pom을 만들어서 그 안에 정의한 의존성들을 하나의 superpom.xml에서 참조하도록 설정을 했습니다.

Managed dependency는 무슨 뜻인가요?  (0)
Managed Depedency 네 녀석의 정체를 드디어 알았다.  (0)
기본적인 managed dependency 사용법  (2)

이렇게 하니까 superpom.xml은 좀 간결해 졌지만, 의존성 정보를 분리한다는 것이 역시 쉽지 않은 일이었습니다. 어떤 라이브러리들에 대한 의존성을 spring.pom에 정의하고 어떤 라이브러리들을 hiber.pom에 정의할 지 분명하지가 않으니까요. 그래서 요즘은 다시 의존성 정보들을 다시 superpom.xml로 가져올까도 생각 중입니다.

그전에 우선 정리를 좀 해야겠죠.

그 정리 작업 중에 하나가 바로 불필요한 exclusion 설정을 없애는 겁니다. A라는 프로젝트가 있고 이 프로젝트의 의존성이 다음과 같다고 가정하겠습니다.

A -> B -> C(1.0)
A -> D -> E -> C(2.0)

http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html

먼저, Transitive Dependency 정책에 따라 A 프로젝트의 pom.xml에 B와 D에 대한 의존성만 추가해도, E와 C 라이브러리를 가져오게 될 겁니다. 그런데 문제는 C 라이브러리를 B도 참조하고 E도 참조하는데 서로 참조하는 버전이 다르다는 겁니다.

이럴 경우 위 링크의 Transitive Dependency에 있는 Dependency mediation 규칙에 따라 "가장 가까운" 의존성을 사용하게 됩니다. 따라서 C(1.0)을 사용하게 되는거죠. 그런데 만약 같은 뎁쓰에 있다면 어떻게 될까요?

A -> B -> C(1.0)
A -> D -> C(2.0)

이 경우에는 메이븐의 버전에 따라 좀 다릅니다. 2.0.4에는 저런 경우에 어떻게 해야 할지 정의해둔 뭔가가 없습니다. 그런데 2.0.5 부터는 "먼저 선언된 순서"에 따라서 A 프로젝트의 pom에 B에 대한 의존성을 먼저 선언했다면 C(1.0)을 참조하게 될 겁니다.

자 저런 상황에서 C(1.0)이 아니라 C(2.0)을 사용하려면 어떻게 해야 할까요?

저는 exclusion을 사용해서, B에 대한 의존성을 정의할 때 다음과 같이 선었했었습니다.

        <dependency>
            <groupId>note.whiteship</groupId>
            <artifactId>B</artifactId>
            <version>1.0</version>
            <exclusions>
                <exclusion>
                    <groupId>note.whiteship</groupId>
                    <artifactId>C</artifactId>
                </exclusion>
             </exclusions>
        </dependency>

참으로 번거롭고, XML 설정할 것이 참 많았습니다. 그런데 문제는 잘 생각해보면 정말 쉽게 해결할 수 있는 거였습니다.

A -> C(2.0)

이렇게 의존성을 하나 추가해주기만 하면 끝나는 거였죠. 그렇게 되면

A -> B -> C(1.0)
A -> D -> E -> C(2.0)
A -> C(2.0)

또는

A -> B -> C(1.0)
A -> D -> C(2.0)
A -> C(2.0)

이렇게 전체 설정이 될테고 그럼 "가장 가까운" 녀석이 우선시 되기 때문에 C(2.0)을 쓰고 나머진 무시하게 될테니까요. 설정에서도 exclusion을 사용할 필요 없이 그냥 A의 pom.xml에 하나의 <dependency></dependency> 덩어리를 추가해주기만 하면 됩니다.

        <dependency>
           <groupId>note.whiteship</groupId>
           <artifactId>C</artifactId>
           <version>2.0</version>
        </dependency>

이렇게요. 흠~ 괜찮지 않나요. 그래도 exclusion을 해야 할까요?
top

Write a comment.


20080716 GMP

모하니?/GMPing : 2008.07.16 10:06


News

health officials 보건 공무원
cilantro '고수'라는 향식료
suspected 의심 받은
contaminate 오염시키다
add A to B

-ria 군, 집단, 장소
-ate 만들다

health officials this week added fresh jallopino peppers and cilantro to the list of suspected food contaminated by vacteria the list also include some tomatos.

Screen English

I think we can stop asking her questions. We've been grilling her all day.
I'm sorry. Does it feel like we are grilling you?
No no no no not at all.
Yes we are. She is just beeing nice.
No no no no. I love the questions.
Oh please. On behalf of my familiy, I would like to apologize.

Pops English

Now I lay my love on you. It's all I wanna do. Everytime I breath, I feel brand new.
You open up my heart. Show me all your love. And walk by through as my love on you.

Talk Play Learn

Can I have ~ (~해도 될까요?)

Can I have a bite?
Can I have a sip?(한 모금 마셔봐도 돼?)
Can I have a ride?
Can I hava a refill?
Can I hava a sit here?
Can I hava a doggy bag?
Can I hava a glass of water?
Can I have minute with you?

Sound Sound Play

v 다음에 a가 오면 '버'

driver [드라이버]
Can you move a[무버] bit to the right?
give a [기버]
recieve a [리시버]
slove a [솔버]
save a [세이버]

Today Expression

match made in haven = 천생연분


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

20080728 GMP  (0) 2008.07.28
20080724 GMP  (0) 2008.07.24
20080721 GMP  (0) 2008.07.21
20080718 GMP  (0) 2008.07.18
20080717 GMP  (0) 2008.07.17
20080716 GMP  (0) 2008.07.16
20080715 GMP  (0) 2008.07.15
20080710 GMP  (0) 2008.07.10
20080708 GMP  (0) 2008.07.08
20080707 GMP  (0) 2008.07.07
20080705 GMP  (0) 2008.07.05
top

TAG GMP

Write a comment.


서비스 계층 다이어트 시키기

모하니?/Coding : 2008.07.15 14:51


    private void makeNewMonthlySalesSum(Supp supp, Date date) {
        MonthlySalesSum monthlySalesSum = new MonthlySalesSum();
        monthlySalesSum.setDate(date);
        monthlySalesSum.setSupp(supp);
        this.dao.add(monthlySalesSum);

        MonthlySalesSumDetail detail = null;
        for (Branch branch : branchDao.getBranchBySupp(supp.getId())) {
            DTO dto = this.dao.makeMonthlySalesSumDTO(branch, date);
            detail = makeNewMonthlySalesSumDetail(dto, branch, date);
           monthlySalesSum.addSalesCount(detail.getSalesCount());
            monthlySalesSum.addSellingQty(detail.getSellingQty());
            monthlySalesSum.addProfit(detail.getTotalProfit());
            monthlySalesSum.addSuppUnitPrice(detail.getTotalSuppUnitPrice());
            monthlySalesSum.addSuppUnitPriceWithoutText(detail.getTotalSuppUnitPriceWithoutTex());
            if(detail.getSalesCount() > 0){
                detail.setMonthlySalesSum(monthlySalesSum);
                monthlySalesSumDetailDao.add(detail);
            }
        }
        
    }

    private MonthlySalesSumDetail makeNewMonthlySalesSumDetail(DTO dto, Branch branch, Date date) {
        MonthlySalesSumDetail detail = new MonthlySalesSumDetail();
        detail.setBranch(branch);
        detail.setDate(date);
        if (dto != null) {
            detail.setSalesCount(dto.getSalesCount());
            detail.setSellingQty(dto.getSellingQty());
            detail.setTotalProfit(dto.getTotalProfit());
            detail.setTotalSuppUnitPrice(dto.getTotalSuppUnitPrice());
            detail.setTotalSuppUnitPriceWithoutTex(dto.getTotalSuppUnitPriceWithoutTex());
        }
        return detail;
    }


서비스 클래스에 있는 배치 작업 용 메소드들 입니다. 종합 정보를 생성하는데 상세 정보와 함께 묶어서 작업을 하고 있는데 코드가... 참... 거시기 합니다. 클래스에 들어있는 코드의 절반을 이 두 개의 메소드가 잡아먹고 있었습니다.

자세히 보니까 어떤 객체에서 값들을 꺼내서 다른 객체에 전달하는 일들이 전부 입니다. 흠... 옮길 수 있겠다!! 라는 생각이 젤 먼저 들었습니다. 잠시 뒤.. 오.. 당연히 옮겨야 되겠는데? 사실 저렇게 세팅해주는 일이 원래 저 서비스 클래스가 할 일은 아니니까... 걍 자기가 알아서 값들 세팅하면 되지 왜 서비스 계층이 저렇게 일일히 세팅하게 했을까나;; ㅠ.ㅜ (제가 코딩한 겁니다.ㅋㅋ)

그래서 코드를 고쳤습니다.


    private void makeNewMonthlySalesSum(Supp supp, Date date) {
        MonthlySalesSum monthlySalesSum = new MonthlySalesSum();
        monthlySalesSum.setDate(date);
        monthlySalesSum.setSupp(supp);
        this.dao.add(monthlySalesSum);
       
        MonthlySalesSumDetail detail = null;
        for (Branch branch : branchDao.getBranchBySupp(supp.getId())) {
            DTO dto = this.dao.makeMonthlySalesSumDTO(branch, date);
            detail = makeNewMonthlySalesSumDetail(dto, branch, date);
            monthlySalesSum.applyDetail(detail);
            if(detail.getSalesCount() > 0){
                detail.setMonthlySalesSum(monthlySalesSum);
                monthlySalesSumDetailDao.add(detail);
            }
        }
    }

    private MonthlySalesSumDetail makeNewMonthlySalesSumDetail(DTO dto, Branch branch, Date date) {
        MonthlySalesSumDetail detail = new MonthlySalesSumDetail();
        detail.setBranch(branch);
        detail.setDate(date);
        if (dto != null)
            detail.setByDTO(dto);
        return detail;
    }

코드를 1/3 가량 줄일 수 있었습니다. 야호~

서비스 계층은 가볍게 도메인 계층은 두툼하게...
자기가 할 일은 자기가 하자.

top

Write a comment.


m2eclipse 소개 기사

Good Tools : 2008.07.15 11:38


참조 : http://www.theserverside.com/tt/articles/article.tss?l=Introductiontom2eclipse

TSE에 올라온 m2eclipse 기사입니다. 스크랩캡춰까지해서 상세하게 설명해주고 있군요. 흠.. Q4E가 이길지 소나타입의 m2eclipse가 이길지... 몰겠어요.ㅋㅋ

m2eclipse
2007/11/15 - [Build/Maven] - Maven으로 프로젝트 생성하기
2008/04/18 - [Screen Casting] - pom.xml에 종속성 추가하기

q4e
2008/04/18 - [Build/Maven] - 이클립스용 Maven 플러그인 Q4E
2008/04/19 - [Build/Maven] - Q4E 플러그인 사용기 1


top

Write a comment.


20080715 GMP

모하니?/GMPing : 2008.07.15 11:19


News

prime minister 수상
publicly 공공연하게
troops 군대

For the first time publicly, Iraq's prime minister wants to know when American troops will be leaving his country.

Screen English

So what sould we do?
It's kind of funny. Maybe we sould just tell anyone.
No nononono.
We didn't do anythong wrong. It was just sweety.
Oh good. hey~ You guys are getting to know each other.
(I'm) Just showing her where we are on the map.

Pop's English

Just a smile, there is no way back.
Can hardly believe it. But there is an angel calling me reaching(사로잡다) for my heart.

Talk Play Learn

I would rather not ~ (~하지 않는게 낫겠어)
I'd rather not say.
I'd rather not drink.
I'd rather not sleep.
I'd rather not call her.
I'd rather not buy this.
I'd rather not stay here.
I'd rather not meet him.
I'd rather not invite them.
I'd rather not take the call.

Sound Sound Play

k 다음에 u,p가 오면 '끄'

kick up 피껍
drink up 드링껍
make up 메이껍
wake up 웨이껍
lock up 루껍
back up 베껍

Today Expression

off the record = 비공식 적으로


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

20080724 GMP  (0) 2008.07.24
20080721 GMP  (0) 2008.07.21
20080718 GMP  (0) 2008.07.18
20080717 GMP  (0) 2008.07.17
20080716 GMP  (0) 2008.07.16
20080715 GMP  (0) 2008.07.15
20080710 GMP  (0) 2008.07.10
20080708 GMP  (0) 2008.07.08
20080707 GMP  (0) 2008.07.07
20080705 GMP  (0) 2008.07.05
20080704 GMP  (0) 2008.07.04
top

TAG GMP

Write a comment.


bnd에 번들 실행환경 설정하기

Spring DM/exercise : 2008.07.13 09:29


Bundle-RequiredExecutionEnvironment: J2SE-1.5, J2SE-1.4

이런식으로 설정하면 이 설정 그대로 MANIFEST.MF에 복사해서 붙여넣어줍니다. 모든 번들에 이런 실행환경을 설정해주는것이 좋겠죠. 가용한 설정 값드은 다음과 같습니다.

CDC-1.0/Foundation-1.0
CDC-1.1/Foundation-1.1
JRE-1.1
J2SE-1.2
J2SE-1.3
J2SE-1.4
J2SE-1.5
J2SE-1.6
OSGi/Minimum-1.0
OSGi/Minimum-1.1

1.5 환경에서 1.4 용 번들을 만들고 싶을 때, -source 와 -target을 사용해서 컴파일 하면 되지만, -source는 애노테이션이나 제네렉, for-each문과 같은 기능을 꺼버리고, -target은 클래스 파일 버전을 1.4 환경이 읽을 수 있도록 설정하는 것일 뿐, 실제 API 상의 차이는 잡아내지 못합니다. 예를 들어, String의 contains() 메소드는 1.5에 추가되어서 JDK 1.5 이상이 환경에서 얼마든지 저 메소드를 사용할 수 있습니다. 저 코드를 담고 있는 번들을 -target과 -source를 사용해서 1.4 번들로 만들고 JDK 1.4 위에서 돌리면, 예외가 발생합니다. 당연한거죠. 따라서, 1.4 용 번들을 만들고자 한다면, JDK 1.4 위에서 해당 번들을 만들고 패키징하는 것을 권장합니다.
top

Write a comment.


OSGi에서 클래스 로딩 순서

Spring DM/exercise : 2008.07.13 09:16


사용자 삽입 이미지

먼저, java.* 에 들어있는 클래스거나, org.osgi.framework.bootdelegation 속성에 설정된 클래스면 Parent Class Loader에게 클래스로딩 책임을 위임합니다.

다음은 Import-Packaged에 명시된 패키지에 들어있는 클래스라면, 클래스로딩 책임을 해당 클래스를 Export 한 번들의 클래스로더에게 위임합니다.

다음은 Required-Bundle 설정으로 참조한 패키지에 들어있는 클래스라면, 클래스로딩 책임을 해당 번들의 클래스로더에게 위임합니다.

다음으로 자기 자신 내부에 해당 클래스가 있는지 찾습니다.

다섯번째는 자신에게 붙어있는 Fragment에서 해당 클래스를 찾아봅니다. 클래스로더는 자신의 클래스로더를 사용합니다.

여섯번째는 위 그림에 빠져있는데 동적 클래스로딩과 관련이있습니다. 이 부분은 나중에 살펴봅니다.

참조 : http://neilbartlett.name/blog/osgibook/
top

Write a comment.


파폭 3 부가기능 FireFTP 귿~

Good Tools : 2008.07.12 09:39


Firefox 3.0 부터 사용할 수 있는 웹 기반 FTP 클라이언트 프로그램입니다.

https://addons.mozilla.org/ko/firefox/addon/684

http://fireftp.mozdev.org/

둘 중에 편한 곳에서 설치하시면 됩니다. 맥북에서 FTP 클라이언트 뭐가 있을라나.. 하던 찰라에 잘 건졌네요. 이렇게 좋은 걸 무료로 만드는 개발자들은 참.. 멋집니다. 게다가 이걸 만든 개발자는 이 플러그인으로 기부금을 받아서 어린이들을 도와주는데 사용하는 것 같습니다. 저런 개발자를 보니까 제가 다 훈훈해지네요.

사용자 삽입 이미지
귿이죠. 깔끔하니.. 좋습니다.
top

  1. Favicon of http://sonegy.egloos.com BlogIcon 소내기 2008.07.12 22:42 PERM. MOD/DEL REPLY

    저도 설치했습니다. sftp까지 되는군요!

    Favicon of http://whiteship.tistory.com BlogIcon 기선 2008.07.12 23:28 PERM MOD/DEL

    넹. 캬캬 잘 되고 좋아요.

Write a comment.


파폭 3 NASA 테마 귿~

Good Tools : 2008.07.12 09:25


firefox 3.0 테마 인기순위로 검색 링크

위의 Get 링크를 클릭하면 두 번째에 NASA 스킨을 볼 수 있습니다. 설치하면 다음과 같습니다.

사용자 삽입 이미지
검색창 오른쪽에 있는 그림이 상황에 따라 바뀌는데, 웹 페이지 로딩시에 로켓 쏘듯이 불길이 활활 타오릅니다. 이전에는 Aero Fox 테마를 쓰고 있었는데, 오른쪽 슬라이드 바가 없어지더군요. 아무래도 불편해서 NASA로 갈아탔습니다. 현재까진 갠춘하네요.
top

Write a comment.


버전 매기기와 범위 설정

Spring DM/exercise : 2008.07.12 00:56


버전 매기기

버전은 다음과 같이 구성되어 있다.

major.minor.micro.qualifier

major.minor.micro는 숫자고, qualifier는 알파벳이나 숫자를 사용한다. major 이 외에는 전부 생략이 가능하다. 예를 들어, 1 은 1.0 이고 이건 다시 1.0.0 이랑 같다. 다음으로 중요한 건 높낮이. 1.0 보다 2.0 이 높은 버전이라는 것에는 이견이 없을 것이며 실제로도 그렇다. 그러나 qualifier 쪽으로 가면 그렇게 쉽진 않다.

A. 1.0.0.whiteship1
B. 1.0.0.whiteship2
C. 1.0.0.whiteship10

이 셋 중에서 가장 높은 버전은 몇 일까? C라고 예상하신 분들도 있겠지만, 정답은 B다. Java의 String 클래스의 compareTo()로 비교해서 높은 값이 높은 버전이 된다. String의 compareTo()는 한 글자씩 왼쪽에서 부터 비교한다. 따라서 B < C < A 순으로 높은 버전이 된다.

버전 범위 설정하기

버전 범위는 Import-Package 또는 Required-Bundle 헤더에서 사용한다. 명시하지 않으면 기본 값은 다음과 같다.

"[0.0.0, *]"

0.0.0 부터 모든 버전을 나타낸다. Export-Package 또는 Bundle-Version에 버전을 명시하지 않은 경우 기본값으로 0.0.0이 설정되기 때문에 양쪽에서 모두 기본값을 사용하는 경우 문제없이 참조할 수 있다. 하지만 역시 버전은 명시적으로 관리해주는 것이 좋겠다.

[] 와 ()의 차이만 알면 되겠다. []는 이상 이하. ()는 초과 미만의 개념이다. [1.0.0, 2.0.0) 이렇게 설정되어 있다면 1.0.0 버전이 있으면 그걸 참조하고 2.0.0 만 있다면 그건 참조하지 않는다. 1.9.9와 1.0.0 두 가지 버전이 존재할 땐 높은 버전의 번들을 선택한다.

그렇다고 매번 "[1.0.0, 1.3.0]" 이런식으로 표기해야 하는 것은 아니다. Spring 2.5 이상 어떤 버전이든 관계가 없을 때는 그냥 "2.5." 라고 설정하면 OSGi 프레임워크는 "[2.5.0, *]" 이렇게 인식할 것이다. 따라서 상위 호환이 보장되는 라이브러리를 참조하고 있다면 버전을 저런식으로 명시해도 된다.

이와 반대로 특정 버전 하나 만 참조하는 라이브러리가 있을 수도 있다. 전~혀 상위나 하위 호환이 되지 않아서 딱 그 버전만 써야 한다면, 그때는 "[2.5.5, 2.5.5]" 이렇게 범위를 딱 해당 버전으로만 좁혀줘야 한다.

top

Write a comment.


OSGi 시작은 상호 참조 제거부터

Spring DM/exercise : 2008.07.11 09:49


OSGi와 Spring DM을 익히는 건 개인적으로 이제 어느 정도 올라왔기 때문에, 세세한 부분과 예제 실습만 틈틈히 하면 별 무리가 없다고 생각이 된다. 그러나 기술을 익히면서도 내심 드는 의문 '이 기술로 내가 지금 만들고 있는 애플리케이션을 어떻게 쪼개서 묶어야 되지?' 라는 것에는 쉽게 답을 내릴 수도 없었고 이리 저리 생각을 하고 고민을 해도 쉽게 결론이 나질 않았다. 기준이 세워지지도 않고... 그러던 중 토비 사부에게 유겐 휄러가 스프링 프로젝트 패키지 구조를 정리한 일에 대해 들었고, 그게 번들화의 시작이라는 느낌이 강하게 들었다.

일단 어떻게 쪼갤까 하는 고민은 많은 시행착오와 경험이 필요한데, 그 전에 우선 쪼갤 수 있는 상태의 프로젝트를 만드는게 시작이라는 것이다. 쪼갤 수 있는 프로젝트라는 건 순환 참조가 없어야 수월하고 깔끔한데, 그와 관련된 매우 좋은 글을 2006년 12월에 사부님이 블로그에 올린적이 있었다. 그 당시 나는 잘 기억도 안 나지만 너무 길고 뭔 내용인지 몰라서 안 읽고 지나갔을 것이다. (사실 이렇게 pass한 사부님의 글이 한 두개가 아니다.) 이제사 읽어보니 아주 쏙쏙 들어오고 글이 긴 건지도 모를 만큼 몰입되서 읽을 수 있었다.

다음 프로젝트 연기로 인해 느슨해진 요즘 새로운 목표가 생겼다. 현재 거의 마무리 단계인 애플리케이션을 잘개 쪼개서 번들로 만들고 S2AP 위에 돌리는 것이다. 해보자. 파이팅!!!

1. 순환 참조 탐색 및 정리
2. 번들로 쪼개기
3. S2AP 위에 돌리기

간단하지 아니한가. 캬캬캬 해보는거다.

top

  1. Favicon of http://benelog.egloos.com BlogIcon benelog 2008.07.16 11:05 PERM. MOD/DEL REPLY

    CBD나 OSGi나 아직 잘 모르기는 하지만, OSGi번들을 쪼개는 단위는 결국 CBD에서 말하는 컴퍼넌트의 설계와 비슷해지지 않을까.. 하는 생각이 듭니다.
    예전에 CBD로 프로젝트를 했을 때, 컴퍼넌트를 어떻게 잡아야 하는지에 대해 경험이 없이 처음 설계를 했었는데, 너무 잘게 다른 부분은 외부와의 찾은 참조로인해 의존관계가 너무 심해서 컴포넌트의 의미가 없어진 모듈도 있었습니다. 컴퍼넌트 끼리도 한방향으로만 참조를 하도록 설계를 해야 하는데, 처음 설계와는 다르게 뒤에 들어온 개발자가 컴퍼넌트의 의미를 생각하지 않고 다른 쪽의 모듈을 막 참조하는 경우도 있었죠. OSGi를 처음봤을 때 잘만 하면 CBD에서 말하는 컴퍼넌트 단위를 쪼개는 의미를 더욱 더 명확히 할 수 있지 않을까.. 하는 생각을 했었습니다.

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

    네. 저도 OSGi를 공부할 수록 점점 CBD에 관심에 가더라구요. 어떻게 하면 잘 쪼갤고 묶을지 말이죠. 그에 대한 힌트를 CBD에서 얻을 수 있지 않을까 기대하고 있습니다.

    개발자들이 커밋하기 전에 JDenpend로 각자 자신이 작성한코드의 의존성을 검증하도록 규칙을 정해 주셔야겠네요. 만약 이를 어기면 저녁을 쏜다던가 하는 식으로..ㅋㅋ

Write a comment.


Required-Bundle을 비추하는 이유

Spring DM/exercise : 2008.07.10 23:04


먼저 Required-Bundle이 뭔지 알아야겠다. Import-Package를 이해했으면 이건 뭐 아주 간단하다.

1. Resolved 상태가 되기 위한 조건

Import-Package 헤더에 명시한 패키지들이 어떤 번들들에 의해서 Export-Package 헤더이 설정 되어 있으면 해당 번들은  RESOLVED가 될 것이다.(물론 필수 였다는 가정하에.)

Required-Bunlde은 번들 단위로 바꿔서 생각하면 된다. 이 번들의 Required-Bundle에 설정한 번들이 RESOLVED 상태가 되어야 이 번들도 RESOLVED 상태가 될 수 있다.

2. Import 하는 패키지의 정적이냐 동적이냐

Import-Package로 패키지를 참조하면, 해당 패키지들만 참조할 수 있다. Required-Bundle로 참조하면 거기에 설정한 번들이 Export-Package에 명시한 모든 패키지들을 Import 한다. 따라서, Required-Bundle에 설정한 번들이 공개하는 패키지의 설정이 바뀌면 이 번들이 가져오겠다고 선언하는 패키지들도 달라지는 것이다.

자 그럼 이제 이 설정을 비추하는 이유를 살펴보자.

1. 위에서도 언급했듯이 Import 대상이 되는 패키지가 변한다. 그게 문제가 될 수 있다. 만약 이 번들이 꼭 필요로 하는 패키지를 저 번들이 가지고 있었는데, 저 번들이 갑자기 그 패키지를 Export-Package 목록에서 빼버렸다. 그래도 저 번들은 RESOLVED가 되었고, 그랬기 때문에 이 번들도 따라서 RESOLVED가 되었다. 하지만 이 번들이 동작하다가 ClassNotFoundException이나 NoClassDefinitionError를 발생시킬 여지가 다분하다.

2. 만약 Required-Bundle에 설정한 번들의 기능이 너무 많아져서 분리해야 된다고 생각해보자. 그럼 Requied-Bundle에 이 번들을 설정했던 모든 (소비자 격인) 번들들의 설정을 전부 고쳐줘야 한다. 얼마나 힘들고 고된 작업인가... 그냥 Import-Package를 썼었다면, 기능이 많아져서 분리를 해도 그냥 Export-Package도 같이 분리해서 가지고 가기만 하면 된다. 소비자 입장에선 아무것도 바꾸지 않아도 된다.

3. 낭비다. 필요 없이 Import 하는 패키지가 생길 것이다.

Required-Bundle 은 OSGi R4에 추가된 기능인데 Eclipse의 영향이 컸다고 한다.

top

Write a comment.


bnd 사용해서 API 가져오기(Import)

Spring DM/exercise : 2008.07.10 22:48


번들이 사용할 모든 라이브러리는 MANIFEST.MF 파일의 Import-Package에 기술 되어야 한다.

위의 문장은 맞는 문장일까 틀린 문장일까? 틀렸다. 예외가 있다. 바로 java.* 이하의 패키지들은 기술하지 않아도 된다. 별도의 import 없이도 사용할 수 있기 때문에 Import-Package에 굳이 명시할 필요가 없다. 하지만.. javax.*은 Import-Package에 명시해줘야 한다. javax.swing 이나 javax.awt  같은 것 들.. 또는 org.xml.sax와 같은 것들도 물론 명시적으로 선언해 줘야겠다.

그럼 bnd 설정 파일에는 어떻게 설정할까? bnd에도 Import-Package라는 헤더가 있고 필요한 모든 패키지를 import 하도록 * 로 설정해주면 된다.

Import-Package: *

이렇게.. 하지만 이미 이렇게 기본값(CoC)으로 설정되어 있어서 위의 설정을 아예 적지 않아도 알아서 저런 설정이 있는 것으로 인식해서 MANIFEST.MF 파일의 Import-Package를 만들어 준다. 좋다 좋아..

그래도 Import-Package: 헤더를 bnd  설정에서 사용해야 하는 경우가 있는데 바로. 버전을 명시할 때다. 개발 중이 아니라면 버전은 왠만해선 명시해 주는게 베스트 프랙티스라고 생각된다. 버전은 항상 범위로 설정된다. 보통 다음과 같다.

또 하나 필수 여부를 설정할 때도 Import-Package를 사용해야 한다. 기본은 필수 인데, 필수가 아니게 설정하고 싶을 때는 명시적 설정 해줘야 한다.

Import-Package: org.apache.log4j*;version="[1.2.0,1.3.0]",\
                         javax.swing*;resolution:=optional,\
                         *

위의 설정은 log4j 패키지 버전 1.2.0 이상 1.3.0 이하에 있는 클래스나 리소스를 참조하도록 설정했고, swing 패키지는 굳이 없어도 이 번들이 RESOLVE 상태가 되는데 지장이 없도록 설정했다. 마지막으로 그 외 필요한 모든 패키지들은 필수고 버전은 [0.0.0, *] 이렇게 설정되어서 어떤 버전이든 상관 없이 있기만 하면 된다.

마지막으로 Import-Package에 패키지 명을 명시적으로 선언하는 경우가 있는데, 특정 패키지를 아예 빼버리거나 무조건 추가한다. 왜일까? 특정 패키지를 빼는 경우는 번들의 코드 중에 일부는 절대로 실행이 되지 않을 꺼라는 전제가 있다면 그 부분에서 사용한 패키지를 굳이 Import 할 필요는 없을 것이다. 그리고 왜 bnd가 알아서 필요한 패키지를 찾아서 (MANIFEST.MF 에 있는) Import-Package 헤더에 추가해 줄텐데 명시적으로 등록을 하는 경우가 생길까? 그건 동적으로 로딩할 클래스 때문이다. 그런 클래스들을 담고 있는 패키지는 햇갈리게 * 를 사용하지 말고 명시적으로 전체 패키지 명을 적어주자.


top

Write a comment.


Java의 Classpath 한계와 OSGi

Spring DM/etc : 2008.07.10 22:28


자바에서 기본으로 제공하는 "모듈 시스템"이라고 할 수 있는 건 JAR 파일들을 모아둔 클래스패스 덩어리다. 이게 구린 이유는 의존성 관리를 하지 않기 때문이다. 그냥 암묵적으로 어떤 환경에서 실행되리라고 가정해버린다. 클래스패스에 필요한 것들이 있는지를 알 수도 없고 어떤게 필요한지도 알 수 없다. 따라서, 필요한 JAR 파일을 클래스패스에 추가하지 않고 애플리케이션을 실행하면 Runtime 시에 ClassNotFoundException이나 NoClassDefinitionFound 와 같은 에러를 종종 만나게 되고, 어떤 JAR가 빠졌는지 찾으면서 허송세월을 보낸다.

OSGi는 그럼 뭐가 다를까? OSGi는 명시적이며(Explicit), 선언적이고(Declarative) 버전을 적용해서(Versioned) 의존성들을 관리한다.

Explicite
- 번들이 필요로 하는 패키지 또는 서비스와 번들이 공개할 패키지나 서비스를 명시적으로 설정한다.

Declaritve
- 의존성을 기술하는 방법이 매우 간단한 텍스트 형식이다. 따라서 도구를 사용해서 쉽게 의존성을 기술하는 파일을 만들어 낼 수도 있다.

Versioned
- 라이브러리는 계속 변하기 마련이다. 따라서 같은 라이브러리라 하더라도 분명 차이가 있을 것이다. 따라서 OSGi는 모든 번들 의존성 사이에 버전 범위를 기술하도록 했다. 그래서 같은 라이브러리라 하더라도 여러 개의 버전이 동시에 사용될 수 있다.

참조 : http://neilbartlett.name/blog/osgibook/
top

Write a comment.


bnd 사용해서 API 공개(Export) 하기

Spring DM/exercise : 2008.07.10 22:17


Export-Package 헤더를 사용하면 된다. 예를 들어 다음과 같이..

Export-Package: whiteship.service.*;version=1.0.0

뒤에 버전은 해당 패키지를 1.0.0 버전으로 공개하겠다는 설정이다. 버전에 대해서는 조금 있다가 정리하자. bnd가 저 설정을 읽으면 다음 작업을 하게 된다.

1. 해당 JAR(번들) 안에 명시한 패키지가 들어있는지 검사한다.
2. MANIFEST.MF 파일에 대상이 되는 패키지를 Export-Package 헤더에 추가한다.

*와 !를 적절히 사용해서 다음과 같이 작성할 수 도 있다.

Export-Package: !com.*, *

com. 이하 모든 패키지는 제외하고 그 나머지 패키지들만 공개하겠다는 설정이다. 이 얼마나 간단한가.. 귿!
top

Write a comment.


유용한 OSGi 팁

Spring DM/Appendix E : 2008.07.10 10:58


E.1. OSGi Fragments

OSGi R4에 포함된, fragment는 매우 유용하면서도 강력한 기능이다. fragment는 "호스트 번들에 붙일 수 있는 번들"로써, 대상 번들에 컨텐츠를 추가할 수 있다. fragment는 자신의 클래스로더나 bundle activator를 사용할 수 없으며 호스트에 존재하는 정보를 재정의할 수 없다. 간략하게 fragment 번들을 사용해서 번들을 확장 할 수 있다. 따라서 resource, 클래스, 또는 manifest 요소들까지도 확장 가능한 형태가 된다. 스펙을 다시 인용하면 다음과 같다. "fragment의 주요 사용처는 로케일에 따른 번역 파일 제공이다. 이 것을 사용하여 주요 애플리케이션 번들에서 독립적으로 번역된 파일을 사용할 수 게 해준다."

Spring DM에서 이 기능은 extender와 같은 컴포넌트들을 설정할 때 매우 유용하다. 간단하게 추가할 리소스를 번들로 묶고 Manifest에 한 줄을 추가하면 된다.

Fragment-Host: <host bundle symbolic name>

위 설정을 가지고 있는 번들은 fragment이고 저기에 기술한 symbolic name을 가진 호스트 번들에 구성물들이 첨가가 된다. fragment와 host 번들 symbolic name은 달라야 한다. 예를 들어, Spring DM extender에 fragment를 추가하려면, 다음과 같은 manifest를 작성하면 된다.

Manifest-Version: 1.0                                                                    (1)
Bundle-ManifestVersion: 2                                                                (2)
Fragment-Host: org.springframework.bundle.osgi.extender                                  (3)
Bundle-SymbolicName: org.mydomain.project.fragment                                       (4)
Bundle-Name: my-fragment                                                                 (5)
Bundle-Description: Fragment attached to Spring-DM extender                              (6)

1    Manifest 버전
2    OSGi 번들 버전. 기본값인 1이면 OSGi R3 번들이고 2면 OSGi R4 번들이라 뜻.
3    이 번들을 부착할 번들의 symbolic name. 여기서는 spring-osgi-extender.jar를 가리키는 org.springframework.bundle.osgi.extender로 설정 함. Fragment-Host를 사용하여 OSGi 플랫폼에 자신이 fragment라는 특별한 번들임을 알려줌.
4    fragment symbolic name.
5    bundle name - 부가적이지만 유용한 헤더(가독성 측면에서)
6    bundle 설명 - OSGi 플랫폼이 사용하기 위한 것이 아니라, bundle name 처럼, 사람이 읽기 편한 헤더. 번들의 목적을 확인하기 위한 용도로 사용.

같은 symbolic name을 가진 호스트 번들이 여러 개일 때는 버젼을 명시해서 하나를 선택할 수 있다.

Fragment-Host: org.springframework.bundle.osgi.extender;bundle-version=1.1.0

버전의 기본값은 [0.0.0,∞) 다.


'Spring DM > Appendix E' 카테고리의 다른 글

유용한 OSGi 팁  (0) 2008.07.10
top

Write a comment.


20080710 GMP

모하니?/GMPing : 2008.07.10 08:56


News

city employees 씨리 임플로이스
could be 쿧비
In an afford to ~하기 위해서, ~하기 위한 일환으로
cut down on 줄이다
commute 통학하다

In an afford to cut down on commuting costs, 4,000 city employees in Birmingham Alabama began working a four week. It's an idea that could be coming to office neer you.

Screen English

Hi. Excuse me. Could you help?
Hm.. hm. yes.
I'm looking for a book obviously. 
Anything in particular?(특별히 찾으시는 거라도 있나요?)
Someting that can help me deal with what might be awkward situation.
Oh. OK.

Pop's English(She is so high)

Cuz she is so high, high above me. She is so lovely.
She is so high. CleoPatra, Joan of Arc, or Aphrodite.

Talk Play Learn

Aren't you going to ~?(~하지 않을꺼야?)

Aren't you going to join us?
Aren't you going to come in?
Aren't you going to say hello?
Aren't you going to say sorry?
Aren't you going to talk to me?
Aren't you going to look at me?
Aren't you going to say goodbye?
Aren't you going to wash your hands?

Sound Sound Play

p가 중간에 들어갈 땐 묵음

camps 캠스
empty 엠티
symptom 심텀

More Expression

찜찜한 기분 = mixed feelings

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

20080721 GMP  (0) 2008.07.21
20080718 GMP  (0) 2008.07.18
20080717 GMP  (0) 2008.07.17
20080716 GMP  (0) 2008.07.16
20080715 GMP  (0) 2008.07.15
20080710 GMP  (0) 2008.07.10
20080708 GMP  (0) 2008.07.08
20080707 GMP  (0) 2008.07.07
20080705 GMP  (0) 2008.07.05
20080704 GMP  (0) 2008.07.04
20080703 GMP  (0) 2008.07.03
top

TAG GMP

Write a comment.




: 1 : 2 : 3 : 4 :