문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판 이전 판 다음 판 | 이전 판 | ||
springframework:abstractroutingdatasource [2015/11/03 14:02] kwon37xi [Shard DataSource 구분자] |
springframework:abstractroutingdatasource [2015/12/07 13:26] kwon37xi [Shard DataSource 구분자] |
||
---|---|---|---|
줄 13: | 줄 13: | ||
* 데이터 소스 구분자는 [[https:// | * 데이터 소스 구분자는 [[https:// | ||
// ThreadLocal로 데이터 소스 구분자 보관 예제 | // ThreadLocal로 데이터 소스 구분자 보관 예제 | ||
- | // 여기서는 static 메소드로 구현했지만 그 경우 모의 객체 기반 단위 테스트 작성이 어려워진다. | + | // 다른 예제들에서는 static 메소드로 구현했지만 그 경우 모의 객체 기반 단위 테스트 작성이 어려워진다. |
// Bean 으로 생성할 수 있도록 static을 사용하지 않게 하는 것이 좋아보인다. | // Bean 으로 생성할 수 있도록 static을 사용하지 않게 하는 것이 좋아보인다. | ||
public class CustomerContextHolder { | public class CustomerContextHolder { | ||
- | | + | |
new ThreadLocal< | new ThreadLocal< | ||
- | | + | |
Assert.notNull(customerType, | Assert.notNull(customerType, | ||
contextHolder.set(customerType); | contextHolder.set(customerType); | ||
} | } | ||
- | | + | |
return (CustomerType) contextHolder.get(); | return (CustomerType) contextHolder.get(); | ||
} | } | ||
// 쓰레드가 종료될 때(특히 웹 애플리케이션의 경우 쓰레드 pool로 공유되기 때문에) 기존 데이터 clear가 필요하다. | // 쓰레드가 종료될 때(특히 웹 애플리케이션의 경우 쓰레드 pool로 공유되기 때문에) 기존 데이터 clear가 필요하다. | ||
- | | + | |
contextHolder.remove(); | contextHolder.remove(); | ||
} | } | ||
줄 36: | 줄 36: | ||
</ | </ | ||
* 웹 애플리케이션의 경우 Thread Pool로 쓰레드가 공유되기 때문에, Request 종료 시점에 해당 쓰레드의 컨텍스트를 clear 해주는 filter나 interceptor를 두는 것이 좋다. | * 웹 애플리케이션의 경우 Thread Pool로 쓰레드가 공유되기 때문에, Request 종료 시점에 해당 쓰레드의 컨텍스트를 clear 해주는 filter나 interceptor를 두는 것이 좋다. | ||
+ | |||
+ | ===== Template/ | ||
+ | * 위의 '' | ||
+ | * 이를 위해 Template/ | ||
===== 트랜잭션 관련 주의할 점 ===== | ===== 트랜잭션 관련 주의할 점 ===== |