ServletContainer 코드 대신 Controller 클래스 내부에 맵핑정보 넣기 : 애너테이션 이용
DispatcherServlet이 하는 역할
DispatcherServlet은 @RestController와 @GetMapping 애너테이션으로 뭘 하는 걸까?
- DispatcherServletdms 서블릿 컨테이너인 ApplicationContext를 생성자로 받았음
- ApplicationContext를 이용하여 빈을 전부 뒤져보고 그 중 웹 요청을 처리할 수 있는 맵핑 정보를 가지고 있는 클래스를 찾음
- Controller 클래스에 GetMapping 이나 RequestMapping 같은게 붙어있으면 웹 요청을 처리할 수 있도록 만들어진 웹 컨드롤러임을 판단하고 요청 정보들을 추출해냄
- 추출한 정보를 가지고 맵핑에 사용할 맵핑 테이블을 생성
- 이 후 웹 요청이 들어오면 맵핑 테이블을 참고하여 요청을 담당할 빈 오브젝트와 메서드를 확인
클래스 레벨의 @RequestMapping
클래스 레벨에 @RequestMapping은 뭘까?
- 웹 요청이 들어와서 DispatcherServlet이 맵핑 정보를 확인할 때 메서드 레벨에만 애너테이션이 붙어있다면 DispatcherServlet이 찾지 못함
- 메서드 레벨까지 전부 확인하려면 빈이 수천개가 등록되어있을 때 매번 전부 뒤지는 것이 어렵기 때문
- 클래스 레벨에 애너테이션을 추가해주면 됨
- 클래스 레벨에서 기본 url을 지정해주면, 해당 클래스 내의 모든 메서드에서 공통적인 url을 사용하면서도 각각의 메서드에 맞는 세부적인 맵핑 정보를 추가할 수 있음
- DispatcherServlet이 맵핑 정보를 만들 때 기본적으로 클래스 레벨에 있는 정보를 먼저 참고하고, 메서드 레벨에 붙어 있는 정보를 거기에 추가함
@Controller
@RequestMapping("/hello")
public class HelloController {
private final HelloService helloService;
public HelloController(HelloService helloService) {
this.helloService = helloService;
}
@GetMapping
public String hello(String name) {
return helloService.sayHello(Objects.requireNonNull(name)) ;
}
}
- 이처럼 클래스 레벨에 매핑정보 url을 담아주고 메서드에는 애너테이션만 달아 줄 수도 있음
404 ERROR 확인
원인