일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- Spring Servlet이란
- Spring Handler
- ContextLoaderListener란
- 안드로이드스튜디오
- spring 장점
- 동의어 파일
- Servlet 멀티 스레딩
- ElasticSearch 동의어 사전
- Servlet과 Thread
- H2 DB
- layout
- ElasticSearch EdgeNGram
- elasticSearch
- 안드로이드
- Java
- Bean Factory란
- Servlet Life Cycle
- 인텔리제이
- Dispathcher Servlet이란
- ApplicationContext란
- Spring Container란
- ElasticSearch 토큰필터
- 자바
- H2
- 토큰필터
- ElasticSearch Shingle
- Servlet Container란
- ElasticSearch NGram
- 계산기
- ElasticSearch 동의어 파일
- Today
- Total
결국 무엇이든 해내는 사람
Spring Handler(핸들러)란? 쉽게 쉽게 알아보자 본문
글을 짧고 내용은 간결하게 작성
내가 내 글을 보고 복습할 수 있게 작성
Spring에서 Handler란?
Spring MVC에서는 클라이언트의 요청을 처리하는 처리자를 Handler라고 한다.
그러면 Spring MVC에서의 Handler는 누구인가?
바로 Controller 클래스를 의미한다. 그리고 그 Controller 클래스에 있는 "@GetMapping, @PostMapping"같은 애너테이션이 붙어 있는 메서드들을 핸들러 메서드라고한다.
@Controller
public class UserController {
//===핸들러====================
@RequestMapping("/hello")
@ResponseBody
public String handler() {
return "hello";
}
//=============================
}
그래서 HandlerMapping이라는 의미는 "요청과 이 요청을 처리하는 Handler를 매핑해주는 것"을 말한다.
사용자의 요청은 HTTP Request Method(GET, POST등)의 Mapping URL을 기준으로 Handler와 매핑이 되는데 Spring에서는 여러가지 유형의 HandlerMapping 클래스를 제공하고 있다.
요청이 들어오고 핸들러가 실행되기까지의 과정은 아래와 같다.
- 클라이언트가 서버에 요청을 보냄
- 서버는 요청정보를 디스패쳐 서블릿에 담아 실행
- 디스패쳐 서블릿에서 요청맵핑정보와 핸들러 맵핑정보를 대조해보고 적절한 핸들러를 찾음
- 디스패처 서블릿에서 찾은 핸들러에 아규먼트를 넣어주고 실행
Handler Method의 아규먼트? 파라미터?
void foo (int bar) {...}
foo(baz);
bar는 foo()의 파라미터, int는 파라미터 타입
baz는 foo()의 아규먼트
Handler Method의 아규먼트의 역할
Spring에서 정한 아규먼트 타입을 사용하면 request 정보를 파라미터에 담아서 사용할 수 있다.
아래는 HttpMethod라는 아규먼트 타입을 사용하였을 때의 예시이다.
@RequestMapping("/events")
@ResponseBody
public String events(HttpMethod httpMethod) {
System.out.println(httpMethod.toString());
return "events";
}
// 실행시 콘솔에 요청 method가 나타납니다.
// get요청의 경우 응답 : GET
아래는 Handler Method Argument의 대표 예시들이다.
1. @PathVariable
uri에 들어있는 특정 부분을 메소드 아규먼트로 가져오는 방법이다.
@GetMapping("events/{eventId}")
public class doEvent(@PathVariable Integer eventId) {...}
@GetMapping("events/{eventId}")
public class doEvent(@PathVariable("eventId") Integer no) {...}
2. @RequestParam
request parameter 값을 받아오는 방법이다.
요청에는 두가지 종류가 있는데 하나는 "쿼리스트링에 있는 파라미터"이고 하나는 "formData"이다.
// POST person/new?name=gildong&age=20
@GetMapping("person/new")
@ResponseBody
public String newPerson(@RequestParam String name,
@RequestParam Integer age) {
return name + age;
}
// 결과 : gildong20
3. @ModelAttribute
요청 파라미터를 객체로 받아오는 핸들러 메소드 아규먼트이다.
DTO 객체를 만들어서 데이터를 받아서 사용하는 방법이다.
public class Person {
String name;
Integer age;
//getter,setter
}
// POST person/new?name=gildong&age=20
@GetMapping("person/new")
@ResponseBody
public String newPerson(@ModelAttribute Person person) {
return person.getName() + person.getAge();
}
// 결과 : gildong20
만약에 "person/new?name=gildong&age=스무살" 이라고 요청을 보내면 스무살이 Integer로 바인딩이 되지 않아 에러가 발생하는데, BindingResult 아규먼트를 사용하면 바인딩 에러를 담을 수 있고, 요청은 그냥 처리가 된다. 사실 처음봄.
// POST person/new?name=gildong&age=스무살
@GetMapping("person/new")
@ResponseBody
public String newPerson(@ModelAttribute Person person, BindingResult bindingResult) {
if(bindingResult.hasErrors()){
person.setAge(100);
}
return person.getName() + person.getAge();
}
// 결과 : gildong100
4. @RequestBody
요청 본문을 복합 객체로 받는 핸들러 메소드 아규먼트이다.
요청 본문의 종류는 json, xml 등이 있다.
@RequestBody는 요청 본문에 들어있는 데이터를 HttpMessageConverter를 사용해서 객체로 받아올 수 있는 아규먼트이다.
요청 본문에 name과 age를 담아 보내면 HttpMessageConverter가 해석해서 Person 객체를 생성해준다.
/* Post person/new
{
"name":"gildong",
"age":"20"
}
*/
@PostMapping("person/new")
@ResponseBody
public String addPerson(@RequestBody Person person) {
return person.getName() + person.getAge();
}
// 결과 : gildong20
Handler가 리턴하는 타입?
1. String
String타입으로 리턴하게 되면, templates 등 문자열에 해당하는 디렉토리 위치로 가서 html 파일을 찾아 view를 리턴한다.
2. @ResponseBody
리턴값을 HttpMessageConverter를 사용해서 응답 본문에 담아 응답한다.
참고로 @RestController를 사용하면 모든 핸들러가 @ResponseBody를 붙인것 처럼 동작한다.
3. ResponseEntity<T>
응답 헤더와 상태코드, 본문 등 응답을 알맞게 직접 만들어 리턴한다.
'본격적인 공부 노트 > Spring' 카테고리의 다른 글
Spring Filter? Interceptor? 쉽게 쉽게 알아보자 (1) | 2024.02.21 |
---|---|
Spring Container? ContextLoaderListener란? 쉽게 쉽게 알아보자 (0) | 2024.02.20 |
Spring의 요청 처리 방식? 쉽게 쉽게 알아보자 (0) | 2024.02.19 |
Spring Container? Spring MVC? Dispatcher Servlet 쉽게 쉽게 알아보자 (0) | 2024.02.18 |
Spring Servlet 쉽게 쉽게 알아보자 (1) | 2024.02.18 |