시간순서로 생각의 흐름을 기록해보자.
Runnable 과 Callable 의 차이에 대해서 알아봄.Runnable을 보다가 문득 Tomcat의 Catalina에서 요청이 들어왔을때, 어떤식으로 스레드 생성 및 분배를 하는 것인지 궁금해짐. DispatcherServlet에서 스레드를 생성해서 나눠주는 것인가라는 생각을 해서 찾아봄. 스레드 생성과 관련한 부분을 찾을 수 없었음.ThreadPool을 이용할 거라는 생각에 Tomcat GitHub 레포지토리에서 ThreadPool 관련해서 검색함. 복잡한 구조탓에 정확히 어느지점에서 실행하는지 알 수 없었음. stack trace를 보면 스레드가 시작한 지점을 알 수 있을 거라 생각함. @RestController
class GreetingController {
@GetMapping("/")
fun hello(): String {
throw Exception("뭔가 잘못되었다.")
}
}
http GET localhost:8080
아래에서 부터 시간순으로 스레드가 생성되고 Coyote에서 소켓연결, HTTP 연결을 처리한 후, Catalina에서 DispatcherServlet을 거쳐서 메시지 파싱을 한 후에 각 Servlet에 분배가 되는 과정을 볼 수 있었음.
이미 알고 있는 것을 최대한 활용하는 지점에서 경계가 보일때 새로운 것이 나타난다. 새로운 지식을 얻었을때 기존의 것과 충돌되는 부분을 찾지 않는다면, 새로운 것과 이전 것은 그저 개별적인 지식으로 머물게 된다.
경계에 부딪혔을때 증상은 당황되고 제대로 설명이 안되는 지점이 나타나는 것. 이때부터 진짜 재미있는 지점이 시작되는것 같다.
그리고, 이때부터 침착함이 필요한 것 같다. 새로운 연결을 만들기 위해서, 비교적 연관성이 낮게 설정되어 있던 지식을 탐색하거나 미지의 것을 찾아야하기 때문이다.