You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
직접 만든 MVC 프레임워크와 스프링 MVC 를 비교해보자!
<직접 만든 MVC 프레임워크 구조>
<스프링 MVC 프레임워크 구조>
구조 자체는 크게 차이가 없고 몇몇 이름에만 차이가 있다
FrontController -> DispatcherServlet
handlerMappingMap -> HandlerMapping
MyHandlerAdapter -> HandlerAdapter
ModelView -> ModelAndView
viewResolver -> ViewResolver
MyView -> View
View를 인터페이스로 구현?
MVC 에서 핵심은 DispatcherServlet!
우리가 구현한 FrontController 처럼 DispatcherServlet 도 프론트 컨트롤러 패턴으로 구현.
DispatcherServlet 도 HttpServlet 을 상속 받아 사용하고, 서블릿으로 동작함.
서블릿 등록
스프링 부트가 DispatcherServlet 을 서블릿으로 등록하면서 모든 경로(urlPatterns = "/") 로 매핑
항상 구체적, 자세한게 우선순위가 높다! 그래서 더 자세한 경로가 등록되면 기존 서블릿도 동작
요청 흐름
서블릿 호출시 HttpServlet 의 메서드 service() 호출
메서드가 흐르고 흘러 DispatcherServlet.doDispatch() 가 호출된다.
View 반환: 렌더링 역할을 하는 뷰 객체 반환 -> View 도 인터페이스로 각 상황에 맞는 View 가 스프링에 이미 등록되어 있다.
뷰 렌더링
핸들러 매핑과 핸들러 어댑터
과거에 사용했던 Controller 인터페이스 (지금은 @controller 사용, 둘은 완전 다름)
@Component("/springmvc/old-controller") // 이 이름의 스프링 빈이 등록 -> 빈 이름으로 URL 매핑publicclassOldControllerimplementsController {
@OverridepublicModelAndViewhandleRequest(HttpServletRequestrequest, HttpServletResponseresponse) throwsException {
System.out.println("OldController.handleRequest");
returnnull;
}
}
컨트롤러가 호출되려면 아래 두 가지 작업 필요.
핸들러 매핑
핸들러 매핑에서 이 컨트롤러를 찾을 수 있어야 함 -> 스프링 빈 이름으로 핸들러 찾기
핸들러 어댑터
핸들러를 실행할 어댑터가 필요 -> Controller 인터페이스를 실행할 핸들러 어댑터
스프링 부트가 자동으로 등록하는 핸들러 매핑과 핸들러 어댑터
HandlerMapping
0순위: RequestMappingHandlerMapping 애노테이션 기반의 컨트롤러인 @RequestMapping에서 사용
1순위 : BeanNameUrlHandlerMapping 스프링 빈의 이름으로 핸들러를 찾는다.
HandlerAdapter
0순위: RequestMappingHandlerAdapter: 애노테이션 기반의 컨트롤러인 @RequestMapping에서 사용
1순위: HttpRequestHandlerAdapter: HttpRequestHandler 처리
2순위: SimpleControllerHandlerAdapter: Controller 인터페이스(애노테이션X, 과거에 사용) 처리
1순위도 아님.. 2순위의 어댑터가 사용 가능 (support() 에서 true 반환) 이므로 해당 어댑터 사용
이번엔 Controller 인터페이스가 아니고 HttpRequestHandler 사용
@Component("/springmvc/request-handler") // 마찬가지로 url 로 빈 이름 등록publicclassMyHttpRequestHandlerimplementsHttpRequestHandler {
@OverridepublicvoidhandleRequest(HttpServletRequestrequest, HttpServletResponseresponse) throwsServletException, IOException {
System.out.println("MyHttpRequestHandler.handleRequest");
}
}
핸들러 매핑 조회 -> 빈 이름으로 핸들러를 찾아 반환
핸들러 어댑터 조회 -> 1순위 핸들러 어댑터인 HttpRequestHandlerAdapter 가 사용 가능하므로 해당 어댑터 반환
핸들러 어댑터 실행 -> 어댑터는 핸들러를 내부에서 실행, 그 결과를 반환
뷰 리졸버
@Component("/springmvc/old-controller") // 이 이름의 스프링 빈이 등록 -> 빈 이름으로 URL 매핑publicclassOldControllerimplementsController {
@OverridepublicModelAndViewhandleRequest(HttpServletRequestrequest, HttpServletResponseresponse) throwsException {
System.out.println("OldController.handleRequest");
returnnewModelAndView("new-form"); // View 를 사용하기 위해 코드 추가
}
}
컨트롤러는 정상 호출, 그러나 렌더링 실패
ModelAndView 에 논리 이름만 있기 때문!
application.properties 에 아래 코드 추가
InternalResourceViewResolver 는 스프링빈으로 자동 등록 되는데, 위에 prefix, suffix 정보 활용함.
설정시 정상 출력.
뷰 리졸버 동작 방식
스프링 부트에 등록되는 뷰 리졸버
1 = BeanNameViewResolver : 빈 이름으로 뷰를 찾아서 반환한다. (예: 엑셀 파일 생성 기능 에 사용)
2 = InternalResourceViewResolver : JSP를 처리할 수 있는 뷰를 반환한다.
핸들러 어댑터를 통해 논리뷰 이름 반환
반환 받은 논리뷰 이름으로 스프링에 등록된 viewResolver 를 순서대로 호출 -> new-form 이라 등록된 스프링 빈이 없음, InternalResourceViewResolver 호출.
InternalResourceViewResolver 가 InternalResourceView 반환
view.render() 호출, (질문?) InternalResourceView 는 forward() 를 사용해서 JSP를 실행한다.??
스프링 MVC- 시작하기
회원 등록 폼
@Controller// 스프링 빈 자동 등록, 애노테이션 기반의 컨트롤러로 인식publicclassSpringMemberFormControllerV1 {
@RequestMapping("/springmvc/v1/members/new-form") // 요청 url 이 오면 해당 메서드 호출publicModelAndViewprocess() {
returnnewModelAndView("new-form"); // 모델, 뷰 정보 담아 반환
}
}
! Class 레벨에 @RequestMapping 이 있고, 해당 클래스가 스프링 빈으로 등록되면 컨트롤러로 동작한다.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
직접 만든 MVC 프레임워크와 스프링 MVC 를 비교해보자!


<직접 만든 MVC 프레임워크 구조>
<스프링 MVC 프레임워크 구조>
구조 자체는 크게 차이가 없고 몇몇 이름에만 차이가 있다
MVC 에서 핵심은 DispatcherServlet!
우리가 구현한 FrontController 처럼 DispatcherServlet 도 프론트 컨트롤러 패턴으로 구현.
DispatcherServlet 도 HttpServlet 을 상속 받아 사용하고, 서블릿으로 동작함.
서블릿 등록
스프링 부트가 DispatcherServlet 을 서블릿으로 등록하면서 모든 경로(urlPatterns = "/") 로 매핑
요청 흐름
서블릿 호출시 HttpServlet 의 메서드 service() 호출
메서드가 흐르고 흘러 DispatcherServlet.doDispatch() 가 호출된다.
<스프링 MVC 프레임워크 구조>

동작 순서
핸들러 매핑과 핸들러 어댑터
과거에 사용했던 Controller 인터페이스 (지금은 @controller 사용, 둘은 완전 다름)
컨트롤러가 호출되려면 아래 두 가지 작업 필요.
핸들러 매핑
핸들러 어댑터
스프링 부트가 자동으로 등록하는 핸들러 매핑과 핸들러 어댑터
핸들러 조회:
핸들러 어댑터 조회
이번엔 Controller 인터페이스가 아니고 HttpRequestHandler 사용
뷰 리졸버
컨트롤러는 정상 호출, 그러나 렌더링 실패
ModelAndView 에 논리 이름만 있기 때문!
application.properties 에 아래 코드 추가
InternalResourceViewResolver 는 스프링빈으로 자동 등록 되는데, 위에 prefix, suffix 정보 활용함.
설정시 정상 출력.
뷰 리졸버 동작 방식
스프링 부트에 등록되는 뷰 리졸버
forward()를 사용해서 JSP를 실행한다.??스프링 MVC- 시작하기
회원 등록 폼
! Class 레벨에 @RequestMapping 이 있고, 해당 클래스가 스프링 빈으로 등록되면 컨트롤러로 동작한다.
회원 저장
*MVC - 컨트롤러 통합
지금까지는 각 URL 마다 컨트롤러를 만들었지만, 이젠 @RequestMapping 을 통해 메서드 단위에서 맵핑이 가능해 컨트롤러를 하나로 통합 가능.
스프링 MVC - 실용적인 방식
정리
지금까지 우리가 만들어왔던 MVC 는 실제 스프링의 MVC 와 구조가 거의 유사하다.
스프링은 인터페이스를 미리 구현해 빈으로 등록해뒀고 우린 그걸 사용하면 된다!!
All reactions