ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 요청 맵핑하기 (스프링 MVC - 4)
    Programming/Spring MVC 2020. 3. 24. 00:23
    728x90

     

    1. HTTP Method

     

    @ReqeustMapping

    @GetMapping

    @PostMapping

    @Controller
    public class SampleController {
    
        @RequestMapping(value = "/hello", method = {RequestMethod.GET, RequestMethod.POST})
        public @ResponseBody String hello() {
            return "hello";
        }
    }
    

     

    GET

    - 클라이언트가 서버의 리소스를 요청할 때 사용

    - 캐싱할 수 있다. (조건적인 GET으로 바뀔 수 있다)

    - 브라우저 기록에 남는다

    - 북마크 할 수 있다

    - 민감한 데이터를 보낼 때 URL에 보이니까 사용하면 안됨

    - idemponent (동일한 GET 요청이면 모두 동일한 응답을 받아야 함)

     

    POST

    - 클라이언트가 서버의 리소스를 수정하거나 새로 만들 때 사용

    - 서버에 보내는 데이터를 POST 요청 본문에 담는다.

    - 캐시할 수 없다.

    - 브라우저 기록에 남지 않는다.

    - 북마크 할 수 없다.

    - 데이터 길이 제한이 없다.

     

    PUT

    - URL에 해당하는 데이터를 새로 만들거나 수정할 때 사용

    - POST와 다른 점은 URL에 대한 의미가 다름

       = POST의 URL은 보내는 데이터를 처리할 리소스를 지칭

       = PUT의 URL는 보내는 데이터에 해당하는 리소스를 지칭

    - idemponent

     

    PATCH

    - PUT과 미슷하지만, 기존 엔티티와 새 데이터의 차이점만 보낸다는 차이가 있다.

    - idemponent

     

    DELETE

    - URI에 해당하는 리소스를 삭제할 때 사용

    - idemponent

     

     

    2. URI 패턴

     

    - 여러 URI 받기

    @Controller
    public class SampleController {
    
        @GetMapping({"/hello", "/hi"})
        public @ResponseBody String hello() {
            return "hello";
        }
    }
    

     

    - 요청 식별자로 맵핑하기

    "/hello/~"

    ? : 한 글자 (/hello/1)

    * : 여러 글자 (/hello/hongchan)

    ** : 여러 패스 (/hello/hongchan/jiyun)

     

    - 클래스에 선언한 @RequestMapping과 조합 + 정규 표현식으로 맵핑

    @Controller
    @RequestMapping("/hello")
    public class SampleController {
    
        @RequestMapping("/{name}")
        public @ResponseBody String hello(@PathVariable String name) {
            return "hello " + name;
        }
    }
    

     

    URI 확장자 맵핑 지원

    - "/hello" -> {"/hello" , "/hello.*"}

    - 스프링 부트에서는 RFD Attack 등의 보안 이슈로 지원하지 않음

     

     

    3. 컨텐츠 타입 맵핑

     

    - content type이 json일 때만 맵핑

    @Controller
    public class SampleController {
    
        @GetMapping(value = "/hello", consumes = MediaType.APPLICATION_JSON_VALUE)
        public @ResponseBody String hello() {
            return "hello";
        }
    }
    

     

    - json을 원하는 요청(accept 헤더)만 맵핑 <accept 헤더가 없는 경우 (모든 것을 받겠다)에도 맵핑됨>

    @Controller
    public class SampleController {
    
        @GetMapping(value = "/hello", produces = MediaType.APPLICATION_JSON_VALUE)
        public @ResponseBody String hello() {
            return "hello";
        }
    }
    

     

    클래스에 선언한 @RequestMapping에 사용한 것과 조합이 되지 않고 메소드에 사용한 @ReqeustMapping의 설정으로 덮어씀 (Override)

     

     

    4. 헤더와 파라미터 맵핑

     

    @Controller
    public class SampleController {
    /*
        @GetMapping(value = "/hello", headers = HttpHeaders.FROM)
        @GetMapping(value = "/hello", headers = "!" + HttpHeaders.FROM)
        @GetMapping(value = "/hello", headers = HttpHeaders.FROM + "=" + "111")
        @GetMapping(value = "/hello", params = "name")
        @GetMapping(value = "/hello", params = "name=spring")
    */
        public @ResponseBody String hello() {
            return "hello";
        }
    }
    

     

     

    5. HEAD와 OPTIONS

    우리가 구현하지 않아도 스프링 웹 MVC에서 자동으로 처리함

     

    HEAD

    - GET 요청과 동일하지만, 응답 body에 값을 넣지 않음

     

    OPTIONS

    - 사용할 수 있는 HTTP Method 제공

    - 서버는 Allow 응답 헤더에 사용할 수 있는 HTTP Method 목록을 제공해야 함

    {Allow:"GET,HEAD,OPTIONS"}

     

     

    6. 커스텀 애노테이션

     

    메타 애노테이션

    - 애노테이션에 사용할 수 있는 애노테이션

     

    조합 애노테이션

    - 한 개 혹은 여러 메타 애노테이션을 조합해서 만든 애노테이션

    - 코드를 간결하게 줄일 수 있다

    - 보다 구체적인 의미 부여 가능

     

    @Retention

    - 해당 애노테이션 정보를 언제까지 유지할 것인가 (Source, Class, Runtime)

     

    @Target

    - 해당 애노테이션을 어디에 사용할 수 있는지 결정

     

    @Documented

    - 해당 애노테이션을 사용한 코드의 문서에 그 애노테이션에 대한 정보를 표기할지 결정

     

     

    - GetHelloMapping 애노테이션 작성

    @Documented
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public @interface GetHelloMapping {
    }
    

     

    - 컨트롤러 작성

    @Controller
    public class SampleController {
    
        @GetHelloMapping
        public @ResponseBody String hello() {
            return "new annotation mapping";
        }
    }
    

     

     

     

    인프런 백기선님 '스프링 MVC’ 강의를 듣고 정리한 내용입니다.
    728x90

    댓글

Designed by Tistory.