@Controller: 뷰를 반환하는 컨트롤러, 뷰를 찾고 뷰를 랜더링
@RestController: String을 반환, 반환값을 HTTP 메세지 바디에 바로 입력
@RequestMapping("/url-example")
@PathValiable: 리소스 경로에 식별자를 넣는 스타일
@GetMapping("/mapping/{userId}")
public String mappingPath(@PathVariable("userId") String data) {
...
}
@PathVariable의 이름과 파라미터 이름이 같으면 생략 가능하고 다중으로 사용 가능하다.
@GetMapping("/mapping/users/{userId}/orders/{orderId}")
public String mappingPath(@PathVariable String userId, @PathVariable Long
orderId) {
...
}
파라미터의 값에 따라 메서드를 실행할 수 있음
예시
@GetMapping(value = "/mapping-param", params = "mode=debug")
public String mappingParam() {
...
}
파라미터와 비슷하지만 헤더에 적용되는 매핑
@GetMapping(value = "/mapping-header", headers = "mode=debug")
public String mappingHeader() {
...
}
HTTP 요청의 Content-Type 헤더를 기반으로 매핑
@PostMapping(value = "/mapping-consume", consumes = "application/json")
public String mappingConsumes() {
...
}
HTTP 요청의 Accept 헤더 기반으로 매핑
@PostMapping(value = "/mapping-produce", produces = "text/html")
public String mappingProduces() {
...
}
애노테이션 기반의 스프링 컨트롤러가 HTTP 헤더 정보를 조회하는 방법
애노테이션 기반 컨트롤러는 다양한 파라미터를 제공하기때문에 헤더 정보 조회를 쉽게 할 수 있다.
@RequestMapping("/headers")
public String headers(HttpServletRequest request,
HttpServletResponse response,
HttpMethod httpMethod,
Locale locale,
@RequestHeader MultiValueMap<String, String>
headerMap,
@RequestHeader("host") String host,
@CookieValue(value = "myCookie", required = false)
String cookie
) {
...
}
++ MultiValueMap
MAP과 유사한데, 하나의 키에 여러 값을 받을 수 있다.
HTTP header, HTTP 쿼리 파라미터와 같이 하나의 키에 여러 값을 받을 때 사용한다.
++ @Slf4j
lombok이 제공하는 에노테이션 로그를 선언해준다. 하위 코드 자동생성
private Logger log = LoggerFactory.getLogger(getClass());
클라이언트에서 서버로 요청 데이터를 전달할 때 방법
1. Get - 쿼리 파라미터
2. Post - HTML Form
3. HTTP message body에 데이터 직접 담아서 요청(json)
사실 1, 2는 형식이 같아 구분없이 조회 가능하다. 이들을 요청 파라미터 조회라 한다.
@RequestMapping("/request-param-v2")
public String requestParamV2(
@RequestParam("username") String memberName,
@RequestParam("age") int memberAge) {
...
}
// HTTP 파라미터 이름이 변수 이름과 같으면 @RequestParam(name="xx") 생략 가능
@RequestMapping("/request-param-v3")
public String requestParamV3(
@RequestParam String username,
@RequestParam int age) {
...
}
1. required
기본값은 true이다.
만약 username이 요청파라미터에 없으면 오류가 난다. 하지만 age는 없다고 하여도 오류가 나지 않는다
하지만 이름만 넣어도(ex. ?username= ) 빈 문자로 통과가 된다.
@RequestMapping("/request-param-required")
public String requestParamRequired(
@RequestParam(required = true) String username,
@RequestParam(required = false) Integer age) {
log.info("username={}, age={}", username, age);
return "ok";
}
2. defaultValue
파라미터에 값이 없는 경우 defaultValue 를 사용하면 기본 값을 적용할 수 있다.
빈 문자에 설정한 기본 값이 적용된다.
@RequestMapping("/request-param-default")
public String requestParamDefault(
@RequestParam(defaultValue = "guest") String username,
@RequestParam(defaultValue = "-1") int age) {
log.info("username={}, age={}", username, age);
return "ok";
}
//MultiValueMap을 사용한 다중 값 가능
@RequestMapping("/request-param-map")
public String requestParamMap(@RequestParam Map<String, Object> paramMap) {
log.info("username={}, age={}", paramMap.get("username"), paramMap.get("age"));
return "ok";
}
주로 개발을 하면 요청 파라미터를 받아와 객체를 생성하고 그 객체에 값을 넣어준다.(set)
하지만 이 과정을 간단히 할 수 있다.
@ResponseBody
@RequestMapping("/model-attribute")
public String modelAttribute(@ModelAttribute HelloData helloData) {
log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
return "ok";
}
++ @Data
@Getter , @Setter , @ToString , @EqualsAndHashCode , @RequiredArgsConstructor 를
자동으로 적용해준다.
@Data
public class HelloData {
private String username;
private int age;
}
@RequestBody
@RequestBody 를 사용하면 HTTP 메시지 바디 정보를 편리하게 조회할 수 있다. 참고로 헤더 정보가
필요하거나 상태코드를 지정하고싶으면 HttpEntity 를 사용하면 된다. 헤더 정보 같은 경우는 @RequestHeader 를 사용하여도 된다.
이렇게 메시지 바디를 직접 조회하는 기능은 요청 파라미터를 조회하는 @RequestParam ,
@ModelAttribute 와는 전혀 관계가 없다.
@PostMapping("/request-body-string")
public String requestBodyString(@RequestBody String messageBody) {
log.info("messageBody={}", messageBody);
return "ok";
}
HttpEntity , @RequestBody 를 사용하면 HTTP 메시지 컨버터가 HTTP 메시지 바디의 내용을 우리가
원하는 문자나 객체 등으로 변환해준다.
문자 뿐만 아니라 JSON도 객체로 변환해준다.
@RequestBody를 생략해서는 안된다. 생략한다면 단순타입(int,String,Integer)은 @RequestParam이 적용되고 그 외는 @ModelAttribute가 적용되어버린다!
@PostMapping("/request-body-json")
public HelloData requestBodyJson(@RequestBody HelloData data) {
log.info("username={}, age={}", data.getUsername(), data.getAge());
return data;
}
서버에서 응답 데이터를 만드는 방법
@RequestMapping("/response/hello") //매핑되는 뷰 템플릿 상세 경로
public void responseViewV3(Model model) {
model.addAttribute("data", "hello!!");
}
@ResponseStatus(HttpStatus.OK) // 응답코드 설정 가능
@ResponseBody //@RestController 어노테이션 사용하면 생략가능
@GetMapping("/response-body-json")
public HelloData responseBodyJson() {
HelloData helloData = new HelloData();
helloData.setUsername("userA");
helloData.setAge(20);
return helloData; // HTTP 메세지 컨버트를 이용해 json형식으로 변환되어 리턴된다.
}
이 포스트의 대부분의 내용은 인프런의 김영한 강사님의 '스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술' 바탕으로 정리한 내용입니다.
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard