[Spring] 4. MVC구조 중 Controller
MVC 중 Controller.
데이터와 사용자 인터페이스 요소들을 잇는 징검다리 역할
사용자가 데이터를 클릭하거나 수정에 대한 이벤트를 처리!
모델이나 뷰에 대해서 잘 알어야 하는데 변경을 외부로 알리고 수신 하는 것을 중재
하는 역할을 하는게 컨트롤러
변경에 대한 모니터링 역할이기 때문에 메인 로직은 컨트롤러가 담당합니다.
•HttpServletRequest, HttpServletResponse를 거의 사용할 필요 없이 필요한 기능 구현
•다양한 타입의 파라미터 처리, 다양한 타입의 리턴 타입 사용 가능
•GET 방식, POST 방식 등 전송 방식에 대한 처리를 어노테이션으로 처리 가능
•상속/인터페이스 방식 대신에 어노테이션만으로도 필요한 설정 가능
@Controller - 해당 클래스의 인스턴스를 스프링의 빈으로 등록하고
컨트롤러로 사용
<component-scan>과 같이 활용
@RequestMapping - 특정한 URI에 대한 처리를 해당 컨트롤러나
메서드에서 처리
package org.zerock.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/sample/*")
public class SampleController
컨트롤러의 파라미터 수집
•스프링 MVC의 컨트롤러는 메서드의 파라미터를 자동으로 수집, 변환하는 편리한 기능을 제공
•Java Beans 규칙에 맞게 작성되어야 한다.
•생성자가 없거나 빈 생성자
•올바른 규칙으로 만들어진 Getter/Setter
@GetMapping("/ex01")
public String ex01(SampleDTO dto) {
log.info("" + dto);
return "ex01";
}
@Data
public class SampleDTO {
private String name;
private int age;
}
@GetMapping("/ex02List")
public String ex02List(@RequestParam("ids")ArrayList<String> ids) {
//리스트,배열
log.info("ids: " + ids);
return "ex02List";
}
@InitBinder - Spring Validator를 사용 시 @Valid annotation으로 검증이 필 요한 객체를 가져오기 전에 수행할 method를 지정해주는 annotation이다.
public class TodoDTO {
private String title;
private Date dueDate; //날짜 타입의 변환 필요
}
@InitBinder
public void initBinder(WebDataBinder binder) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
}
/*
...
*/
@GetMapping("/ex03")
public String ex03(TodoDTO todo) {
log.info("todo: " + todo);
return "ex02";
}
Controller의 리턴 타입
•String: jsp를 이용하는 경우에는 jsp 파일의 경로와 파일이름을 나타내기 위해서 사용
•void: 호출하는 URL과 동일한 이름의 jsp를 의미
•VO, DTO 타입: 주로 JSON 타입의 데이터를 만들어서 반환하는 용도로 사용 (추가적인 라이브러리 필요).
•ResponseEntity 타입: response할 때 Http 헤더 정보와 내용을 가공하는 용도로 사용 (추가적인 라이브러리 필요).
•Model, ModelAndView: Model로 데이터를 반환하거나 화면까지 같이 지정하는 경우에 사용 (최근에는 많이 사용하지 않습니다.).
•HttpHeaders: 응답에 내용 없이 Http 헤더 메시지만 전달하는 용도로 사용
Controller의 예외(Exception)처리
•@ExceptionHandler와 @ControllerAdvice를 이용한 처리
•@ResponseEntity를 이용하는 예외 메시지 구성
@ControllerAdvice - 예외처리와 원래의 컨트롤러가 혼합된 형태의 클래스가 작성되는 방식
- @ExceptionHandler는 해당 메서드가 ()들어가는 예외 타 입을 처리한다는 것을 의미
@ControllerAdvice
@Log4j
public class CommonExceptionAdvice {
@ExceptionHandler(Exception.class)
public String except(Exception ex, Model model) {
log.error("Exception ......." + ex.getMessage());
model.addAttribute("exception", ex);
log.error(model);
return "error_page";
}
}