스프링 MVC의 Controller
스프링 Controller의 특징
- HttpServletRequest, HttpServletResponse를 사용하지않고 기능 구현 가능
- 다양한 타입의 파라미터 , 리턴 처리 가능
- GET/POST/PUT 등 여러 전송 방식에 대해서 처리를 어노테이션(@)으로 처리 가능
- 상속/인터페이스 방식 대신 어노테이션만으로 필요설정 가능
@Controller, @RequestMapping
@Controller를 컨트롤러에 어노테이션으로 적용시키면 스프링이 컨트롤러로 관리한다는 뜻입니다.
@RequestMapping("/경로")
위 두개를 적용시키면 스프링의 객체로 등록이 됩니다.
이는 servlet-context.xml에서 컨트롤러를 스캔하는 태그를 이용하기 때문입니다.
<context:component-scan base-package="org.xxx.controller"/>
위 과정이 지나면 스프링은 위 URL이 적용될 시 해당 컨트롤러에서 처리가 진행이 됩니다.
@GetMapping, @PostMapping
@RequestMapping의 변화로 축약형인 @GetMapping과 @PostMapping을 사용할 수 있습니다.
해당 처리될 메소드에 위 어노테이션을 적용하면 Get 방식일 때 해당 경로를 통해 적용된 메소드에서 처리가 됩니다.
만약 @RequestMapping에서 GET,POST 방식 모두 적용하고 싶다면 배열로 처리할 수 있씁니다.
파라미터 수집
가장 큰 특징은 컨트롤러에서 자동으로 파라미터가 수집이 됩니다.
JSP/Servlet에서는 매번 HttpServeltRequest를 이용하여 request.getParameter()을 이용하지 않아도됩니다.
@GetMapping("/ex")
public String ex01(Sample sample){
log.info(sample);
return "ex";
}
즉 Sample 객체의 정보들이 파라미터로 전달 되면 자동으로 수집해줍니다.
또한 자동ㅇ으로 타입 형 변환이 일어납니다.
만약에 타입을 직접 명시하고 싶다면 @RequestParam을 이용할 수 있습니다.
@RequestParam("name") String name
위 @RequestParam은 파라미터로 사용된 변수 이름과 전달되는 파라미터이름이 다를 경우 적용하는데 유용합니다.
이를 바인딩이라고 합니다.
바인딩을 위해서 변환이 가능한 데이터가 필요에 따라 파라미터를 변환해서 처리해야하는 경우가 발생합니다.
예를들어서 날짜입니다.
2018-01-01 과 같은 문자열로 전달된 데이터를 java.util.Date 로 변환하는 작업입니다. 이때는 @InitBinder를 사용합니다.
@InitBinder
public void initBinder(WebDataBinder binder){
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
binder.registerCustomeEditor(java.util.Date.class, new CustomDateEditor(dateFormat,false));
}
위 방법이 불편하다면 @DateTimeFormat을 이용할 수 있씁니다.
즉 이는 날짜 변수에 어노테이션을 적용해줍니다.
@Data
public class Sample{
private String title;
@DateTimeFormat(pattern = "yyyy/MM/dd")
private Date dueDate;
}
Model 데이터 전달자
Controller 메서드에서는 Model이라는 파라미터로 지정할 수 있습니다. 이는 데이터 전달자의 역할을 하는것입니다.
Model 객체는 JSP에서 생성된 데이터를 담아서 뷰로 전달하는 용도입니다.
원래는 모델2 방식에서 request.setAttribute()와 같은 역할을 합니다.
public String home(Model model){
model.addAttribute("serverTime",new java.util.Date());
return "home";
}
사용 예
- 리스트 페이지 번호를 파라미터로 전달 받고 실제 데이터를 View로 전달해야 하는 경우
- 파라미터들에 대한 처리 후 결과를 전달할 때
@ModelAttribute
파라미터로 수집될 때 객체가 아닌 일반 자료형에 대해서는 값이 넘어가지 않습니다.
@GetMapping("/ex")
public String ex(Sample sample,int page)
{
return "/sample/ex";
}
즉 여기서는 page라는 값이 뷰에 전달이 되지 않습니다.
따라서 @ModelAttribute는 강제로 전달받은 파라미터를 Model에 담아서 넘길 때 사용합니다.
즉 파라미터로 받은 데이터를 다시금 뷰에 전달 될때 강제로 보내게 할 수 있습니다.
@GetMapping("/ex")
public String ex(Sample sample,@ModelAttribute("page") int page)
{
return "/sample/ex";
}
이렇게 되면 기본 자료형인 page도 넘어가게 됩니다.
@RedirectAttributes
Model과 비슷한 용도로 @RedirectAttributes가 있습니다.
이는 일회성 용도로 데이터를 전달합니다.
이는 서블릿에서 response.sendRedirect()와 동일합니다.
rttr.addFlashAttribute("name","이정찬");
rttr.addFlashAttribute("age",25);
return "redirect:/";
화면에 한 번만 사용하고 다음에는 사용되지 않는 데이터들을 전달합니다.
Controller 리턴 타입 void vs String
리턴타입이 비교적 자유로워졌습니다.
- String: jsp 파일이름
- void: 호출하는 URL과 동일 이름의 jsp파일
- VO,DTO 타입: 주로 JSON 타입의 데이터를 만들어서 반환
- ResponseEntity 타입: 응답 할 때 Http 헤더 정보와 내용을 가공
- Model, ModelAndView: Model로 데이터를 반환하거나 화면까지 같이 지정하는 경우(사용 거의 안함)
- HttpHeaders: 응답에 내용 없이 Http 헤더 메시지만 전달하는 용도
'웹 > Spring' 카테고리의 다른 글
Spring 이론(재) - 스프링 기본 구성 (0) | 2019.07.22 |
---|---|
Spring 이론(재) - AOP (0) | 2019.07.21 |
Spring 이론(재) - MVC구조 (0) | 2019.07.18 |
Spring 이론(재) - 특징과 의존성 주입 (0) | 2019.07.17 |
Spring 이론(재) - 간단히 spring project 생성 (0) | 2019.07.17 |