Eclipse와 Cyclic Dependencies(상호의존? 순환의존?) 프로그래밍

Toby님의 오늘 블로그에Cyclic Dependencies에 관한 포스트가 올라왔다.
자바의 한 패키지가 다른 패키지에 순환적 구조로 의존하면 안된다는 것이다.

packageA.ClassA 가 packageB.ClassB 를 참조하고, packageA.ClassB가 packageB.ClassA 를 참조하면, packageA와 packageB가 서로 순환적으로 의존하는 관계가 된다.

사실 이걸 피하기는 많이 어려워보인다(솔직히 이걸 피해야 하나 그런 생각도 잠시 했다). 그러나 그걸 피해야 한다는 것을 설명한 것이 이번 Toby님의 글이다.

내가 쓰려는 것은 패키지간의 의존관계를 넘어 프로젝트의 의존관계에 문제가 생겼을 때 Eclipse에서 대처하는 방법이다.

동일 프로젝트 내의 각 패키지 간에도 순환적인 의존성이 있으면 안된다고 이렇게 주장을 하는데, 지금 내가 참여하는 프로젝트는 프로젝트와 프로젝트 사이에 순환적 의존관계가 설정되어 있다. 이 때문에 처음에 들어와서 프로젝트의 구성 상태를 보고 매우 당황했다.


ProjectA의 projectA.ClassA가 ProjectB의 projectB.ClassB를 사용하고, projectA.ClassB는 projectB.ClassA를 사용하는 식의 순환구조로 되어 있다.

덕분에 현재 우리 팀원들은 Eclipse를 제대로 사용을 못하고 있다. Eclipse는 기본적으로 프로젝트와 프로젝트간의 순환적인 의존관계를 허용하지 않기 때문이다. 아예 컴파일을 중단해 버린다. Eclipse가 아예 허용도 안 해버릴 정도면 이게 얼마나 안 좋은 것인지 대략 감이 올것이다. 아래는 Cyclic Dependecies에 대한 Eclipse의 오류 메시지이다.
A cycle was detected in the build path of project: ProjectA



그리고 단순히 생각해보면, ProjectA를 빌드하는 Ant 스크립트와 ProjectB를 빌드하는 Ant 스크립트가 있다고 해보자.
모든 빌드 디렉토리를 clean(*.class 완전 삭제)하고서 깨끗한 상태에서 ProjectA를 Ant 빌드 스크립트로 빌드한다고 보자. 그럴때 ProjectA는 ProjectB의 클래스가 없기 때문에 컴파일을 중간에 오류가 나고 멈추게 된다. ProjectB도 마찬가지이다. ProjectA의 컴파일이 완료가 안됐기 때문에 ProjectB도 그로인해 컴파일 오류가 발생하고 중단된다.

한마디로 DeadLock 상태에 빠지는것이다.

현재 우리 팀원들은 이 문제로 각 프로젝트간의 클래스 패스 설정을 이클립스에서 빼버리고 각 프로젝트의 클래스들을 따로 따로 빌드하고, Jar 로 묶은 다음, 각 프로젝트는 서로 다른 프로젝트의 Jar 파일을 참조하게 한다.
이로 인해서 ProjectA의 소스 코드를 바꾸는 순간 그것이 ProjectB의 소스에 어떤 영향을 미치는지는 컴파일하고 Jar 로 묶기 전에는 결코 알 수가 없다.
더욱 심각한 문제는 ProjectA를 바꾼뒤, Jar로 묶어서 ProjectB에 어떤 영향을 끼치는지 확인하는 작업을 잠시 잊어버려 버릴 때이다. 이 상태로 "음~ 에러가 하나도 안나는군~ 좋아~" 하고서 버전 컨트롤 시스템에 올려버리면, 이 사람은 순간적으로 다른 모든 사람들의 빌드를 실패하게 만들어 버린다(이런일이 몇번 발생했다).

억지로 이걸 해결할 수는 있다. 다음 처럼 Eclipse(3.2기준)에서 Circular dependecies에 관한 설정을 Error에서 Warning으로 살짝 바꾸면 컴파일은 무사히 한다.

이 상태에서는 jar에 대한 빌드 패스 설정을 삭제하고, 프로젝트 상호간에 빌드 패스로 설정해도 괜찮아지긴 한다.

하지만, Project 간의 순환적인 의존관계는 절대로 피해야 한다. 저것은 어쩔 수 없이, 지금 당장 Eclipse를 사용해서 개발을 해야하기 때문에 사용한 언 발에 오줌누기일 뿐이다.

단순히 생각해보라... 아무런 클래스도 없이 깨끗해진 상태에서는 제대로 빌드하려면, 빌드 스크립트를 사용할 수 없고 각 클래스를 일일이 javac 명령으로 컴파일 해야한다고.

덧글

  • 이현찬 2006/12/16 03:31 # 삭제

    이에 대한 해법으로 판매되는 우리회사 솔루션이..
    BuildForge 라는 제품이 있다네.. 자세한 것은 강승억군이 담당이니
    물어보시게싼.. 단, 가격이 좀 쎄네..ㅎㅎㅎ
    참, 내 도메인 날아가서 새롭게 바꿨다네.. 참고하시라. 수거수거!~
  • 권남 2006/12/16 10:52 #

    아니, 그사이에 누가 jtop 채간거예요?
    빠르기도 해라.
    참.. 제가 제품 베타 테스터가 돼 드릴께요~
    어찌... 한 카피씩 무료로?? Rose도..??
※ 로그인 사용자만 덧글을 남길 수 있습니다.