-
Spring MVC(매핑정리)웹개발/Spring 2020. 7. 26. 13:30
이 내용은 인프런의 스프링 웹 MVC강좌를 참고하여 만들었습니다.
1, @Controller와 @RestController의 차이
- 둘 다 요청을 매핑을 하는 컨트롤러 이지만 응답을 할 때에는 View를 반환하기도 하도 직접 데이터를 반환할 때도 있기도 하다.
-@Controller가 있는 클래스에서는 매핑을 한 메소드에 @ResponseBody를 붙히면 데이터가 반환이 되고 매핑만 있을 시에는 뷰가 반환이 된다.
-@RestController는 자동적으로 @ResponseBody가 메도드네 붙혀져 있어서 데이터가 반환이 된다.
2, Mapping요청방법
- HTTP 요청을 매핑하는 여러가지 방법
1) @GetMapping
2) @PostMapping
3) @PutMapping
4) @DeleteMapping
...
이 밖에도 @RequestMapping을 통하여도 매핑을 할 수 있다
@RequestMapping(values = "/hello" , method = {RequestMethod.GET, RequestMethod.PUT})
- GET요청
- 입력한 데이터를 URL에 붙혀서 전송을 한다 -> 데이터가 다 보임으로 취약
- 전송할 수 있는 데이터는 256바이트를 넘기지 못한다.
- 캐싱을 할 수 있다.
- 동일한 get요청은 항상 동일한 응답을 보내야 한다.
- POST요청
- 입력한 데이터를 본분안에 포함해서 전송(URL에 대이터가 보이지 않음으로 GET보다 보안에 우수)
- 전송할 수 있는 데이터 길이의 제한이 없다.
- 복잡한 형태의 데이터를 보낼 수 있다.
- 캐시할 수 없다
- 동일한 post요청이라도 다른 응답을 보낼 수 있다.
- PUT요청
- URI에 해당하는 데이터를 새로 만들거나 수정할 때 사용
- URI에 보내는 데이터에 해당하는 리소스를 지칭하고 post같은 경우에는 처리할 리소스를 지칭
- 동일한 put요청은 동일한 응답을 보낸다.
- PATCH요청
- URI에서 자원의 일부를 업데이트
- 기존 엔티티와 새 데이터만 보냄
- 동일한 patch요청은 동일한 응답을 보낸다.
-DELETE요청
- URI에 해당하는 리소스를 삭제할 때 사용한다.
- 동일한 delete요청은 동일한 응답을 보낸다.
3, 매핑방식
- 한글자를 매핑 : /?
- 여러글자를 매핑: /*
- 여러 경로를 매핑: /**
@Controller public class Testcontroller { @GetMapping("/events") @ResponseBody public String test1() { return "test1"; } @GetMapping("/events/*") @ResponseBody public String test2() { return "test2"; } @GetMapping("/events/**") @ResponseBody public String test3() { return "test3"; } }
- 인자로 매핑이 가능하고 정규식 표현도 가능하다.
@Controller public class Testcontroller { @GetMapping("/events/{id}") @ResponseBody public String test3(@PathVariable int id) { return "test3"; } @GetMapping("/{name:[a-z]+}") @ResponseBody public String test3_1(@PathVariable String name) { return "test3_1"; } }
- URI확장자 매핑 지원은 스프링 윕MVC에서는 지원하지만 스프링 부트에서는 지원하지 않음
(RFD Attack이슈 때문)
4, 미디어 타입 매핑하기
- @RequestMapping의consumes와 produce파라미터를 이용
- consumes : 받아올 요청의 종류
- produces : 응답을 할 미디어의 종류
@Controller public class Testcontroller { @RequestMapping( value = "/events/*", method = RequestMethod.DELETE, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE ) @ResponseBody public String test4(){ return "test4"; } @RequestMapping( value = "/events/*", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE ) @ResponseBody public String test5(){ return "test5"; } }
- "!"(not)을 파라미터 값에 앞에 붙혀서 아닌 것을 처리하게끔 할 수도 있음
5, 헤더와 매개변수 처리
- @RequestMapping에서 headers 와 params 파라미터로 처리
- 필터링의 역활을 함
- hearders인자
1) 특정한 헤더를 처리
2) 특정한 헤더가 없는 요청을 처리
3) 특정한 헤더의 키-값 형태로 처리
@Controller public class Testcontroller { @GetMapping(value = "/events", headers = HttpHeaders.FROM) @ResponseBody public String test1(){ return "test1"; } @GetMapping(value = "/events", headers = "!" + HttpHeaders.FROM) @ResponseBody public String test2(){ return "test2"; } @GetMapping(value = "/events", headers = HttpHeaders.AUTHORIZATION + "=" + "111") @ResponseBody public String test3(){ return "test3"; } }
테스트 검사
@RunWith(SpringRunner.class) @WebMvcTest public class TestcontrollerTest { @Autowired MockMvc mockMvc; @Test public void EventTest1() throws Exception{ mockMvc.perform(get("/events") .header(HttpHeaders.FROM,"localhost")) .andDo(print()) .andExpect(status().isOk()) .andExpect(content().string("test1")) ; } @Test public void EventTest2() throws Exception{ mockMvc.perform(get("/events") .header(HttpHeaders.AUTHORIZATION,"localhost")) .andDo(print()) .andExpect(status().isOk()) .andExpect(content().string("test2")) ; } @Test public void EventTest3() throws Exception{ mockMvc.perform(get("/events") .header(HttpHeaders.AUTHORIZATION,"111")) .andDo(print()) .andExpect(status().isOk()) ; } }
6, HEAD와 OPTIONS
- 스프링 웹MVC에서 자동적으로 처리하는 http메소드
head : get과 동일하나 응답 본문은 안받아오고 응답 헤더만 받아온다.
options : 사용 할 수 있는 메소드들의 종류를 제공(get,post...)
allow응답 헤더에 사용 할 수 있는 http 메소드들을 담아서 줌
@Controller public class Testcontroller { @GetMapping(value = "/events") @ResponseBody public String test1(){ return "test1"; } @PostMapping(value = "/events") @ResponseBody public String test2(){ return "test2"; } }
테스트 검사
@RunWith(SpringRunner.class) @WebMvcTest public class TestcontrollerTest { @Autowired MockMvc mockMvc; @Test public void helloTest() throws Exception { mockMvc.perform( options("/events") ) .andDo(print()) .andExpect(status().isOk()) .andExpect(header().stringValues(HttpHeaders.ALLOW,hasItems(containsString("GET") ,containsString("POST"),containsString("HEAD"),containsString("OPTIONS")))) ; } }
7,Annotaion 만들기
- @Document : 어노테이션을 만들면 문서화를 함
- @Target : 어느 곳에서 사용 할 수 있는지 정의(메소드...)
- @Retension : 어노테이션을 얼마만큼 유지 할 수 있는지
...
다음과 같은 방법의로 정의
@Documented @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @RequestMapping(method = RequestMethod.GET, value = "/hello") public @interface GetHelloMapping { }
'웹개발 > Spring' 카테고리의 다른 글
Spring MVC(폼 서블릿 오류 해결) (0) 2020.07.28 Spring MVC(@ModelAttribute, @Valid, @Validated) (0) 2020.07.28 Spring MVC(html과의 매핑) (0) 2020.07.28 Spring MVC(요청 매개변수) (0) 2020.07.26 Spring MVC(URI 패턴) (0) 2020.07.26