Study · Spring Boot · STEP 7 / 8 · 요청마다

주소를 메서드에 잇는 표는 요청이 올 때가 아니라 기동할 때 이미 만들어져 있다

장면

GET /test 를 보내면 내가 쓴 health() 가 불린다. 스프링은 그 주소가 어느 메서드인지 요청마다 찾아볼까, 아니면 미리 알고 있을까?

아래 재생기의 ▶를 누르면 한 스텝씩 진행된다. 금색 테두리가 방금 바뀐 곳이고, 캡션이 무슨 일이 일어났는지 말해 준다. 굵게 밑줄 친 말은 누르면 뜻이 나온다.

장면 · 어느 메서드인지 고른다 0 / 11

6단계에서 DispatcherServlet이 요청을 접수했다. ▶를 누르면 그 주소가 어느 메서드인지 어떻게 정해지는지 11스텝으로 따라간다. 여기서 「표」라고 부르는 것이 핸들러 매핑이고, 표는 셋이다.

키보드 · ← → 한 스텝 · Space 재생/멈춤 · Home 처음

표는 세 개이고 순서가 정해져 있다. 앞의 표가 답하면 거기서 끝나고, 아무도 답하지 않으면 모든 주소를 잡는 정적 파일 표가 마지막으로 받는다. 그 표마저 파일을 못 찾으면 404로 끝나지 않고 /error 로 한 번 더 돌아 BasicErrorController 가 답한다. 그래서 내가 에러 페이지를 만든 적이 없는데도 404 응답에 본문이 붙어 있다.

어떻게 확인했나

  • 6 mappings 와 네 개의 내 메서드 이름은 기동 로그의 매핑 등록 줄에서 읽었다.
  • 각 주소가 어느 표에 걸렸는지는 요청을 보낸 뒤의 Mapped to 줄에서 그대로 읽었다 — RequestMappingHandlerMapping · WebMvcEndpointHandlerMapping · SimpleUrlHandlerMapping 세 가지가 나온다.
  • 404 뒤에 /error 로 다시 도는 것과, Accept 가 text/html 일 때 error 대신 errorHtml 이 걸리는 것은 /nope 를 두 번(기본 요청 한 번 · text/html 로 한 번) 보내 확인했다.