같은 서버에 요청을 두 번 보냈더니 로그의 스레드 이름이 exec-2 와 exec-3 으로 달랐다. 그러면 컨트롤러 객체도 두 개일까?
아래 재생기의 ▶를 누르면 한 스텝씩 진행된다. 금색 테두리가 지금 이야기하는 곳이고, 캡션이 무슨 일이 일어났는지 말해 준다. 굵게 밑줄 친 말은 누르면 뜻이 나온다. 빨간 딱지는 그때 벌어지는 일의 이름이고, 캡션 바로 위 회색 글자는 지금 스텝이 속한 묶음의 이름이다.
카드 아래 회색 줄은 그 일이 실제로 적혀 있는 소스의 파일 이름 : 줄 번호와 함수 이름이다. 글 안에 (:669)처럼 줄 번호만 적힌 것은 바로 앞에 적은 파일의 그 줄이라는 뜻이다. 캡션 한가운데 박힌 긴 영어 이름과 괄호 속 파일 · 줄 번호도 같다 — 건너뛰고 한글만 읽어도 뜻이 통하게 써 두었다.
장면 · 스레드 하나가 집어 간다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 가 각각 한 개씩 있는 것으로 봤다. 두 요청이 같은 객체를 썼는지 객체의 신원까지 찍어 확인하지는 않았다.