MVC패턴의 분리 - Spring 컨트롤러 메서드 반환타입에 정리
컨트롤러 메서드의 반환타입1 =>
반환타입이 String인 경우
@RequestMapping("/getYoilMVC")
public String main(int year, int month, int day, Model model) throws IOException {
1) 컨트롤러 메서드의 반환타입이 String인 경우
==> retrun " 뷰이름" ; ex) return "yoil" ;
return "yoil" ; 이게 작동되는 이유는 Spring의 표준화된 프레임 워크에 뷰의 정보가 등록되어 있기 때문이다.
spring 프레임워크에 뷰파일은 WEB-INF/Views 폴더 안에 들어가게 된다.
즉 retrun "yoil"은 WEB-INF/Views/yoil.jsp 를 출력하라는 뜻인데
뷰를 살펴보면 WEB-INF/VIews 경로와 .jsp라는 확장자가 겹치기 때문에
이런 중복된 부분은 빼고 뷰 이름만 적어서 코드를 간결하게 할 수 있는것이다.
이렇게 뷰 이름을 적어주려면 반환 타입을 String으로 줘야 한다.
이렇게 컨트롤러가 처리한 값을 뷰에 전달하기 위해서는 모델을 만들어줘야 한다.
이렇게 쓸 수 있는 이유는 servlet-context.xml에 뷰의 정보를 어떻게 할지 접두사 접미사를 정해놓았기 때문이다.
<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>
2) 컨트롤러 메서드의 반환타입이 void인 경우
==> 맵핑된 url의 끝단어가 뷰의 이름이다
==> 즉, @RequestMapping("/getYoil") 이 경우 "/getYoil"이 뷰의 이름이다
@RequestMapping("/getYoilMVC2")
public void main(int year, int month, int day, Model model) throws IOException {
3) 컨트롤러 메서드 반환타입이 ModelAndView인 경우
1. ModelAndView를 생성
ModelAndView mv = new ModelAndView( ) ;
2. ModelAndView에 작업한 결과를 저장
mv.addObject()
3. 작업한 결과를 보여줄 뷰를 지정 ==> mv.setViewName("yoil");
4. ModelAndView를 반환 ==.> return mv;
@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. 계산한 결과를 모델에 저장 - 모델에 저장을 해줘야 뷰에 전달하여 출력 가능!!!!
//model에는 key,value 구조로 들어가는데
//model.addAttribute("model에 들어가는 attribute의 이름= 즉 key와 같다", attribute에 들어갈 값 즉 value를 의미한다 );
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 - 1, day);
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK); // 1:일요일, 2:월요일 ...
return " 일월화수목금토".charAt(dayOfWeek);
}
}