Map 주석달기

자바 2008/05/20 20:52 posted by 낭만검객
Map <String, String> map;

이렇게 선언한 변수는 map 변수를 따라가야 Key에 넣은 String과 Value에 넣은 String의 값을 이해할 수 있습니다.

하지만 아래처럼 주석을 달면 좀 낫지 않을까요?


Map <String /*name*/, String /*address*/> map;

아래와 같은 동적 쿼리를 수행하면 필드 이름이 테이블 이름에 따라 다를 수 있습니다. 아이바티스는 디폴트로 해당 결과의 메타데이터(필드, 타입 등)를 캐쉬합니다. 따라서 두 번째 호출 때 다른 필드를 리턴한다면 오류가 발생합니다.

select * from $tableName$
오류 메시지:
check .어쩌고 저쩌고 . findAll-AuthResultMap ...


이런 경우 remapResults 속성을 true로 해주면 간단히 해결할 수 있습니다.

<select id="findAll" remapResults="true"...>
select * from $tableName$
</select>



자세한 설명은 http://openframework.or.kr/blog/?p=130

ResourceBundle 파일의 한글문제

자바/스프링 2008/02/23 19:01 posted by 낭만검객
ResourceBundle은 간단한 설정을 저장하기에 적합한 파일입니다. 그러나 한글을 자유롭게 쓰지 못하고 변경 내용을 자동으로 읽을 수 없습니다. 이 두 가지 문제점을 해결하기 위해 어려 해결책이 있지만 스프링의 ReloadableResourceBundleMessageSource이 쉽고 편합니다.

import org.springframework.context.support.ReloadableResourceBundleMessageSource;

ReloadableResourceBundleMessageSource
 bundle = new ReloadableResourceBundleMessageSource();

bundle.setBasename("config"); // config.xml, config.properties 등의 파일을 찾도록 설정
bundle.setCacheSeconds(60); // 1분 단위로 설정 파일 변경 여부 검사

bundle.getMessage("greeting", new String[] {"cybaek"}, null); // 세 번째 인자는 Locale
config.xml 번들 파일입니다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "
http://java.sun.com/dtd/properties.dtd
">
<properties version="1.0">
 <entry key="greeting">Hello {0}!</entry>
</properties>


참조:
스프링 레퍼런스:
http://static.springframework.org/spring/docs/2.5.x/api/index.html
스프링 소스: spring-framework-2.5.1/test/org/springframework/context/support/ResourceBundleMessageSourceTests.java

AOP로 인해 코드가 혼란스럽지 않은가?

자바 2008/02/12 10:27 posted by 낭만검객

순수한 OOP를 추종하는 사람들은 AOP 기술을 그리 달가워하지 않습니다. 대표적인 것이 메소드의 리턴값을 가로채어 다른 값으로 바꾸는 것입니다.

methodA()를 호출했고 디버거에서 분명히 "abc"를 리턴하는 것을 확인했는데 결과 값이 "ABC"라면 코드를 읽는 사람은 답답할 것입니다. 이런 상황은 아마도 다른 사람에게서 코드를 인수했을 때 많이 발생할 듯 합니다.

이런 혼란 때문에 AOP를 쓰더라도 프로그램 로직에 영향을 주지 않는 선까지만 적용하자는 의견이 있습니다. 그런 주장을 하는 사람들이 드는 예로 프로파일링을 위한 메소드 수행 시간 측정, 디버깅 등을 위한 로깅 등이 있습니다.

그렇다면 과연 이렇게 로직에 영향을 주지 않는 곳에만 써야 좋을까요? 아래 트랜잭션을 처리하는 자바 코드가 있습니다.

public void 계좌이체(long 금액) {
    dbCtx.begin();
    try {
        출금(금액);
        송금(금액);
    }
    catch(Exception ex) {
        dbCtx.rollback();
        return;
    }
    dbCtx.commit();

}

대개 이와 같은 코드를 작성합니다. 특히 빨간 코드는 트랜잭션 처리를 위해 들어간 코드입니다. 이것을 스프링 프레임워크의 자바 주해(annotation) 기능을 이용한 AOP를 적용하면 다음과 같이 간결하게 바꿔 쓸 수 있습니다.

@Transactional
public void 계좌이체(long 금액) {
    출금(금액);
    송금(금액);
}

이 코드에는 로직에 관여하는 AOP를 적용했습니다. 하지만 코드를 읽는데 혼란은 거의 없습니다. 이렇게 코드에 명백히 드러난다면, 로직에 관여하는 AOP라도 충분히 쓸만하다고 생각합니다.
 

후배와 나눈 이야기를 정리해서 올려봤습니다.

TAG AOP, 자바

toString()을 쉽게 만들기

자바 2007/12/10 19:13 posted by 낭만검객
자카르타 커먼스(commons.lang) 패키지에 유용한 것이 많습니다. 그 중에 당장 쉽게 쓸 수 있는 것으로 ReflectionToStringBuilder가 있습니다.

문자열 덧셈 혹은 StringBuilder의 append를 호출해서 만드는 toString 작업을 한 줄로 해결할 수 있습니다.


import org.apache.commons.lang.builder.ReflectionToStringBuilder;

@Override
public String toString() {
 return ReflectionToStringBuilder.toString(this);
}
클래스 패스에 있는 파일을 읽는 방법(ClassLoader, Class, ResourceBundle)은 많습니다. 반면에 그렇게 읽은 파일의 절대 경로를 구하는 방법은 찾기 쉽지 않았습니다.

아래 스프링에 있는 ClassPathResource를 이용한 코드 조각이 있습니다.

import java.io.File;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

Resource r =
  new ClassPathResource("com/cybaek/test/core/hello.doc");
File f = r.getFile();
String path = f.getAbsolutePath();
TAG 자바