Handler
처리하는 취급자 → 웹요청 처리
컨트롤러: 일종의 핸들러
핸들러: 스프링 MVC에서 웹 요청을 처리하는 객체를 가장 큰 범위에서 부르는 용어
HandlerMapping
추상클래스: AbstractUrlHandlerMapping을 구현하여 총 5개의 HandlerMapping 구현되어 있음

SimpleUrlHandlerMapping
URL과 Controller을 직접 맵핑
BaenNameUrlHandlerMapping
URL과 Bean 이름을 가지고 Controller 맵핑
ControllreBeanNameHandlerMapping
빈의 아이디나 이름을 이용해 맵핑
<bean id="test" class="org.springframework.web.servlet.mvc.support.ControllerBeanNameHandlerMapping"/>
?
@Component("test")
public class TestController implements Controller {
...
}
위와 같이 선언하면 /test URL에 맵핑
ControllerClassNameHandlerMapping
URL과 Controller 명을 일정한 규칙으로 매핑
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>
<bean class="com.mungchung.MainController" />
<bean class="com.mungchung.TestHelloController" />
/main*의 요청은 MainController에서 처리
/testHello*의 요청은 TestHelloController에서 처리
DefaultAnnotaitonHandlerMapping
@RequestMapping 어노테이션을 이용하여 요청을 처리할 컨트롤러 구현
참고
HandlerMapping은 서로 섞어서 사용할 수 있고 이 경우 우선 순위 줄 수 있음
<bean id="handlerMapping1" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="order" value="1"/>
</bean>
<bean id="handlerMapping2" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
<property name="order" value="2"/>
</bean>
출처
http://www.mungchung.com/xe/spring/21278
Spring 3.0 - Spring의 HandlerMapping 종류및 사용방법
Spring이용하는 HandlerMapping 종류이다. 추상클래스 : AbstractUrlHandlerMapping 을 구현하여 총 5개의 HandlerMapping가 구현되어 있다. 1) SimpleUrlHandlerMapping URL과 Controller을 직접 맵핑해준다. <bean id="handlerMapping
www.mungchung.com
https://velog.io/@hsgin11/HongSpring%EC%97%90%EC%84%9C-Handler
[Hong]Spring에서 Handler
스프링 MVC 형식으로 코드를 수정하던 중에 핸들러의 개념에 대해서 잘 모르는 것 같아서 찾아보고 정리해보고자 합니다..핸들러.. 그냥 직역하면 '처리하는 취급자' 이런느낌입니다. 스프링에서
velog.io
Controllr
컨트롤러의 메소드인 핸들러
@Controller 어노테이션이 사용된 클래스
Handler
컨트롤러 안에서 어떤 요청을 처리할 수 있는 메소드
요청이 들어오고 핸들러가 실행되기까지
1. 클라이언트가 서버에서 요청
2. 서버는 요청 정보를 디스패처 서블릿에 담아 실행
3. 디스패처 서블릿에서 요청 맵핑 정보와 핸들러 맵핑 정보를 대조해 보고 적절한 핸들러 찾기
4. 디스패처 서블릿에서 찾은 핸들러에 argument 넣어 주고 실행
핸들러에 요청 맵핑
@RequestMapping
디스패처 서블릿이 핸들러를 찾으려면 단서가 있어야 함. 스프링에서는 그 단서를 @(Annotation)으로 제공
핸들러 맵핑에서 가장 기본이 되는 어노테이션은 @RequestMapping 어노테이션
"/hello"라는 uri 패턴에 맵핑하고 싶다면, @RequestMapping("/hello")라고 적어 주면 됨
@RequestMapping("/hello")
// OR
@RequestMapping(value="/hello")
조합해서 쓰기
@RequestMapping은 컨트롤러와 핸들러의 맵핑과 조합해서 사용 가능
컨트롤러에 "/jogn"을, 핸들러에 "/hello"를 사용하면, 조합되어 "john/hello"와 맵핑
@Controller
@RequestMapping("/john")
public class UserController {
@GetMapping("/hello")
@ResponseBody
public String handler() {
return "hello";
}
}
// "http://localhost:8080/john/hello" 요청에 맵핑됩니다.
여러 url 맵핑
@RequestMapping({"/hello", "/hi"})
@ResponseBody
public String handler() {
return "hello";
}
// "localhost:8080/hello" 요청,
// "localhsot:8080/hi" 요청 둘 다 맵핑됩니다.
uri에 중괄호 사용
uri에 중괄호{}를 사용하면, 중괄호 안에 들어 있는 변수로 uri를 받아 @PathVariable로 사용 가능
GET "/hello/juni"라고 보내면, "{name}에 해당하는 juni를 @PathVariable을 사용한 파라미터 name으로 받아서 사용 가능
여기서 @PathVariable을 핸들러 메소드 아규먼트라고 하는데, 핸들러에서 사용할 파라미터 핸들러 메소드 아규먼트를 통해 받아서 사용할 수 있음
handler method argument
파라미터, argument
void foo (int bar) {...}
foo(baz);
bar는 foo의 파라미터이고, baz는 foo의 아규먼트
handler method argument
핸들러 메소드 아규먼트는 요청에 들어 있는 여러 가지 값 중 핸들러에서 사용하고 싶은 정보를 꺼내서 사용하는 개념
꼭 요청에 들어 있지 않더라도, 스프링이 넣어 줄 수 있는 정보라면 받아서 사용 가능
@PathVariable
uri에 들어 있는 특정 부분을 메소드 아규먼트로 가져오는 방법
이 argument의 특징은 uri 문자열의 타입컨버전이 가능하고, uri에 문자로 "15"를 쓰더라도, Integer 숫자 15로 받을 수 있는 것
괄호를 사용하면 변수명이 달라도 받을 수 있음
@GetMapping("events/{eventId}")
public class doEvent(@PathVariable Integer eventId) {...}
@GetMapping("events/{eventId}")
public class doEvent(@PathVariable("eventId") Integer no) {...}
@RequestParam
요청 파라미터를 받아오는 핸들러 메소드 아규먼트
요청 파라미터는 두 가지 종류가 있는데, 하나는 쿼리파라미터이고, 다른 하나는 formData
- 쿼리 파라미터는 uri 요청이 "/person/new?name=gildong&age=20"이라고 할 때, "?name=gildong&age=20"에 해당하는 부분
- forData는 http에서 <form> 태그로 보낼 때, 키벨류쌍으로 값을 보낼 때를 말함
// POST person/new?name=gildong&age=20
@GetMapping("person/new")
@ResponseBody
public String newPerson(@RequestParam String name,
@RequestParam Integer age) {
return name + age;
}
// 결과 : gildong20
@RequestParam은 생략할 수 있으나, 다른 생략 가능한 argument인 @ModelAttribute와 헷갈릴 수 있으니 생략 비추천
// POST person/new?name=gildong&age=20
@GetMapping("person/new")
@ResponseBody
public String newPerson(String name, Integer age) {
return name + age;
}
// 결과 : gildong20
@RequestParam은 required 라는 속성이 있는데, 이 값이 기본적으로 true여서 값이 없으면 에러
속성값을 required=false로 바꾸면 값이 없어도 에러가 나지 않고, defaultValue를 함께 사용 가능
// POST person/new?name=gildong
@GetMapping("person/new")
@ResponseBody
public String newPerson(@RequestParam String name,
@RequestParam(required=false, defaultValue="100") Integer age) {
return name + age;
}
// 결과 : gildong100
@ModelAttribute
요청 파라미터를 복합객체로 받아오는 핸들러 메소드 argument
@RequestParam이 제각각 하나의 값을 받아왔다면, @ModelAttribute는 복합객체를 사용 가능
필드값으로 name, age가 있는 클래스를 만들어서, 그 클래스타입으로 받기 가능
public class Person {
String name;
Integer age;
//getter,setter
}
요청에 Person 객체 사용해서 받기
// POST person/new?name=gildong&age=20
@GetMapping("person/new")
@ResponseBody
public String newPerson(@ModelAttribute Person person) {
return person.getName() + person.getAge();
}
// 결과 : gildong20
@RequestParam과 마찬가지로 생략 가능하나 비추천
// POST person/new?name=gildong&age=20
@GetMapping("person/new")
@ResponseBody
public String newPerson(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) {
return person.getName() + person.getAge();
}
// 결과 : gildongnull
BuildingResult에 담긴 에러 사용 가능
// 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
@RequestBody
요청 본문을 복합 객체로 받는 핸들러 메소드 아규먼트
| 요청 파라미터(request parameter) | 쿼리파라미터, formData... |
| 요청 본문(requestbody) | JSON, XML... |
@RequestBody는 요청 본문에 들어 있는 데이터를 HttpMessageConverter를 사용해서 객체로 받아올 수 있는 아규먼트
요청 본문에 name과 age를 담아 보내면, HttpMessageConverter가 해석해서 Person 객체를 생성
포스트맨을 사용하여 JSON 요청 보내면
/* Post person/new
{
"name":"gildong",
"age":"20"
}
*/
@PostMapping("person/new")
@ResponseBody
public String addPerson(@RequestBody Person person) {
return person.getName() + person.getAge();
}
// 결과 : gildong20
핸들러가 응답하는 리턴 타입
String
String 타입으로 리턴하게 되면, templates 등 특정 디렉토리 밑에 문자열에 해당하는 html 파일을 찾아서 view를 리턴
@ResponseBody
리턴값을 HttpMessageConverter를 사용해서 응답 본문에 담아 응함
@RestController를 사용하면 모든 핸들러가 @ResponseBody를 붙인 것처럼 동작
ResponseEntity<T>
응답 헤더와 상태 코드, 본문 등 응답을 입맛에 맞게 직접 만들어서 리턴
출처:https://junikang.tistory.com/310
[Spring] 핸들러(Handler)란?
핸들러란? 컨트롤러의 메소드인 핸들러 스프링에서 @Controller 애노테이션이 사용된 클래스를 컨트롤러라고 부릅니다. 핸들러는 컨트롤러 안에서 어떤 요청을 처리할 수 있는 메소드를 핸들러라
junikang.tistory.com
'Spring boot > 개념' 카테고리의 다른 글
| 나만 맨날 헷갈리는 JSON, Mybatis (0) | 2025.03.16 |
|---|---|
| [Spring boot] @NoArgsConstructor @AllArgsConstructor @RequiredArgsConstructor (1) | 2024.05.22 |
| [Spring boot] DTO VO DAO 차이점 (0) | 2024.05.12 |
| [Spring boot] @Service @Repository @Controller 차이점 (0) | 2024.05.12 |