현재 내 로컬PC에는 여러 개의 이클립스가 설치되어 있다. 아마도 대부분의 SI개발자들은 보통 2개 이상의 이클립스가 한 PC에 존재하게 되는데, 이렇게 되면

  • 디스크를 많이 잡아먹는다
  • 설정을 공유하기가 쉽지 않다
  • 수많은 플러그인의 설치 및 관리가 쉽지않다
이 중에서 중복된 플러그인 파일로 인한 디스크 낭비와 추가로 플러그인을 설치하기 위한 에포트 낭비 문제를 해결할 아이디어가 생각났다. 바로 Maven의 레포지토리 개념을 이클립스 플러그인 관리에도 도입하는 것이다.

메이븐 레포지토리처럼 이클립스 플러그인들을 중앙 레포지토리에 몰아넣고, 플러그인 설치시에는 중앙레포지토리로부터 자동으로 로컬 레포지토리에 다운로드한다. 그리고 실제 이클립스를 띄우면 이클립스는 로컬 레포지토리의 플러그인을 로딩한다.

이클립스 플러그인 관리 화면에서는 사용자가 로컬 또는 리모트 레포지토리에 존재하는 플러그인들을 검색,설치,제거,업그레이드 등의 작업을 할 수 있게 지원한다. 플러그인들 사이의 의존성도 자동으로 체크된다.

뭐 플러그인이 너무 많아서 관리가 쉽진 않겠지만 매번 플러그인 홈페이지 주소 찾고 지원하는 이클립스 버전확인하고 업데이트 URL복사하여 이클립스 화면에 붙여넣고 등등 이제는 너무 귀찮다.






Posted by 에코지오
,
안드로이드 소스를 보면서 static과 더불어 저를 당황하게 하는 것이 내부(inner) 클래스입니다. 10년간 웹개발만 해서인지 내부 클래스 사용 경험이 별로 없어서겠지요.

나름대로 정리해본 내부 클래스 사용 이유입니다.

- 외곽(outer) 클래스의 모든 필드를 자유로이 사용가능
- 내부 클래스는 다중상속의 문제점을 해결하는 하나의 방안이 될 수 있음
  (자바는 여전히 하나의 추상클래스 밖에 상속하지 못하기 때문에 제한이 있으며,
  특정 클래스를 내부 클래스가 상속하게 하여 다중상속의 기능을 제공)
- 외곽 클래스와 같은 생명주기를 가지면서 외곽 클래스에서만 사용되는 경우
- 그외 주로 이벤트 중심 시스템(Event Driven System)과 같은 제어구현에서 내부클래스가 많이 사용됨
Posted by 에코지오
,

패키지(및 그 소속 클래스)들 사이에 상호 참조하는 '순환(cycling) 의존관계'가 존재하는 경우 순환 의존관계가 끊어지도록 패키지 구조를 재구성하는 방법들을 정리해봅니다.

  •  참조되는 클래스에 대한 추상클래스를 만들어 참조하는 패키지에 포함
  •  참조되는 로직(멤버변수/메소드)를 참조하는 클래스로 이동
  •  참조되는 로직을 매개클래스에 담아 참조하는 패키지로 이동
  •  상호참조 로직을 클래스로 분리하여 별도의 패키지로 이동
  •  참조되는 클래스가 독립적이면 참조하는 패키지로 이동


 

Posted by 에코지오
,

하이버네이트 매핑설정에는 lazy 옵션이 있습니다. 연관객체를 언제 로딩할거냐에 대한 옵션입니다. true로 설정하면 하이버네이트는 부모객체를 로딩할 때 그에 딸린 연관객체(자식객체)를 미리 로딩하지 않고 프록시 객체만 만들어둡니다. 그리고는 실제로 연관객체가 사용될 때 연관객체를 로딩하죠. false이면 부모객체가 로딩될 때 연관객체도 함께 미리 로딩합니다.

Employee(부모)와 Achievement(자식) 가 있습니다. 아래처럼 lazy=true 로 설정되어 있기 때문에 Achievement 목록은 실제 쓰이지 않는다면 로딩되지 않습니다.

<class name="Employee" table="EMP">
... ...
<set name="achievements"

       lazy="true" 

      ... ... >

    <key column="EMP_ID" />
    <one-to-many class="Achievement" />
</set>

그러나 연관객체를 미리 로딩하고 싶을 때도 있습니다. 크게 세가지 방법이 있습니다.

 (1) HQL fetch 키워드 사용
left outer join fetch 키워드를 사용하면 lazy=true, fetch=select 이더라도
조인을 통해 1번의 쿼리로 연관객체를 모두 가져옴.
 
Query q = session.createQuery(" from Employee as emp "
        + " left outer join fetch emp.achievements "
        + " where emp.id = :employeeId");

q.setParameter("employeeId", employeeId);
employee = (Employee) q.list().get(0);
 
(2) Criteria에서 fecth mode를 JOIN으로 설정
 
Criteria c = session.createCriteria(Employee.class);
c.setFetchMode("achievements", FetchMode.JOIN);
c.add(Restrictions.idEq(employeeId));
employee = (Employee) c.uniqueResult();
 
(3) Hibernate.initialize 메소드 이용
연관객체를 임의로 미리 로딩. 단, 세션안에서만 사용가능.
 
employee = (Employee) session.get(Employee.class, employeeId);
Hibernate.initialize(employee.getAchievements());

Posted by 에코지오
,

여기저기 주워 들은 정보를 취합하여 메모한 게 있길래 오랜만에 포스팅합니다.

 

  • 자바 기초
    애자일 자바
    헤드퍼스트 자바

     

  • 좋은 설계
    헤드퍼스트 객체지향
    자바언어로 배우는 디자인패턴
    리팩토링(마틴 파울러)

     

  • 좋은 구현

    구현 패턴(켄트 벡)
    이펙티브 자바
    클린 코드(아직 번역서 없음?)

이 글은 스프링노트에서 작성되었습니다.

Posted by 에코지오
,

대부분의 WAS는 웹어플리케이션을 deploy / undeploy / redeploy 할 수 있는 다양한 방법을 제공합니다.

어드민 콘솔을 통한 방법, Ant task를 이용하는 방법, 커맨드라인에서 실행하는 방법 등이 있죠. WebLogic이라면 weblogic.jar에 포함된 weblogic.Deployer 클래스를 통해서, JEUS라면 jeusadmin을 통해서 커맨드라인에서 작업을 처리할 수 있습니다.

그런데 제가 찾아본 바로는 Tomcat은 이 중에서 커맨드라인에서 특정 웹어플리케이션을 콘트롤하는 수단을 제공하고 있지 않습니다. 아무리 구글링해봐도 안나오네요. 왜 없을까요? 경우에 따라서 커맨드라인 방식도 분명 필요할 때가 있을텐데 말이죠. 

이 글은 스프링노트에서 작성되었습니다.

Posted by 에코지오
,

일반적으로 허드슨에서 빌드스크립를 실행하는 프로세스와 독립된 별도의 WAS 프로세스 띄우기는 불가능합니다.

아마도 다음과 같이 Ant 스크립트에서 exec 타스크의 spawn 파라미터를 true로 설정하여 WAS를 시작하면 된다고 생각할지도 모릅니다.

 

    <exec dir="${was.command.dir}"
          executable="${was.command.dir}/${was.command.deploy}"
          spawn="true" />

 

* spawn :  멀티태스킹이 지원되는 운영체계에서 하위 프로세스를 만드는 것.(http://terms.co.kr/spawn.htm)

 

그러나 이 작업을 허드슨에서 실행하게 되면 해당 빌드 프로세스는 WAS 프로세가 끝나지 않는이상 종료되지 않습니다.(특히 윈도에서)

이에 대한 이유와 해결방안은 다음 글을 참조하세요.

Spawning processes from build

 

 

이 글은 스프링노트에서 작성되었습니다.

Posted by 에코지오
,

  Ant에서 나중에 올라온 프로퍼티 파일이 먼저 기술된 프로퍼티 파일의 property를 덮어쓰는 게 가능한가요?

이 글은 스프링노트에서 작성되었습니다.

Posted by 에코지오
,
Posted by 에코지오
,
Posted by 에코지오
,