데이터 소스 구분자는
ThreadLocal 등으로 현재 요청 쓰레드에 대한 상태를 유지하고 있어야 한다.
// ThreadLocal로 데이터 소스 구분자 보관 예제
// 다른 예제들에서는 static 메소드로 구현했지만 그 경우 모의 객체 기반 단위 테스트 작성이 어려워진다.
// Bean 으로 생성할 수 있도록 static을 사용하지 않게 하는 것이 좋아보인다.
public class CustomerContextHolder {
private final ThreadLocal<CustomerType> contextHolder =
new ThreadLocal<CustomerType>();
public void setCustomerType(CustomerType customerType) {
Assert.notNull(customerType, "customerType cannot be null");
contextHolder.set(customerType);
}
public CustomerType getCustomerType() {
return (CustomerType) contextHolder.get();
}
// 쓰레드가 종료될 때(특히 웹 애플리케이션의 경우 쓰레드 pool로 공유되기 때문에) 기존 데이터 clear가 필요하다.
public void clearCustomerType() {
contextHolder.remove();
}
}