같은 서버에 요청을 두 번 보냈더니 로그의 스레드 이름이 exec-2 와 exec-3 으로 달랐다. 그러면 컨트롤러 객체도 두 개일까?
아래 재생기의 ▶를 누르면 한 스텝씩 진행된다. 금색 테두리가 방금 바뀐 곳이고, 캡션이 무슨 일이 일어났는지 말해 준다. 굵게 밑줄 친 말은 누르면 뜻이 나온다.
장면 · 스레드 하나가 집어 간다0 / 11
5단계에서 포트가 열렸다. ▶를 누르면 요청 하나가 도착해 내 컨트롤러 앞에 닿기까지 11스텝으로 따라간다.
키보드 · ← → 한 스텝 · Space 재생/멈춤 · Home 처음
요청 하나에 스레드 하나가 붙고, 그 스레드는 매번 다르다. 그런데 컨트롤러는 빈이라 통에 하나뿐이고, 어느 스레드가 오든 같은 객체를 부른다. 그래서 컨트롤러에 필드를 두고 값을 담아 두면 여러 스레드가 같은 필드를 함께 쓰게 된다 — 두 요청이 겹치면 뒤에 온 쪽이 앞의 값을 덮어쓸 수 있다는 뜻이다. 다만 이 실측에서 확인한 것은 스레드는 여럿이고 객체는 하나라는 데까지이고, 실제로 값이 덮이는 장면을 만들어 보지는 않았다.
어떻게 확인했나
스레드 이름(exec-2 · exec-3)과 시각(01.198 · 01.212)은 요청을 보낸 뒤의 로그에서 그대로 읽었다.
필터 4개의 이름과 order 값은 기동 로그의 필터 등록 줄에서 읽었다. order 는 작을수록 먼저 거친다.
Initializing Spring DispatcherServlet 을 찍은 스레드가 main 이 아니라 exec-2 라는 것은 그 로그 줄의 스레드 칸에서 확인했다.
컨트롤러가 하나라는 것은 통의 빈 목록에 orderController · testController 가 각각 한 개씩 있는 것으로 봤다. 두 요청이 같은 객체를 썼는지 객체의 신원까지 찍어 확인하지는 않았다.