본문 바로가기

백엔드 개발/SpringMVC

관심사 분리와 MVC 패턴 (실습)

<개요>

MVC 패턴에 3가지 경우가 있음. 

Controller Method 의 반환 타입에 따라 나뉨 

(1)String 반환형


//년월일을 입력하면 요일을 알려주는 프로그램
@Controller
public class YoilTellerMVC {
	//	http://localhost/ch2/getYoilMVC?year=2021&month=10&day=21
	
	@RequestMapping("/getYoilMVC")


		//String 반환 메소드 -> 반환에 사용할 view를 지정 
		public String main(int year, int month, int day, Model model) throws IOException {
		
        
        // 유효성 검사, 년 월 일이 바르게 입력되지 않았다면, 에러를 표시하는 view를 이용해라
		if(!isVaild(year,month,day)) {
			return "YoilError";
		}
		
        // 요일 계산 결과를 char 변수에 넣음
		char yoil = getYoil(year,month,day);
		
        //처리 결과를 model에 저장. 이를 하지 않으면 view에 값이 전달되지 않게 됨.
		model.addAttribute("year",year);
		model.addAttribute("month", month);
		model.addAttribute("day", day);
		model.addAttribute("yoil", yoil);
		
		return "Yoil";
	}
        


	private boolean isVaild(int year, int month, int day) {
		// TODO Auto-generated method stub
		return false;
	}

	//요일 계산
	private char getYoil(int year, int month, int day) {
		Calendar cal = Calendar.getInstance();
		cal.set(year, month, day);
		
		int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
		return "일월화수목금토".charAt(dayOfWeek);
	}

}

(2) void 반환형

// void 반환형을 쓰게되면, 이용할 view를 지정하지 못하므로, 
// URL 끝 단어와 이름이 같은 view로 자동으로 넘어가게 된다.


public class YoilTellerMVC {
	//	http://localhost/ch2/getYoilMVC?year=2021&month=10&day=21
	
	@RequestMapping("/getYoilMVC")


		public void main(int year, int month, int day, Model model) throws IOException {
		
//		if(!isVaild(year,month,day)) {
//			return "YoilError";
//		}
		
		char yoil = getYoil(year,month,day);
		
		model.addAttribute("year",year);
		model.addAttribute("month", month);
		model.addAttribute("day", day);
		model.addAttribute("yoil", yoil);
		
//		return "Yoil";
	}
        


	private boolean isVaild(int year, int month, int day) {
		// TODO Auto-generated method stub
		return false;
	}

	//요일 계산
	private char getYoil(int year, int month, int day) {
		Calendar cal = Calendar.getInstance();
		cal.set(year, month, day);
		
		int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
		return "일월화수목금토".charAt(dayOfWeek);
	}

}

(3) ModelAndView 반환형

package com.fastcampus.ch2;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Calendar;

//년월일을 입력하면 요일을 알려주는 프로그램
@Controller
public class YoilTellerMVC {
	//	http://localhost/ch2/getYoilMVC?year=2021&month=10&day=21
	
	@RequestMapping("/getYoilMVC")


	public ModelAndView main(int year, int month, int day ) throws IOException {	
	
		
        //모델엔 뷰 객체 생성
		ModelAndView mv = new ModelAndView();
        
		
		// 2. 요일 계산
		char yoil = getYoil(year, month, day);
		
		// 3. 계산한 결과를 모델에 저장
		mv.addObject("year", year);
		mv.addObject("month", month);
		mv.addObject("day", day);
		mv.addObject("yoil", yoil);
		
		//4. 결과를 보여줄 view를 지정
		mv.setViewName("yoil");
		
		return mv;
	
     
    
	}

	//요일 계산
	private char getYoil(int year, int month, int day) {
		Calendar cal = Calendar.getInstance();
		cal.set(year, month, day);
		
		int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
		return "일월화수목금토".charAt(dayOfWeek);
	}

}

(4) 스스로 해보기 

//model&view 

@Controller
public class YoilTellerMVC {
	//	http://localhost/ch2/getYoilMVC?year=2021&month=10&day=21
	
	@RequestMapping("/getYoilMVC")


		public ModelAndView main(int year, int month, int day) throws IOException {
		
		ModelAndView mv = new ModelAndView();
		
		char yoil = getYoil(year, month,day);
		
		mv.addObject("year", year);
		mv.addObject("month", month);
		mv.addObject("day", day);
		mv.addObject("yoil", yoil);
		
		mv.setViewName("Yoil");
		
		return mv;
	}
        


	private boolean isVaild(int year, int month, int day) {
		// TODO Auto-generated method stub
		return true;
	}

	//요일 계산
	private char getYoil(int year, int month, int day) {
		Calendar cal = Calendar.getInstance();
		cal.set(year, month, day);
		
		int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
		return "일월화수목금토".charAt(dayOfWeek);
	}

}

 

** return에 view 이름만 적어줘도 되는 이유

: servlet-context.xml에서 prefix와 postfix를 설정해서 해당 jsp 파일로 가는 경로와 뒤 확장자인 .jsp를 모두 자동으로 적어주도록 되어있어서 따로 적을 필요가 없다