본문 바로가기
Spring

SpringMVC Controller

by 달보드레. 2020. 5. 21.

* 파라미터의 수집과 변환 : 컨트롤러가 파라미터를 수집하는 방식은 파라미터 타입에 따라 자동으로 변환

@RequestParam  


- 파라미터로 사용된 변수의 이름과 전달되는 파라미터의 이름이 다른 경우에 유용하게 사용 됨

 

*리스트 배열처리 : 동일한 이름의 파라미터가 여러개 전달되는 경우 Arraylist등을 이용해서 처리

@RequestParam("..")ArrayList<> "" 

- 스프링은 파라미터의 타입을 보고 객체를 생성하므로 

  파라미터의 타입은 List와 같이 인터페이스가 아닌 클래스 타입으로 지정 
- 배열도 동일하게 가능 

 

* 객체 리스트 : 만일 전달하는 데이터가 객체 타입이고 여러 개를 처리해야 한다면 클래스 타입을 파라미터로 사용
              파라미터는 인덱스와 같은 형식으로 전달해서 처리

@InitBinder : 파라미터 수집을 binding이라고도 한다

변환이 가능한 데이터는 자동으로 변환되지만 파라미터를 변화해서 처리해야 하는 경우도 있다

예를들어 "2020.05.21"가 같은 문자열로 전달되는 데이터를 java.util.Date 타입으로 변환하는 작업들이 그러함

스프링 Controller에서는 파라미터를 바인딩할때 자동으로 호출되는 @InitBinder를 이용해 변환 처리 가능

 

@DateTimeFormat(pattern = "yyyy/MM/dd") : 문자열로 yyyy/MM/dd의 형식이 맞다면 자동으로 날짜 타입으로 변환

 

* Model

- Controller의 메서드를 작성할 때는 특별하게 Model이라는 타입을 파라미터로 지정
  Model 객체는 JSP에 컨트롤러에서 생성된 데이터를 담아서 전달하는 역할
  이를 이용해 JSP와 같은 View로 전달해야 하는 데이터를 담아서 보낼 수 있다
  Model은 모델 2방식에서 사용하는 request.setAttribute()와 유사한 역할을 함

(Servlet 모델2 방식)

  request.setAttribute("서버시간 : " + new java.util.Date());
  RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/home.jsp");
  dispatcher.forward(request,response);
  (SPRING 방식)
  
  public String home(Model model){
  	model.addAttribute("서버시간 :",new java.util.Date());
  	return "home";
  }

  메서드의 파라미터를 Model 타입으로 선언하게 되면 자동으로 스프링MVC에서 Model타입의 객체를 만들어 줌
  따라서 개발자는 필요한 데이터를 담아주기만 하면 됨
  Model을 사용해야 하는 경우는 주로 Controller에 전달된 데이터를 이용해서 추가적인 데이터를 가져와야 하는 상황
  > 리스트 페이지 번호를 파라미터로 전달받고, 실제 데이터를 View로 전달해야 하는 경우
  > 파라미터들에 대한 처리 후 결과를 전달해야 하는 경우

 

  @ModelAttribute
  - 웹페이지의 구조는 Request에 전달된 데이터를 가지고 필요하다면 

    추가적인 데이터를 생성해서 화면으로 전달하는 방식으로 동작 
    Model의 경우 파라미터로 전달된 데이터는 존재하지 않지만 화면에서 필요한 데이터를 전달하기 위해서 사용
    @ModelAttribute는 강제로 전달받은 파라미터를 Model에 담아 전달하도록 할 때 필요한 어노테이션
    @ModelAttribute가 붙은 파라미터는 화면까지 전달되므로 

    브라우저를 통해서 호출하면 아래와 같이 ${page}가 출력되는 것을 확인 할 수 있다
    기본자료형에 @ModelAttribute를 적용할 경우 @ModelAttribute("value") 지정

 

- RedirectAttribute : 일회성으로 데이터를 전달하는 용도로 사용
                           RedirectAttribute는 Model과 같이 파라미터로 선언해서 사용하고 ,

                           addFlashAttribute(이름,값)메서드를 
                           이용해서 화면에 한 번만 사용하고 다음에는 사용되지 않는 데이터를 전달하기 위해서 사용

 (Servlet 방식)
 response.sendRedirect("/home?name=aaa?age=10");

  (SPRING 방식)
  rttr.addFlashAttribute("name", "AAA");
  rttr.addFlashAttribute("age","10");
  return "redirect:/";

* Controller 리턴타입

 

- Controller의 메서드가 사용가능한 리턴 타입

  String : JSP의 경우 jsp파일의 경로와 파일이름을 나타내기 위해 사용
  void : 호출하는 URL과 동일한 이름의 JSP를 의미
  VO,DTO 타입 : 주로 JSON타입의 데이터를 만들어서 반환하는 용도
  ResponseEntity : response할때 Http 헤더 정보와 내용을 가공하는 용도로 사용
  Model,ModelAndView : Model로 데이터를 반환하거나 화면까지 같이 지정하는 경우에 사용
  HttpHeaders :응답에 내용없이 http헤더 메시지만 전달

 

* Controller의 Exception 처리

 

 1. @ExceptionHandler와 @ControllerAdvice를 이용한 처리
 2. @ResponseEntity를 이용하는 예외 메시지 구성

 

 - @ControllerAdvice는 AOP를 이용한 방식
   공통적인 예외사항에 대해서는 별도로 @ControllerAdvice를 이용해서 분리하는 방식

 

  ex)
 CommonException.class 생성

  @ControllerAdvice
  @Log4j2
  public class CommonException {

  	@ExceptionHandler(Exception.class)
  	public String except(Exception ex,Model model){
  		log.error("Exeption 발생" + ex.getMessage());
  		model.addAttribute("Exeption" , ex);
  		log.error(model);
  		return "error_page";
  	}
  }


  CommonException클래스에는 @ControllerAdvice라는 어노테이션과 

  @ExceptionHandler라는 어노테이션 을 사용하고 있음


  @ControllerAdvice는 해당객체가 스프링의 컨트롤러에서 발생하는 예외를 처리하는 존재임을 명시하는 어노테이션
  @ExceptionHandler는 해당 메서드가 ()에 들어가는 예외타입을 처리하는 메서드임을 명시하는 어노테이션
  @ExceptionHandler 속성으로는 Exception클래스 타입을 지정 가능

 

 

'Spring' 카테고리의 다른 글

MVC , 모델2(Model2) , SpringMVC  (0) 2020.05.21
Spring MVC 프로젝트 구동 구조  (0) 2020.05.20
Mybatis - 2  (0) 2020.05.20
Bean  (0) 2020.05.19
DI (Dependency Injection)  (0) 2020.05.19