MVC

0taetae·2024년 10월 24일
0
post-thumbnail

📙Spring Web MVC

💡MVC Pattern

  • Model, View, Controller 분리
  • 컴포넌트 간의 결합성 낮음 → 유지보수 용이, 확장성
  1. Model
    • 애플리케이션의 데이터와 비즈니스 로직
  2. View
    • 사용자 인터페이스를 표현
  3. Controller
    • 사용자 입력을 처리
    • Model과 View를 연결
      ✔️Front Controller
  • 장점
    • 화면과 비즈니스 로직을 분리해서 작업 가능
    • 영역별 개발로 인해 확장성이 뛰어남
    • 표준화된 코드를 사용 → 공동작업 용이, 유지보수 용이
  • 단점
    • 개발 과정 복잡 → 초기 개발속도 늦음

💡Model 2 (Web MVC) 요청 흐름

💡Spring MVC 구성요소

  • DispatcherServlet (Front Controller)
    • 모든 클라이언트의 요청전달받음
    • Controller에게 클라이언트의 요청을 전달
      ✔️default는 forward
  • HandlerMapping
    • URL요청 정보를 기준으로 어떤 핸들러 객체를 사용할지 결정하는 객체
  • Controller
    • 클라이언트의 요청을 처리한 뒤, Model을 호출하고 그 결과를 DispatcherServlet에 알려줌
  • ModelAndView
    • Controller가 처리한 데이터 및 화면에 대한 정보를 보유한 객체
  • ViewResolver
    • Controller가 리턴한 뷰 이름을 기반으로 Controller의 처리 결과를 보여줄 View를 결정
  • View
    • Controller의 처리결과를 보여줄 응답화면 생성

💡Spring MVC 요청 흐름

  1. 클라이언트 요청이 DispatcherServlet에 전달
  2. HandlerMapping이 요청을 처리할 컨트롤러를 결정
  3. DispatcherServlet은 요청을 Controller에게 전송하고 Controller는 요청을 처리한 후 결과 리턴
  4. ModelAndView Object에 수행결과가 포함되어 DispatcherServlet에 리턴
  5. ViewResolver가 논리적 이름을 실제 JSP이름으로 변환
    • ModelAndView는 실제 JSP 정보를 갖고 있지 않음
  6. View는 결과정보를 사용하여 화면을 표현

📙Controller

💡Controller

  1. @ Controller 선언

    • @ Controller와 @ RequestMapping 선언
    • Controller Class는 Client의 요청을 처리
    • Controller Class 자동 스캔
      • < context:component-scan /> 선언
      • base-package에 설정된 package내의 class 중 @Controller annotation이 적용된 클래스는 자동 스캔 대상이 됨
  2. @ RequestMapping 선언

    • 요청 URL mapping 정보를 설정, 클래스 타입과 메소드에 설정 가능
    • 같은 URL 요청에 대하여 HTTP method(GET, POST,..)에 따라 서로 다른 메소드를 mapping 할 수 있음
      @ GetMapping, @ PostMapping

💡Controller method의 parameter type

  • HttpServletRequest, HttpServletResponse, HttpSession
    • 필요시 Servlet API를 사용할 수 있음
  • @ PathVariable
    • URI 템플릿 변수에 접근할 때 사용
  • @ RequestParam
  • @ RequestHeader
  • @ CookieValue
  • @ RequestBody
    • HTTP 요청의 body 내용에 접근할 때 사용
    • 해당 미디어 타입을 확인 후 처리 가능한 변환기(Converter)가 자동으로 객체로 변환
    • 주로 @ ResponseBody와 함께 사용 됨 → 비동기 처리
    • AJAX, DTO에 JSON이 들어감
  • Map, Model, ModelMap
    • view에 전달할 model data를 설정할 때 사용
  • 커맨드 객체 (DTO)
    • HTTP 요청 parameter를 저장한 객체
    • 기본적으로 클래스 이름을 모델명으로 사용
    • @ ModelAttribute 설정으로 모델명을 설정
  • Errors, BindingResult
    • HTTP 요청 파라미터를 커맨드 객체에 저장한 결과
    • 커맨드 객체를 위한 파라미터 바로 다음에 위치
  • SessionStatus
    • 폼 처리를 완료했음을 처리하기 위해 사용
    • @ SessionAttributes을 명시한 session 속성을 제거하도록 이벤트를 발생시킴

💡 Servlet API 사용

  • HttpSession의 생성을 직접 제어해야 하는 경우
  • Controller가 Cookie를 생성해야 하는 경우
  • Servlet API를 선호하는 경우
    • ServletRequest / HttpServletRequest
    • ServletResponse / HttpServletResponse
    • HttpSession

📙View

  • Controller에서는 처리 결과를 보여줄 View 이름이나 객체를 리턴
  • DispatcherServlet은 View 이름이나 View 객체를 이용하여 view를 생성

💡 View 지정

  • ViewResolver : 논리적 view와 실제 JSP 파일 mapping
    • servlet-context.xml
  • View 이름 명시적 지정
    • ModelAndView와 String 리턴 타입
  • View 자동 지정
    • RequestToViewNameTranslator를 이용하여 URL로부터 view 이름을 결정
    • 자동 지정 유형
      • return type이 Model이나 Map인 경우
      • return type이 void이면서 ServletResponse나 HttpServletResponse 타입의 parmater가 없는 경우
  • redirect vies
    • View 이름에 “redirect:” 접두어를 붙이면, 지정한 페이지로 redirect
      • redirect:/article/list?pg=1
    • RedirectAttributes를 이용하여 Parameter 전달 가능
      • redirect:/article/list?pgno=1&key=&word=

📙Model

💡Model 생성

  • View에 전달하는 데이터
    • @ RequestMapping이 적용된 method의 Map, Model, ModelMap
    • @ RequestMapping가 return하는 ModelAndView
    • @ ModelAttribute이 적용된 method가 return한 객체
  • Map, Model, ModelMap을 통한 설정
    • method의 argument로 받는 방식
  • Model Interface 주요 method
    • Model addAttribute(String name, Object value);
    • Model addAttribute(Object value);
    • Model addAllAttributes(Collection<?> values);
    • Model addAllAttributes(Map<String, ?> attributes);
    • Model mergeAttributes(Map<String, ?> attributes);
    • boolean containsAttributes(String name);
  • ModelAndView를 통한 Model 설정
    • Controller에서 처리결과를 보여줄 view와 view에 전달할 값(model)을 저장하는 용도로 사용
    • setViewName(String viewname);
    • addObject(String name, Object value);

💡 요청 URL 매칭

  • @ PathVariable annotation을 이용한 URI 템플릿
    • RESTful 방식
    • @ RequestMapping Annotation 값으로 {템플릿변수}를 사용
    • @ PathVariable Annotation을 이용해서 {템플릿변수}와 동일한 이름을 갖는 parameter를 추가

📙Spring Web MVC 동작 정리

정적 resource들은 DispatcherServlet이 처리하면 안된다
✔️즉, < resources mapping=”/resources/*” location=”/resources/” >
→ DispatcherServlet에 보내지 X, /resources/로 보냄

  1. 웹 어플리케이셔이 실행되면, Tomcat(WAS)에 의해 web.xml이 loading
  2. web.xml에 등록되어 있는 ContextLoaderListner(Java Class)가 생성.
    • ContextLoaderListener class 는 ServletContextListener interface를 구현하고 있으며, ApplicationContext를 생성하는 역할을 수행
  3. 생성된 ContextLoaderListener는 root-context.xml을 loading
  4. root-context.xml에 등록되어 있는 Spring Container가 구동.
    ✔️이때, 개발자가 작성한 Business Logic(Service)에 대한 부분과 Database Logic(Dao) 객체들이 생성
  5. DispatcherServlet(Servlet)이 생성.
    • Client로부터 요청 온 메시지를 분석하여 알맞은 PageController에게 전달하고 응답을 받아 요청에 따른 응답을 어떻게 할 지 결정.
    • 실질적인 작업은 PageController에서 이루어짐
  6. DispatcherServlet은 servlet-context.xml을 loading (PageController 객체 생성)
  7. Client로부터 요청(request)가 들어옴
  8. 두번째 Spring Container가 구동되며 응답에 맞는 PageController들이 동작.
    ✔️이때, 첫번째 Spring Container가 구동되면서 생성된 Dao, Service 클래스들과 협업하여 알맞은 작업을 처리

0개의 댓글