Map <String, String> map;
이렇게 선언한 변수는 map 변수를 따라가야 Key에 넣은 String과 Value에 넣은 String의 값을 이해할 수 있습니다.
하지만 아래처럼 주석을 달면 좀 낫지 않을까요?
Map <String /*name*/, String /*address*/> map;
Map <String, String> map;
Map <String /*name*/, String /*address*/> map;
select * from $tableName$오류 메시지:
check .어쩌고 저쩌고 . findAll-AuthResultMap ...
<select id="findAll" remapResults="true"...>
select * from $tableName$
</select>
import org.springframework.context.support.ReloadableResourceBundleMessageSource;config.xml 번들 파일입니다.
ReloadableResourceBundleMessageSource bundle = new ReloadableResourceBundleMessageSource();
bundle.setBasename("config"); // config.xml, config.properties 등의 파일을 찾도록 설정
bundle.setCacheSeconds(60); // 1분 단위로 설정 파일 변경 여부 검사
bundle.getMessage("greeting", new String[] {"cybaek"}, null); // 세 번째 인자는 Locale
<?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>
순수한 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라도 충분히 쓸만하다고 생각합니다.
후배와 나눈 이야기를 정리해서 올려봤습니다.
import org.apache.commons.lang.builder.ReflectionToStringBuilder;
@Override
public String toString() {
return ReflectionToStringBuilder.toString(this);
}
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();