백엔드

MVC패턴의 분리 - Spring 컨트롤러 메서드 반환타입에 정리

coyojo 2023. 5. 26. 10:30
컨트롤러 메서드의 반환타입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);
	}
}