- 쓰레드 로컬은 해당 쓰레드만 접근할 수 있는 특별한 저장소를 말한다.
- 각 쓰레드마다 별도의 내부 저장소를 제공한다.
- 따라서 다양한 쓰레드가 같은 인스턴스의 쓰레드 로컬 필드에 접근해도 문제가 없다.
해당 쓰레드가 쓰레드 로컬을 모두 사용하고 나면 remove()를 호출해서 꼭 제거해주어야 한다.
- WAS는 쓰레드 풀을 운용한다. 즉, 반환된 쓰레드를 다시 재사용한다.
- 만약 반환된 쓰레드가 쓰레드 로컬 저장소를 사용하고 저장소를 비우지 않았다면?
- 장애발생!
- 따라서 쓰레드 로컬 값을 다 사용하였다면 반드시
ThreadLocal.remove()
를 통해 쓰레드 로컬 저장소를 비워주어야 한다.
- 좋은 설계는 변하는 것과 변하지 않는 것을 분리하는 것이다.
- 진정한 좋은 설계는 변경이 일어날 때 자연스럽게 드러난다.
- 변경 지점을 하나로 모아서 변경에 쉽게 대처할 수 있는 구조를 통해 SRP를 준수할 수 있다.
- 작업에서 알고리즘의 골격을 정의하고 일부 단계를 하위 클래스로 연기한다.
- 하위 클래스는 상속을 통해 알고리즘의 특정 단계를 재정의한다.
- 자식 클래스와 부모 클래스가 컴파일 시점에 강하게 결합된다.
- 자식 클래스는 부모 클래스의 기능을 하나도 사용하지 않음에도 불구하고, 부모 클래스에 의존한다.
- 부모 클래스의 변경이 발생하였을 때 변경의 범위가 자식 클래스까지 전파된다.
- 템플릿 메서드 패턴 대신 전략 패턴을 사용하여 상속에서 오는 문제점들을 해결할 수 있다.