본 포스트는 아래 블로그를 참조하여 작성하였습니다. 모든 내용의 저작권은 아래 블로그 작성자님에게 있습니다.

all-record.tistory.com/164

Spring MVC의 LifeCycle:

Spring MVC의 LifeCycle

브라우저로 부터 요청(Request)을 받고 응답(Response)하기까지 Spring MVC의 처리 흐름은 위와 같습니다.
1. 먼저 브라우저로부터 요청이 들어오면 일단 Filter을 거치게 된다. Filter에서 하는 대표적인 처리를 보면 Encoding이 있다.

<Web.xml 의 Filter>
    <filter>
        <filter-name>encoding</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
 
    <filter-mapping>
        <filter-name>encoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

2. 다음으로 DispatcherServlet이 Controller에 요청을 전달하기 전에 가로챈다. 요청을 가로챈 후 HandlerMapping을 통해 요청에 해당하는 적절한 Controller을 찾게 된다. 그리고 DispatcherServlet에 그것을 전달한다.

3. DispatcherServlet은 실행할 Controller 정보를 HandlerAdapter에 전달하게 된다.

4. HandlerAdapter는 해당 Controller을 호출하게 된다.

5. Controller에서는 전달된 요청을 처리한다. 예를 들어 게시판의 글 목록을 가져오는 요청을 받으면 Controller는 게시판 Service를 호출하고 Service에서는 DAO를 통해 게시판 글 목록을 가져오게 된다.  

요청을 처리한 후 그 결과를 Model에 담고, View의 이름을 HandlerAdapter에게 전달하게 된다.

6. 전달받은 View의 이름을 가지고 ViewResolver에서 매핑된 View를 찾아서 반환한다.

7. DispatcherServlet은 반환된 View를 넘기게 된다.


출처: https://all-record.tistory.com/164 [세상의 모든 기록]

 

Spring Controller에는 2가지 return type이 있다.

 

 

1) void type: void 타입일 경우 접근하는 URL 경로에 해당하는 jsp를 찾아 실행한다.

// 예를 들어 /ex01/doA로 접근했다면 ex01 폴더 아래 doA.jsp를 찾아 실행시킨다.

@Controller
@RequestMapping("/ex01")
public class SampleController1 
{
    private static final Logger logger = LoggerFactory.getLogger(SampleController1.class);
    
    @RequestMapping("/doA")
    public void doA(){
        logger.info("doA 실행..........");
    }

2) String type: 리턴 타입이 String일 경우에는 해당 ["String"].jsp로 view를 처리하게 된다. 예를 들어 SampleController2의 doC( )는 /ex01/doC라는 URL을 처리한다. 그리고 결과로 result.jsp를 view로 호출한다. (/WEB-INF/views/result.jsp)

 

@Controller
@RequestMapping("/ex01")
public class SampleController2 {   
    private static final Logger logger = LoggerFactory.getLogger(SampleController2.class);   
    @RequestMapping("/doC")
    public String doC(@ModelAttribute("msg") String msg){   
        logger.info("doC 실행..........");     
        System.out.println("doC 메시지 : "+msg);   
        return "result";  // 문자열이 사용될 경우 문자열.jsp 파일을 찾아서 실행한다.
    }

3. String type + 데이터 전달: 

데이터 전달은 Model객체를 통해서 전달이 가능하다. Model에 데이터를 담고 View로 전달을 하게 되는것이다.

Model에 데이터를 담을 때 addAttribute( ) 메소드를 사용하는데, 2가지 사용 방법이 있다.

  • addAttribute("이름", 객체) : 이름을 이용해 객체를 사용할 수 있다.

  • addAttribute(객체) : 이름을 지정하지 않을 경우 자동적으로 객체의 클래스명 앞글자를 소문자로 처리해서 이름으로 사용한다.

먼저 com.github.study.ex01.vo 이란 패키지를 생성하여 MemberVO를 만든다.

MemberVO 클래스를 생성하여 데이터 전달에 사용할 객체를 준비한다.

내 해석: 데이터 전달을 위해 객체를 만드는데 그게 VO클래스이다. 그래야 내부의 멤버변수에 데이터를 담을 수 있게! (ex: userid, userpw)

package com.github.study.ex01.vo;
 
public class MemberVO {
    
    private String userid;
    private String userpw;
    
    public String getUserid() {
        return userid;
    }
    public void setUserid(String userid) {
        this.userid = userid;
    }
    public String getUserpw() {
        return userpw;
    }
    public void setUserpw(String userpw) {
        this.userpw = userpw;
    }
 
    @Override
    public String toString(){
        return "MemberVO [User Id = " + userid + ", User Pw = " + userpw + "]";
    }
}


출처: https://all-record.tistory.com/167 [세상의 모든 기록]

다음으로 com.github.study.ex01.controller 패키지에 SampleController3를 작성한다.

package com.github.study.ex01.controller;
 
import java.util.HashMap;
import java.util.Map;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
 
import com.github.study.ex01.vo.MemberVO;
 
@Controller
@RequestMapping("/ex01")
public class SampleController3 {
    
    private static final Logger logger = LoggerFactory.getLogger(SampleController3.class);
    
    @RequestMapping("/doD")
    public String doD(Model model){
        
        logger.info("doD 실행...........");
        
        MemberVO member = new MemberVO();
        member.setUserid("userid-01");
        member.setUserpw("userpw-01");
        
        model.addAttribute("member", member);
        //model.addAttribute(member);
        
        logger.info("MemberVO : "+member.toString());
        
        return "ex01/data";  
    }
    
    @RequestMapping("/doE")
    public String doE(Model model){
        
        logger.info("doE 실행...........");
        
        Map<String,String> map = new HashMap<String,String>();
        map.put("userid", "userid-02");
        map.put("userpw", "userpw-02");
        
        model.addAttribute("map", map);
    
        return "ex01/data";  
    }
}


출처: https://all-record.tistory.com/167 [세상의 모든 기록]

위에서는 addAttribute("이름", 객체) 를 사용하였기 때문에 뷰인 data.jsp 에서는 member 라는 이름으로 MemberVO 에 담긴 값을 사용할 수 있다.
다음으로 doE( )를 보자. doD( )와 차이점은 Map을 사용했다는것인데 기본적으로는 동일하다. doE( )가 실행되면 data.jsp에서 map 이라는 이름으로 Map에 담겨있는 값을 사용하는게 가능하다.

아래는 ex01 폴더에 data.jsp 를 생성한 코드이다.

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
    <title>data.jsp</title>
</head>
<body>
<h1>
    Hello world!  
</h1>
 
<P>  data.jsp 실행.... </P>
 
    <h4>MemberVO 아이디 : ${member.userid }</h4>
    <h4>MemberVO 비밀번호 : ${member.userpw }</h4>
 
    <h4>==========================================</h4>
 
    <h4>Map 아이디 : ${map.userid }</h4>
    <h4>Map 비밀번호 : ${map.userpw }</h4>
</body>
</html>


출처: https://all-record.tistory.com/167 [세상의 모든 기록]

data.jsp를 보면 위에는 MemberVO 의 값을 사용하고, 아래에는 Map의 값을 사용한다. 

 

doD( ) 메소드에서 model.addAttribute("member", member) 로 데이터를 담았으므로 data.jsp 에서는 member 이란 이름으로 MemberVO 의 값을 사용하는게 가능하다.

 

마찬가지로 Map의 경우 map란 이름으로 담겨있는 값을 가져와 사용할 수 있다.

ex01/doD 로 실행할 경우 위와 같이 나타난다.
ex01/doE 로 실행할 경우 Map에 담긴 값이 출력된다.

 

'웹캠프2021' 카테고리의 다른 글

Github 프로젝트 내 IDE로 clone 클론하여 연동하는 방법  (0) 2021.02.19
Spring4 1/28 (Mybatis 정리내용)  (0) 2021.01.31
웹캠프:Spring2 1/26  (0) 2021.01.31
웹캠프: Spring1 (1/25)  (0) 2021.01.27
웹캠프: JSP5 1/22  (0) 2021.01.24

+ Recent posts