[Spring] Handler(Controller 로직 처리자) 개념
- BACKEND/Spring
- 2017. 6. 16. 14:33
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 |