Spring MVC (관심사의 분리)

ikyeong·2023년 5월 15일
1

Spring-Study

목록 보기
3/9

📌 분리

객체 지향적 설계의 핵심적 요소

1. 관심사의 분리

  • 입력, 처리, 출력이라는 각각의 관심사를 분리
@Controller
public class YoilTeller {
    @RequestMapping("/getYoil") 
    public void main(HttpServletRequest request, HttpServletResponse response) throws IOException {
        // 1. 입력
        String year = request.getParameter("year");
        String month = request.getParameter("month");
        String day = request.getParameter("day");

        int yyyy = Integer.parseInt(year);
        int mm = Integer.parseInt(month);
        int dd = Integer.parseInt(day);

        // 2. 처리
        Calendar cal = Calendar.getInstance();
        cal.set(yyyy, mm - 1, dd);

        int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
        char yoil = " 일월화수목금토".charAt(dayOfWeek);   

        // 3. 출력
        response.setContentType("text/html");  
        response.setCharacterEncoding("utf-8");
        PrintWriter out = response.getWriter();
        out.println(year + "년 " + month + "월 " + day + "일은 ");
        out.println(yoil + "요일입니다.");
        out.close();
    }
}

2. 공통 코드의 분리 (입력의 분리)

  • Controller의 코드에서 입력을 getParameter로 받아오는 부분이 공통으로 사용됨 -> 각 Controller에서 입력을 따로 처리한 뒤 처리, 출력 작업
@Controller
public class YoilTeller {
	@RequestMapping("/getYoil")
    // HttpServletRequest를 사용하지 않고 개별 매개변수로 직접 받을 수 있음 -> 입력을 분리
	public void main(int year, int month, int day, HttpServletResponse response) throws IOException{
		// 2. 처리
        Calendar cal = Calendar.getInstance();
       	cal.set(yyyy, mm - 1, dd);
        
	    int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
        char yoil = " 일월화수목금토".charAt(dayOfWeek);   

        // 3. 출력
 	    response.setContentType("text/html");  
        response.setCharacterEncoding("utf-8");
       	PrintWriter out = response.getWriter();
       	out.println(year + "년 " + month + "월 " + day + "일은 ");
  		out.println(yoil + "요일입니다.");
        out.close();
	}
}

3. 변하는 것과 변하지 않는 것의 분리 (출력의 분리)

  • 처리가 일어나는 부분을 Controller, 출력을 담당하는 부분을 View로 분리
  • 처리의 결과를 Model이라는 객체에 담아 View로 전달
//yoilTellerMVC.java
@Controller
public class YoilTellerMVC {
    @RequestMapping("/getYoilMVC")
    public String main(int year, int month, int day, Model model) {
 
        // 1. 유효성 검사
    	if(!isValid(year, month, day)) 
    		return "yoilError";  // 유효하지 않은 경우 /WEB-INF/views/yoilError.jsp로 이동
    	
        // 2. 처리
    	char yoil = getYoil(year, month, day);

        // 3. Model에 작업 결과 저장
        model.addAttribute("year", year);
        model.addAttribute("month", month);
        model.addAttribute("day", day);
        model.addAttribute("yoil", yoil);
        
        // 4. 작업 결과를 보여줄 View의 이름을 반환
        return "yoil"; // /WEB-INF/views/yoil.jsp
    }
    
    private char getYoil(int year, int month, int day) {...}
    
    private boolean isValid(int year, int month, int day) {...}
}
<%--yoil.jsp--%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<html>
<head>
	<title>YoilTellerMVC</title>
</head>
<body>
<h1>${year}년 ${month}월 ${day}일은 ${yoil}요일입니다.</h1>
</body>
</html>
<%--yoilError.jsp--%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<html>
<head>
	<title>YoilTellerMVC</title>
</head>
<body>
<h1>잘못된 요청입니다. 다시 요청해 주세요.</h1>
<h1>year, month, day를 모두 올바른 값으로 입력하셔야합니다. </h1>
</body>
</html>

❔ Controller 메서드의 반환값이 void?

View가 매핑된 URL에 의해 결정됨

❔ Controller 메서드의 반환값이 ModelAndView?

메서드의 매개변수로 Model을 주는것이 아니라 메서드 내부에서 ModelAndView 객체 생성

	@RequestMapping("/getYoilMVC")
    public ModelAndView main(int year, int month, int day) {
 		//1. ModelAndView 객체 생성 & 기본 뷰 지정
        ModelAndView mv= new ModelAndView();
        mv.setViewName("yoilError");
        
        // 2. 유효성 검사
    	if(!isValid(year, month, day)) 
    		return mv; 
    	
        // 3. 처리
    	char yoil = getYoil(year, month, day);

        // 4. Model에 작업 결과 저장
        mv.addObject("year", year);
        mv.addObject("month", month);
        mv.addObject("day", day);
        mv.addObject("yoil", yoil);
        
        //5. 작업 결과를 보여줄 뷰 이름 지정
        mv.setViewName("yoil);
        
        // 6. ModelAndView 반환
        return mv;
    }

📌 spring의 MVC패턴

  1. 클라이언트의 요청이 들어왔을때 DispatcherServlet이 입력을 처리하고 Model 객체를 생성
  2. 해당하는 Controller에서 처리 후 처리된 결과를 Model에 저장 후 view 이름 반환
  3. DispatcherServlet이 전달받은 Model을 View에 전달
  4. View에서 작업결과를 읽어서 응답을 클라이언트에게 전송

0개의 댓글