ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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
Designed by Tistory.