Spring MVC Process Flow

Let's Just Go·2022년 7월 1일
0

Spring

목록 보기
3/26

Spring

Spring MVC

MVC Process

  • Spring MVC Process

    • 흐름 (내가 이해한 대로 흐름 정리) 추후 수정 예정
      1. 사용자가 요청을 보냄
      2. DispatcherServlet이 요청을 받고 요청에 대한 내용을 파악 후 HandlerMapping은 요청을 처리할 수 있는 Controller를 Container에서 찾고 HandlerAdapter는 요청을 처리할 수 있는 Method를 검색하도록 명령을 내림
      3. HandlerMapping과 HandlerAdapter가 Controller와 Method를 찾고 DispatcherServlet에게 보고 함
      4. DispatcherServlet가 다시 HandlerAdapter에게 ‘찾은 Controller에서 요청을 처리할 수 있는 메서드를 찾아’ 라고 명령
      5. HandlerAdapter는 찾은 메서드를 호출해서 결과 값을 받음
      6. 받은 결과 값은 DispatcherServlet에게 돌려줌
      7. 결과를 받은 DispatcherServlet은 처리 결과를 ViewResolver에게 보내줌
      8. ViewResolver는 받은 값을 통해 url(폴더 경로)을 만들어 줌
      9. DispatcherServlet에서 ViewResolver에게 받은 url에 View가 있는지 조사하고 있으면 해당 View에서 화면을 꾸미고 최종 응답을 사용자에게 보여줌
  • Code

    • 자바 파일에 메소드를 작성

    • 특정 요청을 처리할 메서드에 @RequestMapping(”요청 url”) 작성

    • 메소드를 작성하고 return을 문자열로 보내줌

    • 해당 문자열은 디스패처에게 가고 viewResolver를 통해 jsp 경로 url 완성

    • 이후 작성된 url과 맞는 jsp파일이 있으면 화면에 출력함

      package com.spring.basic.controller;
      
      import org.springframework.stereotype.Controller;
      import org.springframework.web.bind.annotation.RequestMapping;
      
      // 자동으로 스프링 컨테이너에 해당 클래스의 bean을 등록하는  annotation
      // bean을 등록해야 HandlerMapping이 이 클래스의 객체를 검색할 수 있음
      // com.spring.basic의 하위 이므로 자동으로 bean 생성 됨
      @Controller
      public class RequestController {
      	public RequestController() {
      		System.out.println("RequestController 생성");
      		// 자동 bean등록이 되어 있기 때문에 서버가 활성화되면 자동으로 생성되어 컨트롤러에 저장됨 
      	}
      
      	@RequestMapping("/request/test")
      	// /request/test라는 요청이 들어오면 밑의 메소드를 실행하라 라는 뜻
      	// 리턴값인 "test"는 디스패처로 가고 
      	// 디스패처는 viewresolver에 보내주고 경로를 완성해주고 
      	// view에 해당 파일이 있는지 확인 후 요청에 응답함
      	public String testCall() {
      		System.out.println("/request/test 요청이 들어옴");
      		return "test";
      	}
      
      	/*
         	만약 사용자가 /request/req 요청을 보내 왔을 때
          views폴더 아래에 request폴더 안에 존재하는
          req-ex01.jsp파일을 열도록 메서드를 구성해 보세요.
      	 */
      	@RequestMapping("/request/req")
      	// 이거는 요청 url
      	public String callme() {
      		System.out.println("/request/req 요청이 들어왔습니다.");
      		return "request/req-ex01";
      		// 메소드가 실행되었을 때 실제 디스패처에게 전달되는 값 
      		// 나중에 이게 viewresolver에 가서 완벽한 url을 만들고 
      		// 그걸 다시 디스패처가 안에 값이 있는지 확인한 후 있으면 화면 출력 
      	}
      
      }

요청 방식

  • 요청 방식 구분
    • GET과 POST를 구분하기 위해서는 RequestMapping(value=”요청 url”, method=RequestMethod.GET or POST) 를 통해서 get과 post를 구분할 수 있음

    • 하지만 너무 길기 때문에 @GetMapping(요청url), @PostMapping(요청url)로 할 수 있지만 Spring 4버전부터 가능

    • 요청이 Get방식인지 Post방식인지 구분하여 요청 처리

      package com.spring.basic.controller;
      
      import org.springframework.stereotype.Controller;
      import org.springframework.web.bind.annotation.GetMapping;
      import org.springframework.web.bind.annotation.PostMapping;
      import org.springframework.web.bind.annotation.RequestMapping;
      import org.springframework.web.bind.annotation.RequestMethod;
      
      // 자동으로 스프링 컨테이너에 해당 클래스의 bean을 등록하는 annotation
      // bean을 등록해야 HandlerMapping이 이 클래스의 객체를 검색할 수 있음
      // com.spring.basic의 하위 이므로 자동으로 bean 생성 됨
      @Controller
      public class RequestController {
      	public RequestController() {
      		System.out.println("RequestController 생성");
      		// 자동 bean등록이 되어 있기 때문에 서버가 활성화되면 자동으로 생성되어 컨트롤러에 저장됨 
      	}
      
      	@RequestMapping("/request/test")
      	// /request/test라는 요청이 들어오면 밑의 메소드를 실행하라 라는 뜻
      	// 리턴값인 "test"는 디스패처로 가고 
      	// 디스패처는 viewresolver에 보내주고 경로를 완성해주고 
      	// view에 해당 파일이 있는지 확인 후 요청에 응답함
      	public String testCall() {
      		System.out.println("/request/test 요청이 들어옴");
      		return "test";
      	}
      
      	/*
         	만약 사용자가 /request/req 요청을 보내 왔을 때
          views폴더 아래에 request폴더 안에 존재하는
          req-ex01.jsp파일을 열도록 메서드를 구성해 보세요.
      	 */
      	@RequestMapping("/request/req")
      	// 이거는 요청 url
      	public String callme() {
      		System.out.println("/request/req 요청이 들어왔습니다.");
      		return "request/req-ex01";
      		// 메소드가 실행되었을 때 실제 디스패처에게 전달되는 값 
      		// 나중에 이게 viewresolver에 가서 완벽한 url을 만들고 
      		// 그걸 다시 디스패처가 안에 값이 있는지 확인한 후 있으면 화면 출력 
      	}
      
      	//	@RequestMapping(value="/request/basic01", method=RequestMethod.GET)
      	// requestMapping을 작성할 때 value에 요청 url을 작성하고 method에 GET, POST 구분할 수 있음 
      	@GetMapping("/request/basic01")
      	public String basicGet() {
      		System.out.println("/request/basic01 요청이 들어왔습니다. GET 요청");
      		return "request/req-ex01";
      		// 같은 파일로 보내기 때문에 print문과 url을 확인해서 이동이 잘되었는지 확인
      	}
      
      	//	@RequestMapping(value="/request/basic01", method=RequestMethod.POST)
      	@PostMapping("/request/basic01")
      	public String basicPost() {
      		System.out.println("/request/basic01 요청이 들어왔습니다. POST 요청");
      		return "request/req-ex01";
      		// 같은 파일로 보내기 때문에 print문과 url을 확인해서 이동이 잘되었는지 확인
      	}
      }

Servlet

  • servlet 과정
    • <context:component-scan base-package="com.spring.basic" /> 에서 com.spring.basic 경로에 있는 모든 객체를 Container에 bean으로 등록

    • @Controller가 적혀있는 곳을 찾아 요청을 처리할 수 있는 메소드를 찾고 만약 메소드를 찾았으면 viewresolver를 통해 지정한 접두어, 접미어를 바탕으로 붙여서 경로를 지정

    • 이후 디스패처가 지정한 경로에 jsp파일이 있으면 화면에 출력

    • servlet-context.xml

      <?xml version="1.0" encoding="UTF-8"?>
      <beans:beans xmlns="http://www.springframework.org/schema/mvc"
      	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      	xmlns:beans="http://www.springframework.org/schema/beans"
      	xmlns:context="http://www.springframework.org/schema/context"
      	xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
      		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
      		http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
      
      	<!-- DispatcherServlet 객체 관련 설정 -->
      	
      	<!-- 핸들러 어댑터, 핸들러 매핑 객체가 개발자가 작성한 컨트롤러를 찾을 수 있게 설정하는 태그 -->
      	<annotation-driven />
      	
      	<!-- 핸들러 어댑터와 핸들러 매핑는  @Controller를 찾아서 거기에서 지금의 요청을 처리할 수 있는 메서드를 찾음 
      		 핸들러 어댑터은 @RequestMapping을 통해서 적절한 메서드도 찾음
      		  -->
      
      	<!-- 정적 자원(html, css, js, img)등을 절대 경로로 쉽게 매핑해주는 태그 
      		 mapping에 작성된 경로 : 외부로 노출되는 경로 
      		 location : 실제 파일 경로-->
      	<resources mapping="/resources/**" location="/resources/" />
      
      	 
      	<!-- view resolver bean 등록 설정 -->
      	<!-- 
      		컨트롤러가 리턴한 view 문자열을 해석하여 경로를 만들어서 파일을 찾아 응답하는 ViewResolver의 Bean 등록 코드
      		- prefix, sufiix (접두어, 접미어) 필드의 setter 주입을 통해 컨트롤러에서 리턴된 문자열을 조립
      	 -->
      	<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
      		<beans:property name="prefix" value="/WEB-INF/views/" />
      		<beans:property name="suffix" value=".jsp" />
      		<!-- 접두어 접미어를 앞 뒤에 붙여서 경로를 지정해줌 -->
      	</beans:bean>
      	
      	<!-- 
      		- Controller annotation을 사용하여 자동으로 bean 등록을 하게 해주는 설정 태그
      		- con.spring.basic으로 경로가 시작되는 모든 클래스에서 annotaion으로 지정되어 있는 클래스를 찾아 
      		자동으로 bean 빈등록 해줌
      	 -->
      	<context:component-scan base-package="com.spring.basic" />	
      	
      	
      </beans:beans>




참고 (Spring setup)

  • Spring Setup (중요)
    • Spring WebProject
      • 이클립스에 STS 설치
      • 이클립스 버전을 확인해서 받아야함
      • java 8버전 이상은 아무거나 상관 없지만 java 8버전(1.8)은 이클립스 4.16으로 설치해야 하기 때문에 STS에서 Eclipse 4.16이하가 있는 것만 설치
      • Eclipse의 help tab에서 sts를 검색해서 3.9.14 설치
      • Spring Legacy Project로 생성하고 Spring MVC Project선택
      • 최상위 패키지 이름 설정
      • pom.xml에서 버전 수정 가능
        • Spring framework 버전 변경 시 값만 바꿔주면 됨 (5.3.18)
        • Servlet을 윗 버전으로 업데이트 (3.1.0, artifactId : javax.servlet.api)
        • pom.xml을 수정하면 무조건 maven update를 해야함(프로젝트 클릭 후 maven 탭에서 진행)
        • maven compiler-plugin 버전 변경
      • 마지막으로 프로젝트의 maven update를 통해 변경 내용 설정
      • Servers폴더에 server.xml을 통해서 rootpath 커스터마이징 가능
profile
안녕하세요! 공부한 내용을 기록하는 공간입니다.

0개의 댓글