스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술을 공부하고 정리하는 포스트입니다.


MVC 프레임워크 만들기

개요

  • MVC 패턴에서 발생되는 많은 중복을 개선하기 위해 프론트 컨트롤러(Front Controller) 패턴 도입
  • 공통된 부분을 처리해주는 Front Controller로 중복을 줄일 수 있음
  • 점진적으로 개선
    • V1 : 프론트 컨트롤러(Front Controller) 패턴 도입
    • V2 : view render를 처리해주는 MyView 도입
    • V3 : 서블릿(Servlet) 종속성 제거 / View Resolver 도입으로 논리 뷰 이름 사용
    • V4 : V3 코드에서 반환타입을 논리 주소명으로 변경
    • V5 : 어댑터(Adapter) 패턴 도입으로 다양한 종류의 컨트롤러 처리
  • V5까지 점진적으로 개선시킨 구조는 실제 스프링 MVC의 핵심 구조와 동일

단순하고 실용적인 컨트롤러 - V4

구조


  • 기존 V3 구조와 동일. 각 Controller는 ModelView 객체가 아닌 String 타입의 view path만 반환
    • 매번 ModelView 객체를 return 하지 않아도 되서 덜 귀찮음
    • 대신 ModelView를 사용하지 않기 때문에 model 정보를 저장하는 <String, Object> model이 필요!

코드

ControllerV4


MemberFormControllerV4


MemberSaveControllerV4


MemberListControllerV4


FrontControllerServletV4



유연한 컨트롤러 - V5

구조


  • 다양한 종류의 인터페이스를 처리하기 위해 어댑터(Adapter) 패턴1. 추가
    • 핸들러(Handler) : 컨트롤러의 이름을 더 넓은 범위인 핸들러(Handler)로 변경 -> 어댑터가 있기 때문에 컨트롤러가 아닌 어떤 것도 알맞게 처리할 수 있음!
    • 핸들러 어댑터(Handler Adapter) : 중간에 어댑터 역할을 하는 인터페이스를 추가 -> 다양한 컨트롤러 호출

코드

MyHandlerAdapter


  • boolean supports(Object handler) : 어댑터(Adapter)가 해당 컨트롤러를 처리할 수 있는지 판단하는 메서드
  • ModelView handle(HttpServletRequest req, HttpServletResponse resp, Object handler) : 어댑터(Adapter)를 통해서 실제 컨트롤러의 비즈니스 로직을 호출하는 메서드

ControllerV3HandlerAdapter


  • (handler instanceof ControllerV3) : handler가 ControllerV3와 같은 인스턴스인지 검사

ControllerV4HandlerAdapter


FrontControllerServletV5




1 : 서로 호환이 불가능한 V3, V4 버전을 동시에 사용할 수 있도록, 마치 110v, 220v 전기 콘센트를 호환해주는 어댑터와 같이 동작하는 패턴.