[Spring Boot] @RequestParam, @PathVariable 어노테이션, @PathVariable Optional Check

@RequestParam, @PathVariable는 모두 클라이언트가 호출한 URL의 파라메터를 받아서 처리하는 어노테이션이다.
해당 어노테이션들은 필요에 따라 각각 따로 사용하기도, 혼합하여 사용하기도 한다.

@RequestParam

@RequestParam은 아래 처럼 파라메터에 key=value 형식으로 전달될 때 값들을 1:1 맵핑할 때 사용된다.
즉 1개의 HTTP 파라메터를 얻기 위해 사용된다.

요청 : http://localhost/example?id=abc&name=song

    @RestController
    @RequestMapping("/example")
    public class exampleController {
  	
    	@GetMapping("/")
    	public String myFormatter(@RequestParam("id") String id, @RequestParam("name") String name) {

    		return id+name;
    	}
    }

위처럼 개별 파라메터를 받아와 컨트롤러에서 처리할 수 있다. 하지만, 호출한 요청 중에서 @RequestParam으로 지정하지 않은 키값이 존재한다면 http 4XX 에러 (BadRequest)를 발생한다.
이를 방지하기 위해 required 설정과 Default Value를 지정할 수 있다.
required=false로 지정되면 필수값이 아니어도 되고, Default값을 설정하면 해당 값이 디폴트로 설정된다.

@RestController
    @RequestMapping("/example")
    public class exampleController {
  	
    	@GetMapping("/")
    	public String myFormatter(@RequestParam(value="id", required=false, defaultValue="123') String id, @RequestParam("name") String name) {

    		return id+name;
    	}
    }

이 밖에도, 일일이 파라메터를 지정하기 힘들 때는 Map을 파라메터로 사용하여 한번에 받아올 수도 있지만 이는 지향하는 방식은 아니다. 객체를 사용하는 방식(모델 클래스를 통한 매칭)이 지향되는 방식이다.




@PathVariable

@PathVariable은 아래와 같은 요청에서 호출한 url에서 각 구분자에 들어오는 값을 처리할 때 사용한다. 즉, URI의 일부를 변수로 전달하여 사용할 수 있는 것이다.

요청 : http://localhost/example/song

    @RestController
    @RequestMapping("/example")
    public class exampleController {
  	
    	@GetMapping("/{id}")
    	public String myFormatter(@PathVariable("id") String id) {

    		return id;
    	}
    }

Optional

@PathVariable는 URL에 생략하여 호출할 시 404 Not Found 에러를 뱉는다. 생략을 허용하려면 아래와 같이 생략된 엔드폰인트 URI를 추가하여 사용할 수 있고, Optional을 사용하여 이를 활용할 수 있다.

Optional은 JAVA8에서 추가되었으며, NullpointException문제를 해결하는 방법을 제공한다.
Spring 4.1버전 이상에서는 @RequestParam, @PathVariable, @RequestHeader 그리고 @MatrixVariable에서 Optional을 지원한다.

import java.util.Optional;

    @RestController
    @RequestMapping("/example")
    public class exampleController {
  	
    	@GetMapping(value = {"/", "/{id"}) // @PathVariable 생략을 허용하기 위한 분기
    	public String myFormatter(@PathVariable("id") Optional<String> id) { // Optional 사용

        	if(id.isPresent()) {
			System.out.println(id);
		}else {
			System.out.println("No id");
		}
	
    	return "Y";
    	}
    }

좋은 웹페이지 즐겨찾기