Replies: 1 comment
|
역시 👏 최고입니당 😆 |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
5_스프링 MVC - 구조 이해
스프링 MVC 전체 구조
직접 만든 MVC 프레임워크 구조
SpringMVC 구조
DispatcherServlet 구조
DispatcherServlet이 존재한다DispatcherServlet 등록
HttpServlet을 상속받아 사용, 서블릿으로 동작하게 됨DispatcherServlet을 서블릿으로 자동 등록하여 모든 경로(urlPatterns="/")에 대해 매핑을 진행요청 흐름
서블릿이 호출되면
HttpServlet이 제공하는service()가 호출됨스프링 MVC는
DispatcherServlet의 부모인FrameworkServlet에서service()를 오버라이드 해두었음FrameworkService.service()를 시작으로 여러 메서드가 호출되며,DispatcherServlet.doDispatch()가 호출 됨DispatcherServlet.doDispatch()SpringMVC 동작순서
InternalResourceViewResolver가 자동 등록되고 사용됨InternalResorceView(JstlView)를 반환하는데, 내부에forward()로직이 있음SpringMVC의 인터페이스
DispatcherServlet코드의 변경 없이, 원하는 기능을 변경하거나 확장할 수 있다는 점org.springframework.web.servlet.HandlerMapping)org.springframework.web.servlet.HandlerAdapter)org.springframework.web.servlet.ViewResolver)org.springframework.web.servlet.View)핸들러 매핑과 핸들러 어댑터
SpringMVC에서 이미 많은 기능들을 인터페이스로 제공하고 있기 때문에 지금은 사용하지 않지만, 과거에 사용했던 스프링이 제공하는 간단한 컨트롤러로 핸들러 매핑과 어댑터를 이해해보자!
Controller 인터페이스
과거 버전 스프링 컨트롤러
org.springframework.web.servlet.mvc.ControllerOldController/springmvc/old-controller라는 이름으로 스프링 빈이 등록 된다OldController의 호출 과정
Controller인터페이스를 실행할 수 있는 핸들러 어댑터를 찾고 실행해야 한다자주 등록하는 핸들러 매핑과 핸들러 어댑터
스프링은 이미 필요한 핸들러 매핑과 핸들러 어댑터를 대부분 구현해두었다
핸들러 매핑, 핸들러 어댑터 모두 순서대로 찾고 만약 없으면 다음 순서로 넘어가는 방식이다
1. 핸들러 매핑으로 핸들러 조회
HandlerMapping을 순서대로 실행해서, 핸들러 찾기BeanNameUrlHandlerMapping가 실행에 성공하고 핸들러인OldController를 반환2. 핸들러 어댑터 조회
HandlerAdapter의supports()를 순서대로 호출SimpleControllerHandlerAdapter가Controller인터페이스를 지원하므로 대상이 됨3. 핸들러 어댑터 실행
SimpleControllerHandlerAdapter를 실행하면서 핸들러 정보도 함께 넘겨줌SimpleControllerHandlerAdapter는 핸들러인OldController를 내부에서 실행하고, 그 결과를 반환HttpRequestHandler
HttpRequestHandler는 서블릿과 가장 유사한 형태의 핸들러HttpRequestHandler간단하게 구현해보자.
MyhttpRequestHandler1. 핸들러 매핑으로 핸들러 조회
HandlerMapping을 순서대로 실행해서, 핸들러를 찾기BeanNameUrlHandlerMapping가 실행에 성공하고 핸들러인MyHttpRequestHandler를 반환2. 핸들러 어댑터 조회
HandlerAdapter의supports()를 순서대로 호출HttpRequestHandlerAdapter가HttpRequestHandler인터페이스를 지원하므로 대상이 됨3. 핸들러 어댑터 실행
HttpRequestHandler를 실행하면서 핸들러 정보도 함께 넘겨줌HttpRequestHandlerAdapter는 핸들러인MyHttpRequestHandler를 내부에서 실행하고, 그 결과를 반환@RequestMapping
뷰 리졸버
OldController- View 조회할 수 있도록 변경application.properties에 추가InternalResourceViewResolver라는 뷰 리졸버를 자동 등록하는데, 이때application.properties에 등록한spring.mvc.view.prefix,spring.mvc.view.suffix설정 정보를 사용해서 등록스프링 MVC 구조에서의 뷰 리졸버 동작 방식
스프링 부트가 자동 등록하는 뷰 리졸버
1. 핸들러 어댑터 호출
new-form이라는 논리 뷰 이름을 획득2. ViewResolver 호출
new-form이라는 뷰 이름으로 viewResolver를 순서대로 호출BeanNameViewResolver는new-form이라는 이름의 스프링 빈으로 등록된 뷰를 찾아야하는데 존재하지 않음InternalResourceViewResolver가 호출 됨3. InternalResourceViewResolver
InternalResourceView를 반환4. 뷰 - InternalResourceView
InternalResourceView는 JSP 처럼 포워드forward()를 호출해서 처리할 수 있는 경우에 사용5. view.render()
view.render()가 호출되고InternalResourceView는forward()를 사용해서 JSP 실행스프링 MVC - 시작하기
@RequestMapping
매우 유연하고, 실용적인 컨트롤러
우선순위가 가장 높은 핸들러 매핑과 핸들러 어댑터
RequestMappingHandlerMappingRequestMappingHandlerAdapterSpringMemberFormControllerV1- 회원 등록 폼@Controller@RequestMappingModelAndView@Component컴포넌트 스캔없이 스프링 빈으로 직접 등록해도 동작한다@RequestMapping이 있어도 스프링 컨트롤러로 인식하지 않음. 오직@Controller가 있어야 스프링 컨트롤러로 인식한다ServletApplicationSpringMemberSaveControllerV1- 회원 저장SpringMemberListControllerV1- 회원 목록스프링 MVC - 컨트롤러 통합
위에서 작성했던 코드를 살펴보면,
@RequestMapping이 클래스 단위로 구성되어 있다. 각각의 클래스가 특정 기능(회원 등록 폼, 회원 저장, 회원 목록)을 담당하며 각각의 클래스에서@RequestMapping을 사용해서 URL 패턴을 매핑하고 있다.컨트롤러 통합에서 수정 된 코드에서는 메서드 단위의 컨트롤러를 구성한다. 클래스 하나에 여러 개의 요청 메서드가 있으며, 각각의 메서드가 특정 URL 패턴과 매핑되어 있다.
SpringMemberControllerV2스프링 MVC - 실용적인 방식
실무에서 주로 사용하는 방식에 속한다
SpringMemberControllerV3@RequestParam으로 받을 수 있다@RequestParam("username")은request.getParameter("username")와 같은 코드라고 생각하면 된다@RequestMapping은 URL만 매칭하는 것이 아니라, HTTP Method도 함께 구분할 수 있다/new-form이고, HTTP Method가 GET인 경우를 모두 만족하는 매핑을 하려면 다음과 같이 처리할 수 있다@RequestMapping(value = "/new-form", method = RequestMethod.GET)@GetMapping,@PostMapping을 사용하면 더 편리하게 사용 가능🔗 출처
All reactions