@RequestMapping
@MVC의 핸들러 매핑은 DefaultAnnotationHandlerMapping을 이용하는데, 이것의 핵심은 매핑 정보로 @RequestMapping 어노테이션을 활용한다는 점이다. DefaultAnnotationHandlerMapping은 디폴트이기 때문에 다른 핸들러 매핑 bean을 명시적으로 등록하지 않았다면 기본적으로 사용할 수 있다. 다만, 다른 핸들러 매핑 빈 등록시 빈으로 등록해줘야한다.
아래 어노테이션을 예시로 하나씩 살펴보자.
@RequestMapping(value="/main", method=RequestMethod.GET, params="type=user", headers="content-type=text/html")
디폴트 엘리먼트인 value는 String 배열 타입으로, URL 패턴을 지정한다.
만약 요청 URI가 "/main.do" 라면
1 2 3 | @RequestMapping("/main") @RequestMapping("/main*") @RequestMapping("/main.*") | cs |
이렇게 요청을 받아올 수 있고, 배열이기 때문에
1 | @RequestMapping({"/main", "/index"}) | cs |
이런 형태도 가능하다.
@RequestMapping에서는 {}를 이용해 URI 템플릿을 만들어 {}위치에 해당하는 내용을 컨트롤러 메서드에서 파라미터로 취득할 수 있다. {}에 들어가는 이름을 패스변수라고 부르며, 하나 이상 등록할 수 있다.
1 | @RequestMapping("/main/{userType}") | cs |
@RequestMapping(value="/main", method=RequestMethod.GET, params="type=user", headers="content-type=text/html")
method에는 GET/HEAD/POST/PUT/DELETE/OPTIONS/TRACE 7개의 HTTP 메서드가 위치한다. 같은 URI이어도, method를 다르게 분기해 매핑하면 요청의 메서드에 따라 해당 요청을 처리하는 메서드를 선택할 수 있다. 배열형태로 사용 가능하다.
1 2 | @RequestMapping(value="/main", method=RequestMethod.GET) @RequestMapping(value="/main", method=RequestMethod.POST) | cs |
@RequestMapping(value="/main", method=RequestMethod.GET, params="type=user", headers="content-type=text/html")
params를 이용하면 요청 파라메터에 따라 분기처리가 가능하다
1 2 | @RequestMapping(value="/main", params="type=admin") @RequestMapping(value="/main", params="type=user") | cs |
만약 @RequestMapping(value="/main") 이 하나 추가됬을 때, /main?type=admin 요청이 들어왔을 때에는 좀 더 상세한, @RequestMapping(value="/main", params="type=admin") 이 요청을 처리하게된다.
특정 파라메터가 존재하지 않아야 한다면
1 | @RequestMapping(value="/main", params="!type") | cs |
이런 식으로 사용하면 된다.
@RequestMapping(value="/main", method=RequestMethod.GET, params="type=user", headers="content-type=text/html")
Headers는 HTTP의 헤더 정보이다. 헤더명=값 형식으로 입력한다.
매핑 레벨
@RequestMapping은 메서드와 타입레벨에 사용가능한데, 두가지 위치에서 모두 사용할 경우 타입 + 메서드 형태로 결합된다.
/main/test 요청을 기준으로 살펴보자.
1 2 3 4 5 6 7 | @RequestMapping("/main") Public class MainController { @RequestMapping("/test") Public String test () {} } | cs |
/main 을 MainController 에서 받아와 test()에서 /main의 뒷부분, /test 을 처리한다.
물론, 단독 매핑도 가능하다.
1 2 3 4 5 6 7 | @Controller Public class MainController { @RequestMapping("/main/test") Public String test () {} } | cs |
클래스 레벨의 URL 패턴이 와일드카드(*)로 끝날 경우 메서드명이 사용되게 할 수도 있다.
1 2 3 4 5 6 7 8 9 10 11 | @RequestMapping("/main/*") Public class MainController { @RequestMapping Public String test () {} @RequestMapping Public String login () {} @RequestMapping Public String logout () {} } | cs |
위 코드에서는 아래와 같이 요청을 받아 처리한다.
요청 URI |
처리 메서드 |
/main/test |
test() |
/main/login |
login() |
/main/logout |
logout() |
응용을 해본다면 이런 식으로 가능할 것이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | @RequestMapping("/user/*") Public class UserController { @RequestMapping Public String create (HttpServletRequest req, String id, String pw, String name) {} @RequestMapping Public String read (HttpServletRequest req) {} @RequestMapping Public String update (HttpServletRequest req, String id, String name) {} @RequestMapping Public String delete (HttpServletRequest req, String id) {} } | cs |
user에 관련한 CRUD를 총괄하는 컨트롤러다.
만약, 새 user를 추가하게 된다면, GET 방식 기준으로 "/user/create?id=userid&pw=password&name=홍길동" 요청을 보내서 create 메서드가 데이터를 입력하는 로직을 태우고,
모든 user를 조회하려면 "/user/read" 요청을 보내 read 메서드에서 모든 정보를 조회해 응답하면된다.
업데이트와 삭제도 동일한 방식이다.
'🌱 SPRING' 카테고리의 다른 글
[SpringCloud] Resilience4j와 Spring Cloud Circuit Breaker (0) | 2021.05.16 |
---|---|
[SpringBoot] 컨트롤러, View(JSP) 작성하기 (0) | 2020.05.30 |
[SpringBoot] 스프링 부트 프로젝트 생성 (0) | 2020.05.30 |
의존관계 주입(DI, Dependency Injection) (0) | 2017.11.30 |
로그인 체크 필터 (0) | 2017.09.05 |