Spring으로 Request에 담긴 데이터 다루기

dev_314·2023년 3월 14일
0

Spring - Trial and Error

목록 보기
3/7

사용자가 전달하는 데이터를 다뤄보자.

@RequestParam, @ModelAttribute

요청 파라미터를 다루기 위해 사용한다.

요청 파라미터
    1. GET 메서드의 Query String
    2. Form으로 전달하는 데이터 (application/x-www-form-urlencoded)
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {

    @GetMapping("/requestParam")
    public String requestParam(
    	@RequestParam(name = "name") String name, 
        @RequestParam int age
	) {
        return name + " " + age;
    }
    
    @PostMapping("/modelAttribute")
    public String modelAttribute(
    	@ModelAttribute Info info
	) {
        return info.getName() + " " + info.getAge();
    }
    
    static class Info {
    	private String name;
        private int age;
        
        public Info(String name, int age) {
        	this.name = name;
            this.age = age;
        }
        
        ... Getter ...
    }
}
  1. @RequestParam, @ModelAttribute에 매핑할 데이터의 이름을 명시할 수 있다. 그런데 파라미터 이름과 같은 경우 생략할 수 있다.

  2. 더 나아가 Annotation도 생략할 수 있다. 그 때는 다음의 규칙을 따른다.

    1. int, Integer, String 처럼 단순한(?) 타입인 경우, @RequestParam이 적용된다.
    2. 그 외의 경우 @ModelAttribute가 적용된다.
  3. 아래 예시처럼 age필드에 숫자가 아닌 문자열이 입력되면

    localhost:8080/test?name=abc&age=abc
    1. 컨버터팅 과정에서 예외가 터지고
    2. 이를 DefaultHandlerExceptionResolver가 처리한다.
    3. 결과적으로 사용자는 400 BAD REQUEST 응답을 받게 된다.
  4. @ModelAttributeHttpMessageConverter가 아닌, ModelAttributeMethodProcessor에서 만든다.

    1. DispatchServlet의 doDispatch가 호출되면, 내부적으로 Adapter를 통해 Handler(Controller)를 호출한다.
    2. Handler가@ModelAttribute를 사용함을 확인하면 ModelAttributeMethodProcessor를 통해 적합한 ModelAttribute 객체를 만든다.

@ModelAttribute의 Getter, Setter, Constructor

@ModelAttribute를 통해 만들 객체에 Setter가 있는지, Constructor가 어떤지에 따라 결과가 다르다.

필드는 전부 private인 상황
조건결과
Getter X
Setter X
All Args Constructor X
name: null, age: null
Getter O
Setter X
All Args Constructor X
name: null, age: null
Getter X
Setter X
All Args Constructor O
name: name#1, age: 10
Getter X
Setter O
All Args Constructor X
name: name#1, age: 10
Name만 Setter 만듦name: name#1, age: null
Name만 Constructor로 값 할당name: name#1, age: null
  • 값이 정상적으로 설정되려면, Setter든 Constructor든 값을 할당할 방법을 제공해야 한다.( public인 경우에도)

@PathVariable

  • URL에 포함된 Path Variable을 추출(?)하기 위한 방법
import org.springframework.web.bind.annotation.PathVariable;

@RestController
public class MyController {

    @GetMapping("/path-variable/{id}/{name}")
    public String pathVariable(
    	@PathVariable(name = "id") Integer id, 			
        @PathVariable String name
	) {
        return name + " " + id;
    }
}

@RequestParam과 마찬가지로 컨버팅을 실패하면 400응답이 나간다.
@PathVariable@RequestParam을 같이 사용할 수 있다. (같이 사용할 경우가 있을지는 모르겠다)

@RequsetBody

Message Body를 객체로 만들기 위해 사용한다.

profile
블로그 이전했습니다 https://dev314.tistory.com/

0개의 댓글