오늘은 어디로 갈까...

DAMO 본문

無汗不成

DAMO

剛宇 2009. 5. 19. 08:03
 요즘 예전에 만들어 놓았던 DAMO 라는 프로그램을 리뉴얼(renewal)하고 있는데, 생각보다 쉽지가 않다.
 (javassist를 적응할겸해서, 쿼리 실행 부분을 동적으로 클래스로 생성하여 사용할려고하는데, 구조를 약간 손봐야해서 힘이든다.)
 이놈은 persistent framework인데, 간단히 설명하자면 Class를 가지고 쿼리를 생성해서 실행, 결과 맵핑을 해준다.
 요즘은 워낙 좋은게 많아서 본인도 잘 사용을 안하지만, 아주 간단한(?) 프로그램을 짜기에는 편하다는(?) 장점을 제공해준다.
 그 장점은 사실 별거 아니다. xml을 작성할 필요가 없다는 것이다. 쿨럭 ^^;
 눈치 빠른분들은 이미 아셨겠지만, 이놈이 만들어지던때에 다모(茶母)라는 드라마가 방영되고 있어서.... 이름을 DAMO라고 지어주었다.
 Data Access Management Object의 약자라고 본인은 우기고 있지만, 저게 맞는 영어인지는 아직도 잘 모르겠다. ^^;
 초기 버젼은 java.lang.reflect 를 이용해서, 단순히 클래스명, 필드명을 테이블명, 컬럼명과 대치시켜서 사용했는데, Java 5 전용(?)으로 업그레이드 하면서 annotation을 사용하였다.
 사실 지금봐서는 허접한 프로그램임이 분명한데도, 이걸 멋있게 수정할 수 없는 능력이 없는것을 보면, 기술적 진보가 전혀 없음을 알 수 있다. ㅠㅠ
 그러고보니 벌써 6년이라는 세월이 지났구나.... 경력과 실력은 정비례하는게 아닌게 분명한것을 알면서도, 너무 게으름을 피웠나....
 솔직히 아래 소스를 보고서는, 기술적으로 퇴보하였구나 하는 느낌까지 들었다.
 private으로 선언된 필드(field)에 접근하기 위해서 setAccessible(boolean) 메소드를 사용하였는데, 이걸 사용하기 전에 "suppressAccessChecks" 권한이 있는지 체크하는 로직이 들어있었다. (사실 javadoc에 보면 설명이 나온다 --;)
	public static boolean canSuppressAccess() {
		SecurityManager securityManager = System.getSecurityManager();
		try {
			if (securityManager != null) {
				securityManager.checkPermission(new ReflectPermission("suppressAccessChecks"));
			}
		} catch (SecurityException e) {
			return false;
		}
		return true;
	}

	public static xxx() {
		if (canSuppressAccess()) {
			field.setAccessible(true);
		}
	}

 뭐, 대충 이런느낌인데, 현재의 나는~ 권한 체크를 해야한다는것을 모르고 있었다. --;
 (setAccessible(boolean) 메소드에도 저 권한 체크 부분이 들어있다. --;)
 요즘은 AccessibleObject.setAccessible(AccessibleObject[], boolean); 메소드를 애용하고 있는데, 이소스를 뜯어보니, 여기도 같은 권한 체크 부분이 들어있다.
    static final private java.security.Permission ACCESS_PERMISSION = new ReflectPermission("suppressAccessChecks");

    public static void setAccessible(AccessibleObject[] array, boolean flag) throws SecurityException {
	SecurityManager sm = System.getSecurityManager();
	if (sm != null) sm.checkPermission(ACCESS_PERMISSION);
	for (int i = 0; i < array.length; i++) {
	    setAccessible0(array[i], flag);
	}
    }



 모르면서 사용하고 있다니.....
 거기다가 java.util.concurrent을 그때도 사용하고 있었다니... 지금은 모르는데 --;
import java.util.concurrent.ConcurrentHashMap;

public class ClassInfo {

	private static boolean cacheEnabled = true;
	private static final ConcurrentHashMap, ClassInfo> CLASS_INFO_CACHE_MAP = new ConcurrentHashMap, ClassInfo>();
	
	private ClassInfo(Class clazz) {
		
	}
	
	public static ClassInfo getInstance(Class clazz) {
		if (cacheEnabled) {
			ClassInfo classInfo = CLASS_INFO_CACHE_MAP.get(clazz);
			if (classInfo == null) {
				classInfo = new ClassInfo(clazz); 
				ClassInfo temp = CLASS_INFO_CACHE_MAP.putIfAbsent(clazz, classInfo);
				if (temp != null) {
					classInfo = temp;
				}
			}
			return classInfo;
		} else {
			return new ClassInfo(clazz);
		}
	}
}



 아~~ 은퇴할때가 온것일까..... ㅠㅠ