해결된 질문
작성
·
672
1
안녕하세요 토비님!! @Component 스캔
강의 마지막 즈음에
1. @RestController는 내부에 @ResponseBody를 메타어노테이션으로 가지고 있기에 디스패처 서블릿
이 컨트롤러에 @ResponseBody가 붙어있는 것으로 인지할 수 있고
2. 더 나아가 @RestController와 @Controller가 클래스 레벨에 붙게 되면 @RequestMapping을 삭제할 수 있기 때문에 디스패처 서블릿
이 내부적으로 매핑 정보가 있음을 인식한다고 말씀하셨습니다!!
이전에 자바 웹 프로그래밍 Next Step 책으로 공부를 했을때 디스패처 서블릿
은 내부적으로 핸들러에 대한 매핑
을 가지고 있고 핸들러 매핑 구현체는
ApplicationContext
를 통해 @Controller 어노테이션이 붙어있는 클래스를 요청하여 받아와 사용하기 편리한 형태의 오브젝트로 만들어 보관하는것으로 알고 있습니다!
만약 책에서 공부했던 내용과 실제 Spring MVC 구조가 동일하다면, 위와 같은 상황 때문에 디스패처 서블릿이 내부적으로 매핑 정보가 있음을 인식한다고 말씀하신것인지 확인차 질문드립니다!!
그리고 1번의 경우를 실제 코드레벨로 보고 싶어서 찾아보고 있는데 어떤 코드를 봐야할지 모르겠습니다.. 혹시 약간의 힌트를 주실 수 있을까요?
답변 1
2
디스패처 서블릿이 포함된 SpringMVC 기술은 처음 서버가 시작될 때 핸들러 매핑 정보를 수집해서 보관합니다. 이후에 웹 요청이 들어오면 이 매핑 정보를 뒤져서 어느 핸들러(컨트롤러)의 메소드를 실행할지를 결정합니다.
매핑 정보는 XML과 같은 외부 파일로 작성 가능합니다. 그리고 코드 내의 애노테이션으로부터 그 정보를 수집하기도 합니다. 핸들러 매핑 전략이 다양하게 사용되고, 애노테이션을 활용하는 것은 그중 하나일 뿐입니다.
애노테이션은 XML이나 yaml, properties와 같은 외부 파일에 넣는 정보를 자바 코드 안에 둘 수 있게 하는 방식이라고 생각하시면 됩니다. 일반 자바 코드와 달리 그 자체로 어떤 기능이 수행되지 않습니다. 파일을 읽어서 정보를 가져와서 사용하듯이, 코드에 붙은 애노테이션을 읽어서 거기서 얻을 수 있는 정보를 사용하는 것입니다.
매핑 정보를 다루는 스프링의 코드를 살펴보고 싶으시다면, 스프링 소스코드를 받은 뒤에org.springframework.web.servlet.HandlerMapping 인터페이스를 구현한 클래스들을 보시면 됩니다. 그중에서 @RequestMapping 애노테이션을 사용하는 핸들러 매핑 구현 클래스는 RequestMappingHandlerMapping입니다. SpringMVC는 상당히 복잡하고 방대한 기술이라 코드를 살펴보는 것이 쉽지는 않을 것입니다. HandlerMapping 처럼 각 기능을 담당하는 대표적인 인터페이스를 찾아서 이를 중심으로 코드를 확인해보시는 방식으로 접근해보세요.
감사합니다 토비님!!
실제로 Spring MVC의 코드 구조가 굉장히 방대해서 어떤 부분을 살펴봐야 할지 많이 어려웠었습니다 ㅠ
말씀해주신 부분 위주로 파악해보고 실제 동작원리에 대해 공부해보겠습니다 감사합니다!