티스토리 뷰

728x90

@Controller 어노테이션은 클래스레벨에서 사용되며 @Controller 어노테이션이 붙은 클래스는 SpringMVC에서 웹 요청을 처리하는 컨트롤러로 사용할 수 있다.

@RequestMapping 어노테이션은 Spring MVC 에서 클라이언트의 요청을 클래스 또는 메소드에 HTTP method를 맵핑할 때 사용하는 어노테이션이다.

@Controller
public class SampleController{

    @RequestMapping(value="/event", method=RequestMethod.GET)
    public String eventList(){
        return "event";
    }
}

간단한 컨트롤러를 만들어보았다. event 요청을 HttpMethod.Get으로 받는 eventList 메소드이다.

String[] value

value 에 사용된 문자열이 요청 URL이 된다.

value 속성에는 한가지만 들어올 수 있는것은 아니고 여러 요청 맵핑이 올 수 있다.
그럴 경우 배열로 만들면 된다.

@Controller
public class SampleController{

    @RequestMapping(value={"/event","/event2"}, method=RequestMethod.GET)
    public String eventList(){
        return "event";
    }
}

위의 요청은 event 또는 event2 라는 요청을 보내면 eventList 라는 메소드에서 다 처리한다.

RequestMethod[] method

method 속성 또한 GET 요청 말고도 POST , DELETE, PUT, PATCH 가 있다. (OPTIONS, TRACE는 써본적이없다..)

그리고 method도 value와 같이 여러개를 배열로 지정할 수 있다.

해당 RequestMethod는 org.springframework.web.bind.annotation에 enum으로 정의되어있다.

public enum RequestMethod {

    GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE

}

추가로 @RequestMapping 말고 스프링 4.3버전 이후부터는 method 속성을 사용하지 않고 @GetMapping 또는 @PostMapping으로 @DeleteMapping, @PutMapping으로 사용할 수도 있다. 각각의 어노테이션들은 HttpMethod와 매칭된다.

@Controller
public class SampleController{

    @GetMapping(value="/event")
    public String eventList(){
        return "event";
    }
}

String[] header

String[] consumes

consumes 속성은 클라이언트가 요청을 보낼 때 특정한 데이터 타입의 요청만 처리하는 속성이다.

즉 클라이언트가 요청을 할 때 content-type 헤더의 값이 일치할 때만 요청을 처리한다.

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

consumes에 MediaType.APPLICATION_JSON_VALUE 이라고 설정이 되어있다. 이 얘기는 즉슨 요청이 들어왔을 때
content-type값이 "application/json"일 때만 요청을 처리하겠다는 이야기이다.
테스트 코드로 확인

@Test
void consumesTest() throws Exception {
    mockMvc.perform(
            get("/consumes")
                    .contentType(MediaType.APPLICATION_JSON_VALUE))
            .andDo(print())
            .andExpect(status().isOk())
    ;
}

위 코드는 성공이지만 만약 content-type을 "application/json"이 아닌 다른 값으로 요청했을 경우 Http 응답코드에는 415값이 나온다.

@Test
void consumesTest() throws Exception {
    mockMvc.perform(
            get("/consumes")
                    .contentType(MediaType.TEXT_PLAIN_VALUE))
            .andDo(print())
            .andExpect(status().isOk())
    ;
}

// content-type을 "text/plain"으로 요청을 보냈을 때 아래와 같은 415 응답코드가 나온다.

MockHttpServletResponse:
           Status = 415
    Error message = null
          Headers = [Accept:"application/json"]
     Content type = null
             Body = 
    Forwarded URL = null
   Redirected URL = null
          Cookies = []

415는 Unsupported Media Type (지원되지 않는 미디어타입 형식이다.)

명확하고 직관적이다.

String[] produces

produces 속성은 consumes와 반대로 클라이언트가 요청을 보냈을 때 특정한 데이터 타입으로 응답하겠다는 속성이다.

즉 클라이언트가 요청을 할 때 accept 헤더의 값이 일치할 때만 요청을 처리한다.

accept 헤더는 클라이언트가 요청을 보낼 때 accept한 값으로 받고 싶어요 라는 형식이다.

예를들어 accept:"application/json" 으로 보내면  서버에게 JSON 형식으로 받고싶어요 라는 의미이다.

content-type : "application/json" 이면 클라이언트가 서버에게 JSON 형식으로 보냅니다~라고 알려주는 의미이다.

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

produces 속성을 사용한 요청맵핑 메소드를 만들고 테스트 코드를 작성해본다.

@Test
void producesTest() throws Exception {
    mockMvc.perform(
            get("/produces")
                    .accept(MediaType.APPLICATION_JSON_VALUE))
            .andDo(print())
            .andExpect(status().isOk())
    ;
}

accept에 MediaType.APPLICATION_JSON_VALUE 으로 요청을 보낸다. JSON형식으로 받고싶다는 의미이다.

만약 accept 형식이 없으면 어떻게될까?

@Test
void producesTest() throws Exception {
    mockMvc.perform(
            get("/produces"))
            .andDo(print())
            .andExpect(status().isOk())
    ;
}

테스트가 통과하지 못할 것 같지만 실행해보면 테스트가 성공한다.

accept가 없을 경우 그냥 아무 형식이나 상관없으니까 리턴해주세요~ 라는 말이기 때문에 그냥 서버에서 알아서 내려줄것이다.

우리가 식당에가서 아무 음식이나 주세요~ 하면 식당 주인이 돈가스를 내놓든 라면을 내놓든 알아서 줄 것이기 때문이다.

그러나 accept를 명시해줬을 때는 테스트가 통과하지 못한다.

@Test
void producesTest() throws Exception {
    mockMvc.perform(
            get("/produces")
                    .accept(MediaType.TEXT_PLAIN_VALUE))
            .andDo(print())
            .andExpect(status().isOk())
    ;
}

//request
MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /produces
       Parameters = {}
          Headers = [Accept:"text/plain"]
             Body = null
    Session Attrs = {}

//response
MockHttpServletResponse:
           Status = 406
    Error message = null
          Headers = []
     Content type = null
             Body = 
    Forwarded URL = null
   Redirected URL = null
          Cookies = []

서버에는 JSON 으로 응답하고자 하는데 text/plain 형식으로 달라고 요청을하면 Http 응답코드 406을 내뱉는다.

406은 Not Acceptable 이다. 

즉 produces는 Accept header가 produces에 명시한 MediaType과 같을 때에 해당 type으로 응답을 보내준다.

참고

https://www.inflearn.com/course/%EC%9B%B9-mvc?inst=ccbe720b

 

스프링 웹 MVC - 인프런

이 강좌는 자바 서블릿(Servlet) 기반의 MVC 프레임워크인 스프링 웹 MVC(이하 스프링 MVC)에 대해 학습합니다. 중급이상 웹 개발 프레임워크 및 라이브러리 서버 개발 Java Spring MVC Back-End 온라인 강의

www.inflearn.com

 

728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함