// 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(); } }
CustomerContextHolder
를 통해 DataSource를 지정하고, 해제하는 것을 처리하지 않아 오류가 발생할 수 있다.CustomerContextHolder
를 초기화하고, Callback 메소드 실행후 초기화를 해주는 패턴으로 가면 좋다.@Transactional
이 걸리기 전)에 먼저 사용할 DB를 지정하는 작업이 선행돼야 한다.Propagation.REQUIRES_NEW/NEVER/NOT_SUPPORTED
등을 조합할 수 있어야 한다.