[JAVA, SPRING] SPRING MVC ANNOTATION, VIEWRESOLVER

@Controller, @RequestMapping, @RequestParam, @ModelAttribute, viewResolver

Posted by iheese on June 20, 2022 · 5 mins read
  • Spring Container가 참고하는 .xml 파일로만 Controller, HandlerMapping을 직접 모두 등록해서 Spring을 사용하는 것은 유지보수가 쉽지 않은 단점이 있었다.
  • Annotation을 이용하면 단점을 해결할 수 있다.


Spring MVC Annotation

<!--생략-->
<context:component-scan base-package="com.naver.biz.controller"/>
<!--생략-->
  • 먼저 Spring Container가 참고하는 .xml에 위 태그를 추가해준다.
  • com.naver.biz.controller 아래 패키지의 Annotation을 인식해서 사용하겠다는 의미이다.


@Controller, @RequestMapping

import org.springframework.stereotype.Controller;

@Controller
public class StudentController{
		
        @RequestMapping("/insertStudent.service")
        public String insertStudent(StudentVO vo, StudentDAO dao){
        //생략
	}
}
  • @Controller : 해당 클래스를 컨트롤러로 사용하겠다는 의미이다.
  • @RequestMapping() : 클라이언트로부터 오는 요청이 오면 해당 메소드를 실행하겠다는 의미이다.
  • Annatation의 장점
    • POJO(Plain Old Java Object)로 사용할 수 있어지므로 제약이 없어진다. (ModelAndView를 리턴하는 것, handleRequest를 오버라이딩해야하는 것의 제약)
    • 매개변수로 객체를 받아 로직을 바로 처리할 수 있다.
      • 일반적인 POJO 객체 뿐만 아니라 Servlet이 제공하는 HttpServletRequest, HttpServletResponse, HttpSession까지 객체로 받아 처리할 수 있다.


@RequestParam

@Controller
public class StudentController{
		
        @RequestMapping("/deleteStudent.service")
        public String deleteStudent(@RequestParam("studentNum") int num, StudentDAO dao){
        //생략
	}
}
  • 파라미터로 받는 변수 이름과 매개변수 이름이 다를 때 @RequestParam을 이용하여 1:1로 매칭시켜준다.
  • 위 예시에서는 studentNum으로 받을 값이 num으로 사용되면 된다는 것을 의미한다.


@ModelAttribute

  	  //생략
    @ModelAttribute("studentList")
    public List<String> getStudentList() {
         List<String> studentList= new ArrayList<String>();
        studentList.add("이철수"); 
        studentList.add("김길동");
        return studentList;
	}

  	  //생략
      @RequestMapping("/insertStudentView.do")
	  public String insertStudentView(@ModelAttribute("student") StudentVO vo) {
		vo.setName("김철수");
		vo.setRole("반장");
		return "insertStudent";
 	}
  • @ModelAttribute는 메소드, 매개변수 객체 앞에 붙을 수 있다.
  • 메소드 앞에 붙을 때
    • “studentList” : studentList(key: value) 형태로 Model에 저장해준다.
    • JSP, Html에서 List를 출력하는 방법
     <c:forEach items="${studentList} var="student">
    	<tr>
    		<td>${student}</td>
     	</tr>
    </c:forEach>
    
  • 매개변수 앞에 붙을 때
    • @ModelAttribute(“name”), name을 변경하면 접근 이름을 바꿀 수 있으며 생략하면 클래스의 첫 글자만 소문자로 변경해서 등록된다.
    • @ModelAttribute을 이용해 접근하는 객체는 비어있어야 하고 getter/setter가 있어야 한다.
    • @ModelAttribute 자체도 생략 가능하고 대상 객체는 자동으로 등록된다.
    • JSP, Html에서 ${student.name} 방법으로 접근 가능하다.


Spring MVC ViewResolver

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/views/"/>
    	<property name="suffix" value=".jsp"/>
	</bean>
	
  • 먼저 Spring Container가 참고하는 .xml에 위 태그를 추가해준다.
  • viewResolver는 view를 생성해주는 역할을 한다.
  • 전의 Controller들은 ModelAndView 객체를 리턴했었고 그 과정에서 아래의 메소드를 사용했었다.
    • addObject("name",object) : Model(Data 처리 값) 저장
    • setViewName("/WEB-INF/views/ getStudentList.service.jsp") : 이동할 View 저장
  • Model 값과 View를 분리하면서 View 처리와 유지보수를 좋게 하기 위해 viewResolver를 사용한다.
    • Model 객체는 addAttribute("name",object) 로 Model을 저장하는 메소드를 지원한다.
  • Controller가 String을 리턴하면 prefix + String 리턴값 + suffix 값으로 View 주소를 완성시켜준다.
@Controller
public class StudentController{
		
        @RequestMapping("/getStudentList.service")
        public String getStudentList(StudentVO vo, StudentDAO dao, Model model){
        
        //생략
        List<StudentVO> studentList = dao.getStudentList(vo);
        model.addAttribute("studentList", studentList);
        return "getStudentList.service";
	}
}
  • 위의 예시에서는 "/WEB-INF/views/getStudentList.service.jsp" 로 이동한다.
  • 다른 View가 아닌 특정 요청으로 이동하고 싶을 때는 forward, redirect를 이용하여 리턴하면 된다.
    • forward : return forward:getStudentList.service
    • redirect : return redirect:getStudentList.service


Reference: