Whiteship's Note


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


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


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


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