본문으로 바로가기

Spring 이론(재) - controller

category 웹/Spring 2019. 7. 20. 16:04

스프링 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 헤더 메시지만 전달하는 용도