Spring MVC(1) MVC란?, MVC 아키텍처, Spring 설정 및 @Annotation 적용

Yeppi's 개발 일기·2022년 6월 27일
0

Spring&SpringBoot

목록 보기
6/16

1. MVC 란?

1) MVC 개념

비즈니스 로직과 디자인 요소를 분리한 Spring 웹 모듈
Model, View, Controller 로 분리한 디자인 패턴

Model

  • 자바 개발자가 VO, DAO 클래스 작성

View

  • 웹 디자이너가 JSP 작성

Controller

  • Controller 가 하나의 서버로 개발할 경우?
    • 구현은 편해도 유지보수하기 힘들다
    • DispatcherServlet 파일이 매우 매우 복잡하다
  • Controller 는 하나의 서블릿 클래스가 아닌,
    여러개 서블릿 클래스로 만들어서 유지보수가 편리하도록 작성
    👉 MVC 프레임워크를 이용하자




2) Model1, Mdoel2

Model1

  • JavaBeans
    • 자바 객체들
  • DB 연동에 사용되는 객체가 Model ⇒ DAO
    • 개발자가 작성
  • JSP 도 개발자가 작성
    • Controller 에 해당 하는 자바 로직은 딱 3가지만 있음 p4
      1. 사용자 입력 정보 추출
      2. DB 연동 처리
      3. 화면 내비게이션

      ❗ 해당 Controller 를 분리시키면 MVC 모델 뷰 아키텍처다 ❗



Model2

  • VO, DAO 자바 객체들이 담겨 있는 Model
    화면에 보여지는 부분인 View
    (전. DispatcherServlet) 비즈니스 로직을 구현하는 Controller
    👉 3가지 구성요소로 분리
  • 만약 세션에서 데이터 꺼낸다면?
    for 루프같은 부분은 Controller 가 아닌 순수 자바로직이다




3) MVC 구조 및 동작

MVC Framework

  1. DispatcherServlet*.do 요청을 받는다
    • DispatcherServletfront Controller 라고도 함
      • 모든 컨트롤러의 ~~ 를 가장 먼저 받아들이는 창구 역할
    • 외부의 모든 접근들을 DispatcherSrvelt 으로 관리
    • 웹에서 반드시 필요한 존재
    • Servlet 으로 만드나? *.do 를 사용하기 위해
  1. HandlerMappingHasMap 을 검색하여,
    Controller 하나를 DispatcherServlet 에게 return
  1. 이제 DispatcherServlet 은 정확한 Controller 를 실행한다.

    a. 컨트롤러는 DAO 를 이용하여 해당 객체를 request 에 저장하여 받아온다

  1. String 을 통해 받아온 DispatcherServletString 에 저장된 해당 JSP 를 찾는다.
    a. 3번의 requestString 형식으로 찾아온다.
  1. View 형태는 JSP 로 출력된다
    a. 클라이언트에게 /XXX.do 로 응답 한다

  • 위와 같은 동작 흐름을 코드로 살펴보자
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 1. 사용자 요청 path 정보를 추출한다. 
		String uri = request.getRequestURI();
		String path = uri.substring(uri.lastIndexOf("/"));
		System.out.println("요청 path : " + "/getBoardList.do");


		// 2. HandlerMapping 을 통해 요청 path에 해당하는 Controller 객체를 검색한다.
		HandlerMapping handlermapping = new HandlerMapping();
		Controller ctrl = new GetBoardListController(); // path 는 /getBoardList.do

		// 3. 검색된 Controller 객체를 실행한다.
		String viewName = "getBoardList.jsp";

		// 4. Controller 가 리턴한 화면으로 이동한다.(포워드 방식)
		RequestDispatcher dispatcher = request.getRequestDispatcher("getBoardList.jsp"); // viewName 은 getBoardList.jsp
		dispatcher.forward(request, response);
}
  1. path 정보 추출
    a. XXX.do
  1. handlermapping 을 생성 및 호출
    a. hashmap 객체를 생성하는데, key-vlaue 로 제네릭 적용
    ⇒ 문자열과 컨트롤러
  1. 생성 이후, 해당 생성자를 호출한 DispatcherServlet 에서
    path 에 해당하는 Controller 하나를 검색해달라고 요청
    a. /getBoardList.do 가 getController 로 넘어감
  1. getController() 에서 key 값으로 get() 하여 데이터를 끄집어낸다
    a. /getBoardList.do 가 호출했던 DispatcherServlet 의 new GetBoardListController()로 리턴됨
  1. viewNamegetBoardList.jsp 가 담기고 foward 방식으로 화면 이동

👉 MVC 를 적용하면? 구조는 복잡해졌지만, 유지보수는 아주 편리해짐

👉 DispatcherServlet 으로만 구현하면? 구조는 간단, but 유지보수는 힘들어짐



Servlet Container 와 Spring Container

  • Servlet ContainerDispatcherServlet 만 생성하고, 나머지는 생성하지 않음
    • hellowrold 를 생성해주지 않음
    • XXX.xml 에 등록된 '서블릿' '필터' '리스너' ⇒ 3가지만 생성하고 관리해줌
  • Spring ContainerServlet Container 가 생성해주지 않는 것을 생성해줌
    • HandlerMapping, Controller, ViewResolver
    • 위 3가지 객체들은 메모리에 떠있지 않고, 디스패치 메모리만 떠있음
      👉
      따라서 new XmlWebApplicationContext() 을 이용하여 Spring Container 를 생성한 후, 위 3가지 객체들을 <bean> 등록하여 연결해준다

결론적으로

  1. xml 파일로 서블릿 객체를 띄우고
  2. DispatcherServlet 으로 Spring Container 객체와 연결하여
  3. 위 3개의 객체들(HandlerMapping, Controller, ViewResolver)을 메모리에 띄워준다

👉 DispatcherServlet 은 창구 역할
👉 Spring ContainerDispatcherServlet 이 생성
👉 개발자는 DispatcherServletweb.xml 에 등록만 해주면 됨



Spring MVC Framwork

  • 위(MVC Framework)에서는 String 으로 디스패처서블릿에 반환했지만
    Spring MVC Framwork 에서는 ModelAndView 로 디스패처서블릿에 반환한다
  • 디스패처서블릿은 우선 모델정보를 리퀘스트 정보에 담고,
    뷰 이름에 해당하는 JSP 를 호출해준다
  • ModelAndView 를 적용하는 코드
ModelAndView mav = new ModelAndView();
mav.addObject("boardList", boardList); // Model 정보
mav.setViewName("/WEB-INF/board/getBoardList.jsp"); // View 정보
return mav;
  • 그 외 동작 흐름은 위에서 했던 설명과 동일하다.


🍑 Map 과 Property 🍑

  • map 배열, 객체 등 대부분 가능
  • Property 문자나 숫자만 가능

🍑 ViewResolver 🍑

  • presentation-layer.xml
<!-- ViewResolver 등록 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/board/"/>
		<property name="suffix" value=".jsp"/>
</bean>
  • 접두사와 접미사가 자동으로 붙음
  • 디렉토리 위치가 바뀌면 해당 파일만 수정하면 됨
  • Controller 내 화면 코드를 다 변경하지 않아됨
  • viewresolver 를 타면 안되는 경우
    • view 이름이 .do 로 끝날 때 → forward:, redirect: 를 붙인다


2. Spring MVC

1) @Annotation 설정

@Controller

  • 컨테이너가 해당 클래스를 Controller 객체로 인식하여 메모리에 생성
  • @Controller 클래스{}

@RequestMapping

  • Clinet 요청 시, path(브라우저 요청 주소 경로)에 해당하는 메서드 매핑
  • @RequestMapping(value="/XXX.do") 메서드{}

@RequestParam

  • 파라미터 값을 명시적으로 지정할 때 매개 변수 앞에서 사용
  • 메서드(@RequestParam(value="") String yeppi) {}




2) Layer 통합

  • 스프링 기반으로 시스템 개발 시, 두 가지의 레이어로 나뉜다
    Pressentation Layer 와 Business Layer


Pressentation Layer

  • 웹 클라이언트의 요청 및 응답 처리
  • @Controller 클래스


Business Layer(Service Layer)

  • 비즈니스 로직 처링 및 트랜잭션 관리
  • Pressentation 계층과 Data Access 계층 사이를 연결
  • 비즈니스 컴포넌트(위 4가지, Service Interface, ServiceImpl, DAO, VO)가 배치되고 운용되는 레이어
    = 비즈니스 컴포넌트가 생성되고 동작하는 영역
  • 비즈니스 컴포넌트를 만들 때 IoC(역제어), AOP 를 이용한다
  • @Service 인터페이스


Data Access Layer(Repository Layer)

  • ORM 을 주로 사용
    • Mybatis, Hibernate 등
  • @Repository DAO Interface, DAO Impl 클래스

스프링 웹 계층 참고한 내용

profile
imaginative and free developer. 백엔드 / UX / DATA / 기획에 관심있지만 고양이는 없는 예비 개발자👋

0개의 댓글