[Spring] Handler(Controller 로직 처리자) 개념

Handler(Controller) 종류


▪ Simple Controller 클래스

– Controller Interface 상속 받아 구현

– 기본 구현에 따라 여러 종류가 있다.

▪ AbstractController

▪ MultiActionController

– 구현 : 기본 구현 클래스들을 상속받아 역할에 따라 구현

▪ Annotation기반 Controller 클래스 (현재 가장 많이 쓰이는 기법)

– Annotation 기반의 Handler는 메소드이다.

– 클래스나 메소드의 어노테이션 설정을 통해 작성

POJO 기반으로 작성한다.

▪  Spring 3.0 이후 Annotation기반 Handler 방식 구현이 추세가 됨.




Annotation기반 Handler - 개요


▪ 클래스는 POJO로 구현 한 뒤 빈으로 등록한다.

– 클래스는 Handler들을 가지고 있는 역할을 한다. 

– <bean> 태그를 이용해 스프링 설정 파일에 등록

– @Controller Annotation 선언을 이용한 등록

▪ Handler 메소드

– 사용자 요청을 받아 응답까지를 담당하는 메소드

▪ 하나의 요청당 메소드 하나씩 만든다.

– Servlet기반  Controller 와 차이점

▪ Controller를 클래스당 하나씩 만들지 않고 메소드 단위로 만든다.

– @RequestMapping Annotation 을 Handler 메소드에 선언한다.

▪ 스프링 설정 파일

– mvc 네임스페이스 추가

– <mvc:annotation-driven/> 추가 => ※ 이걸 추가해주는게 정신건강에 좋다..!!




@RequestMapping

▪ 선언 위치

– Class 선언 부

▪ Handler메소드들에 공통 적용할 것들을 선언한다.

– Handler 메소드 선언 부

▪ Handler 메소드는 반드시 @RequestMapping을 선언해야 한다.

▪ 역할

– Handler 메소드를 요청할 URL경로 설정

– Handler 메소드가  처리할 HTTP 요청 방식 (생략 시 모든 방식 다 처리)

– 응답/요청 Content Type 관련 설정 









Handler 메소드 구현

▪ @RequestMapping Annotation을 반드시 선언해야 한다.

▪ 메소드 선언

– public 메소드로 구현한다.

– 메소드 명에 대한 규칙은 없다. 

– 리턴 타입과 매개변수는 제한된 범위 안에서 자유롭게 선언한다.

▪ 매개변수의 경우 순서 상관 없다.

– 예외는 자유롭게 throws 하도록 선언할 수 있다.

▪ Handler 메소드 구문을 제한된 범위 내에서 자유롭게 선언 할 수 있기 때문에 최

적화된 메소드 선언이 가능하다.

▪ 리턴 타입은 주로 응답과 관련 있고 매개변수는 주로 사용자 요청과 관련 있다. 



Handler 메소드 – 리턴 타입

▪ 응답 할 View나 응답 메세지와 관련

▪ String 

– View name 리턴

– View를 호출 할 때 View에게 전달할 값이 없거나 매개변수에서 ModelMap으로 처리한 경우 사용

▪ ModelAndView

– View name과 View에게 전달 할 값을 담아 리턴. 

▪ View 

– 응답을 처리하는 View객체를 직접 생성해서 리턴

– DispatcherServlet은 ViewResolver를 사용하지 않고 리턴 된 View를 이용해 응답한다.

▪ 모든 타입 - @ResponseBody 어노테이션 선언

– Handler 메소드가 리턴하는 값을 HTTP 응답 body에 넣어 바로 응답.   -> ViewResolver, View를 거치지 않고 HTML의 응답 Body에 넣어 처리

– Ajax 처리시 유용하다. 




ModelAndView

▪ Handler 메소드 처리 후 응답할 View 정보와 View에게 전달할 값을 저장하는 객체

– Handler 메소드의 리턴 타입으로 사용한다.

▪ 생성자

– ModleAndView(String  viewName) : 응답할 View name만 설정

– ModelAndView(String  viewName, String name, Object value) : View name과 View에 전달 할 값

▪ View에게 전달할 값이 하나일 경우 사용

▪ View에게 전달할 값은 name-value 쌍이며 두 번째 매개변수로 name, 세 번째 매개변수로 값을 전달

– ModelAndView(String  viewName, Map model)

▪ View에게 전달할 값이 여러개일 경우 사용

▪ Map에 전달할 값을 name-value 쌍으로 넣어 전달 한다.






Handler 메소드 구현 - 매개변수

▪ 다음 타입들을 매개변수로 선언 할 수 있다.

– Handler 메소드가 Spring Container에 의해 호출 될 때 선언된 매개변수에 맞춰 값(객체)이 전달된다.

▪ HttpServletRequest

▪ HttpServletResponse

▪ HttpSession

– 요청한 사용자의 기존 Session 이 있으면 기존것을 없으면 새로 Session을 생성한 뒤 매개변수로 전달

된다.

▪ Model, ModelMap

– View에게 전달할 값(Model)을 담기 위한 객체

– org.springframework.ui 패키지에 있다.

– 메소드

▪ addAttribute(String name, Object value) – 한 개의 전달 값을 설정

▪ addAllAttributes(Map values) – 여러 개의 전달 값을 설정




Handler 메소드 구현 - 매개변수

▪ 요청 파라미터를 받기 위한 변수

– @RequestBody 변수

▪ HTTP 요청 body의 내용을 그대로 받는 변수 선언

▪ JSON 형태로 받을 경우 사용 (주로 AJAX 연동 시)

– @RequestParam 변수 -> default로 생략 가능

▪ 요청 파라미터 하나를 읽기 위한 변수 선언

–  @ModelAttribute 변수 -> object타입으로 생략 가능

▪ 여러 개의 요청 파라미터를 VO에 넣어 받기 위한 변수 선언 , 요청파라미터 검증가능





@RequestParam

– 하나의 요청 파라미터를 받기 위한 변수에 선언하는 Annotation

– 하나의 이름에 하나의 값인 경우

▪ 변수의 타입을 값에 타입에 맞춰 선언한다. (문자열의 경우 String, 정수의 경우 int나 long)

– 하나의 이름에 여러 개의 값인 경우

▪ 배열이나 List 로 선언한다.

– 속성

▪ value : String – 전달 받을 요청 파라미터의 name : 생략하면 변수명을 이름으로 사용

▪ required : boolean – 필수 여부(기본값 – true : 요청 파라미터가 없으면 Exception(400) 발생)

▪ defaultValue : String – 전달된 요청 파라미터가 없을 경우 대신 넣을 기본 값

– 속성 설정이 필요 없는 경우 @RequestParam은 생략 해도 된다.

▪ 생략하면 변수 이름이 요청 파라미터 이름이 된다. 



@ModelAttribute

– 요청 파라미터 값들을 저장할 Value Object 타입 변수에 선언하는 Annotation

– 선언한 VO 의 property name과 요청 파라미터의 name이 같은 것을 매칭해 넣는다.

– 요청 파라미터가 설정된 VO는 request scope의 속성으로 등록(binding) 된다.

▪ 속성 name은 클래스 이름을 이용해 넣는다. (첫 글자 소문자로 해서 이름으로 사용)

▪ @ModelAttribute 의 value 속성으로 이름을 명시할 수 있다.

– Annotation의 속성 설정이 필요 없는 경우 @ModelAttribute는 생략할 수 있다. 



요청 파라미터 검증

▪ 요청 파라미터 유효성 검사

– Javascript 를 이용한 검사 : 요청 전에 Web Browser 상에서 미리 검사

– Controller에서 검사

▪ Javascript는 Web Browser 설정에 따라 실행이 안될 수 있기 때문에 서버측에서도 해야 한다.

▪ Spring Validator 구현

– Validator implements 후 메소드 Overriding

– Annotation을 이용한 구현

'BACKEND > Spring' 카테고리의 다른 글

[Spring] Annotation을 이용한 validation 구현  (0) 2017.06.21
[Spring] Filter 등록해서 쓰기  (0) 2017.06.19
[Spring] Spring MVC 개념  (0) 2017.06.16
[Spring] Spring MVC 예제  (0) 2017.06.15
[Spring] Transaction  (0) 2017.06.15

댓글

Designed by JB FACTORY