MVC 웹 애플리케이션

컨트롤러 및 핸들러 맵핑

@Controller

- Controller의 역할을 수행한다고 명시.

- Controller는 필요한 비즈니스 로직을 호출하여 처리 결과(Model)와 처리 결과를 출력할 View 정보를 DispatcherServlet에 반환한다.

- Bean으로 등록된다.

- @Component의 구체화된 애노테이션으로 클래스에 붙인다.

- 빈 이름을 지정하지 않으면 클래스 이름의 첫 문자를 소문자로 바꾼 것이 빈의 이름(id)으로 빈을 등록한다.

- 형식 @Controller, @Controller("beanName")

 

@RequestMapping

- 요청에 대해 어떤 Controller, 어떤 메소드가 처리할지를 매핑하기 위한 애노테이션

 url을 class또는 method와 mapping 시켜주는 역할을 한다.

- 선언위치 : 클래스 또는 메소드

 1) class level(type level) 매핑 : 컨트롤러의 모든 메소드에서 처리하는 경우

 2) method level 매핑 : 요펑 url에 대한 해당 메소드에서 처리하는 경우

- GET, POST, PUT, DELETE 등으로 표현되는 모든 HTTP Request method 를 매핑 할 수 있다.

- @RequestMapping 시 따로 HTTP Method를 설정하지 않으면 모든 Method를 허용한다.

- @RequestMapping 애노테이션은 Ant 스타일의 패턴을 지원한다.

 1) ? : 1개의 문자와 매칭

 2) * : 0개 이상의 문자와 매칭

 3) ** : 0개 이상의 디렉터리와 매칭

 4) {spring:[a-z]+} : "spring"이라는 path variable로 정규문법 [a-z]+와 일치

- 상위 클래스에 @RequestMapping이 정의되어 있고 하위 클래스에서는 @RequestMapping을 재정의하지 않은 경우 @RequestMapping는 그대로 상속된다

- 상위 클래스의 클래스에 정의된 @RequestMapping과 하위 클래스의 메소드에 정의된 @RequestMapping의 조합이 가능하다.

- 스프링 4.3부터는 5가지 애노테이션을 추가하여 HTTP 요청 메소드별로 세분화 하였다.

 추가된 HTTP 요청 메소드별 매핑 애노테이션

@GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping

@GetMapping("/hello") 은 @RequestMapping(value="/hello", method=RequestMethod.GET)의 축약형이다.

@PostMaoong("/hello") 은@RequestMapping(value="/hello", method=RequestMethod.POST)의 축약형이다.

 

컨트롤러 메소드의 리턴 타입

1) ModelAndView 객체

- 처리결과를 담은 Model 객체와 View정보를 ModelAndView객체에 담아 반환

- ModelAndView 클래스는 컨트롤러의 처리 결과를 보여줄 뷰와 뷰에 전달할 값을 저장하는 용도로 사용

 

2) String

 - 뷰의 이름을 반환한다.

 

3) Model, ModelMap

 - 처리 결과를 Model 객체에 담아 반환한다.

- Model은 인터페이스이며, ModelMap은 클래스로 사용방법은 유사하다.

- ModelMap 하위 클래스인 ExtendedModelMap은 Model구현 클래스이다.

- 뷰의 이름은 RequestToViewNameTranslator를 통해매핑된 URL로 결정된다.

 URL 이 "/hello/main"인 경우 뷰의 잉름은 "hello/main"이 된다.

- Model 객체 생성 예

 Model model = ExtendedModelMap();

 

4) void

- 메소드의 인수로 HttpServletResponse파라미터가 존재하지 않는 경우 뷰의 이름은 RequestToViewNameTranslator를 통해 매핑된 URL로 결정된다. URL이 "/hello/main"인 경우 뷰의 이름은 "hello/main"이 된다.

- HttpServletResponse등을 사용해서 직접 응답을 처리하는 경우 사용할 수 있다.

 

5) Map

- 처리 결과를 Map 객체에 담아 반환한다.

- 뷰의 이름은 RequestToViewNameTranslator를 통해 매핑된 URL로 결정된다. URL이 "/hello/main"인 경우 뷰의 이름은 "hello/main"이 된다.

 

6) View

- View 객체를 직접 반환. 해당 View객체를 이용하여 뷰를 생성

- AbstractView 클래스 등을 상속받은 커스텀 뷰를 반환할 수 있다.

- 파일 다운로드, PDF 나Excel로 변환하여 다운로드를 구현할 경우에 사용할 수 있다.

 

포워딩과 리다이렉트

 

1) 포워딩(forwarding)

- "forward:"로 시작하는 View이름을 설정하며, forward는 디폴트로 생략 가능하다.

- 컨트롤러 메소드의 리턴 타입이 String인 경우 "bbs/list" 뷰 이름으로 포워딩

return "bbs/list";

- 컨트롤러 메소드의 리턴 타입이 ModelAndView인 경우 "bbs/list" 뷰 이름으로 포워딩

return new ModelAndView("bbs/list");

 

2) 리다이렉트(Redirect)

- RedirectView

 HttpServletResponse의 sendRedirect(location)를 호출해주는 기능을 가진 뷰

 실제 뷰가 생성되는 것이 아니라 URL만 만들어져 다른 페이지로 리다이렉트 된다.

 모델 정보가 있다면 URL 뒤에 파라미터로 추가된다.

- 리다이렉트 방법

 redirect: 로 시작하는 View이름을 설정

1) 컨트롤러 메소드의 리턴 타입이 String인 경우 "/main"으로 리다이렉트

return "redirect:/main";

2) 컨트롤러 메소드의 리턴 타입이 ModelAndView인 경우 "/main"으로 리다이렉트

return new ModelAndView("rediect:/main");

 

RedirectView 오브젝트를 직접 만들어 반환

return new ModelAndView(new RedirectView("/main") );

 

컨트롤러 핸들러 메소드의 매개변수

1) Servlet API

- HttpServletRequest, HttpServletResponse, HttpSession

 

2) java.util.Locale

- DispatcherServlet의 지역정보 리졸버(Locale Resolver)가 결정한 Locale객체

 

3) java.io.InputStream / java.io.Reader

- request(요쳥 정보) body 영역을 직접 읽어 들이기 위한 InputStream 또는 Reader 객체

 

4) java.io.OutputStream / java.io.Writer

- response 정보를 직접 보내기 위한 OutputStream 또는 Writer 객체

 

5) Map, Model, ModelMap

- 뷰에 전달할 모델 데이터 설정

 

6) 커맨트 객체

- HTTP 요청 파라미터를 저장할 객체

 

7) RedirectAttrivutes

- 리다이렉트 되는 페이지에 데이터를 전달한다.

- 주요 메소드

 (1) addAttribute(String attributeName, Object attributeValue)

 - 리다이렉트 되는 URL에 쿼리 스트링으로 데이터를 전달해준다.

 - 쿼리 스트링으로 전달되므로 String으로 변환이 가능한 원시타입만 가능하다.

 - F5를 눌러 새로고침을 해도 값이 유지된다.

 

 (2) addFlashAttribute(String attributeName, Object attributeValue)

 - 리다이렉트 되는 페이지에 데이터를 전달하며, 주소 뒤에 표시되지 않는다.

 - 세션을 이용하여 값을 전달 후에 삭제된다. 즉, 일회성으로 F5를 눌러 새로고침을 하면 값이 사라진다.

 

8) SessionStatus

 - @SessionAttributes 애노테이션을 사용하여 session에 저장된 데이터를 정리하는데 활용하는 인터페이스

 - SessionStatus의 setComplete() 메소드를 호출하면 현재 컨트롤러에서 @SessionAttributes에 의해 세션에 저장된 모델 데이터를 모두 삭제한다.

 

9) Errors, BindingResult

 - Errors는 유효성 검증 결과를 저장할 때 사용

 - Errors의 하위 인터페이스로 폼 값을 커맨드 객체에 바인딩한 결과를 저장하고 에러코드로 메세지를 가져온다.

+ Recent posts