요청매핑

김남연·2025년 8월 15일

SpringMVC

목록 보기
3/8

@RequestMapping(value, method)

Spring MVC에서 HTTP요청을 어떤 메서드, 클래스에 매핑할지 지정한다
클래스 레벨에서는 공통 URL 경로를 지정 (prefix)
메서드 레벨에서는 실제 요청 처리를 매핑

@Controller
@RequestMapping("/uesrs")
public class UserController {
	@RequestMapping(name = "/list", method=requestMethod.GET)
    public String listUsers() {
    	return "userList";
    }
}

/users/list로 get요청이 오면 listUsers()를 실행하여 userList 뷰 템플릿으로 렌더링

축약 애노테이션

@GetMapping(), @PostMapping(), @PutMapping(), @DeleteMapping(), @PatchMapping()으로 HTTP메서드를 축약

@PathVariable

@ResponseBody
@GetMapping("/mapping/{userId}")
public String mappingPath(@PathVarible("userId")String data) {
	log.info("mappingPath userId = {}, data);
    return "ok";
}

@PathVariable을 사용하면 매칭되는 부분을 편리하게 조회할 수 있다
@PathVariable의 이름과 파라미터 이름이 같으면 생략할 수 있다(String data -> String userID)

HTTP요청파라미터(@RequestParam) - 쿼리파라미터,HTML Form

request.getParameter(paramName)으로 조회할 수 있다
@RequestParam을 사용하면 더욱 편리하게 요청파라미터를 사용할 수 있다

@ResponseBody
@RequestMapping("/request-param-v2")
public String requestParamV2(
	@RequestParam("username") String memberName,
    @RequestParam("age") int memberAge) {
    
    log.info("username = {}, age = {}, memberName, memberAge);
    return "ok";
}

쿼리파라미터의 값은 String으로 넘어오지만 Spring에서 자동으로 타입변환을 한다
(String age -> int age)

String, int, Integer등의 단순 타입이라면 @RequestParam또한 생략이 가능하다
(@RequestParam("username")String memberName -> String username)

@RequestParam(required = false)
-> 기본값은 true, false인 경우 해당값이 없으면 null. true인 경우에 없으면 예외 발생
/request-param-required?username과 같이 파라미터 이름만 있는경우 빈문자로 통과 ""

@RequestParamMap

@ResponseBody
@RequestMapping("/request-param-map")
public String requestParamMap(@RequestParamMap<String,Object> paramMap) {
	log.info("username = {}, userage = {}, paramMap.get("username"),paramMap.get("age"));
    return "ok";
}

@RequestParamMap에 파라미터값들을 담아서 사용할 수도 있다

@ModelAttribute

요청파라미터를 받아서 뷰에 렌더링할 때 필요한 객체를 만들고 값을 넣어주어야한다. 이때 @ModelAttribute를 사용한다

@Getter
@Setter
public class HelloData {
	private String username;
    private int age;
}

요청 파라미터를 바인딩할 객체를 만든다

@ResponseBody
@RequestMapping("/model-attribute-v1")
public String modelAttributeV1(@ModelAttribute HelloData helloData) {
	log.info("username = {}, age = {}", helloData.getUsername(), helloData.getUserage());
    return "ok";
}

@ModelAttribute는 HelloData 객체를 생성하고 요청 파라미터의 이름으로 HelloData 객체의 프로퍼티를 찾는다. 그리고 해당 프로퍼티의 setter를 호출해서 값을 바인딩한다.

@ModelAttribute 또한 생략이 가능하다.
@RequestParam과의 차이점은 @RequestParam은 String, int 같은 단순한 타입이고 @ModelAttribute는 그 외의 나머지를 바인딩한다

Http API

- HttpEntity
Http header, body 정보를 함께 담음
컨트롤러 파라미터로 받아 요청 헤더+바디를 함께 읽을 때 사용
컨트롤러 반환값으로 응답 헤더+바디를 간단히 지정

- ReqeustBody

@ResponseBody
@PostMapping("/request-body-json)
public String reqeustBodyJson(@RequestBody HelloData data){
	log.info("username = {}, age = {}", data.getUserName(), data.getAge());
    return "ok";
}

Http 요청 바디를 객체로 바인딩한다 (JSON -> DTO로 자동 변환)
JSON 요청 -> HTTP 메시지 컨버터 -> 객체 바인딩
PathVariable, RequestParam, ModelAttribute와 달리 생략이 불가능하다.(Model에 담아버리기 때문)

- ResponseBody

@ResponseBody
@PostMapping("/request-body-json")
public HelloData requestBodyJson(@RequestBody HelloData data) {
	log.info("username = {}, age = {]", data.getUsername(), data.getAge());
    return data;
}

view에 반환하지 않고 메시지 바디 정보를 직접 담아 반환한다
객체 -> HTTP 메시지 컨버터 -> JSON 응답

0개의 댓글