티스토리 뷰
@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
- Total
- Today
- Yesterday
- oracle
- maven
- Java
- 오라클
- springboot
- input
- JavaScript
- Linux
- localtime
- window
- Spring Security
- mybatis config
- 북리뷰
- intellij
- svn
- LocalDateTime
- 베리 심플
- elasticsearch
- k8s
- jQuery
- docker
- mybatis
- Spring
- LocalDate
- config-location
- rocky
- Mac
- Github Status
- Kotlin
- Bash tab
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |