티스토리 뷰

Spring

@RequestParam과 @PathVariable?

Xion 2020. 7. 25. 13:19

컨트롤라에서 Requestparam으로 파라미터 값을 넘겨받을 때 아무 생각 없이 사용하곤 했는데, 이번 기회에

이 어노테이션에 대해 정리해 보고자 한다.

 

스프링에서는 컨트롤러로 사용할 클래스 상단에 @Controller를 지정합니다.

 

주로 사용하는 형태의 파라메터를 전달하는 경우입니다.

Case 1 ) http://xxx.x.x?index=1&page=2

Case 2 ) http://xxxx.x.x/index/1

Case 1의 경우 파라미터의 값과 이름을 함께 전달하는 방식으로 게시판 등에서 페이지 및 검색 정보를 함께 전달하는 방식을 사용할 때 많이 사용합니다.

Case 2의 경우 Rest api에서 값을 호출할 때 주로 많이 사용합니다.

 

Spring에서는 이러한 전달인자를 처리하는데 두 가지 방법을 제공합니다.

 

 

Case 1의 경우 @Requestparam을 사용하는데 해당 어노테이션에 대하여 알아봅니다!

 

| @RequestParam이란? 

 

어노테이션의 괄호 안의 경우 전달인자 이름(실제 값을 표시)

 

1.단일 파라미터 변환

@GetMapping("getDriver")
public String viewName( @RequestParam("name") String name, @RequestParam("name2") String name2){

	//위처럼 하나 이상의 타입을 적용할 수 있습니다.
  	//스플잉에서 지원하는 변환기에서 지원되는 모든타입을 변환가능합니다.
	//RequesParam은 하나 이상 파라미터에서 사용 가능합니다.

}

 

ex)  /getDriver?name="name에 담긴 value"

위의 경우 url이 전달될 때 name 파라미터(name에 담긴 value)를 받아오게 됩니다.

즉, @RequestParam("실제 값") String 설정할 변수 이름

이런식으로 표현합니다.

 

이렇게 @RequestParam의 경우 url뒤에 붙는 파라미터의 값을 가져올 때 사용합니다.

 

| 주의  !!

 

만약 RequestParam에 key값이 존재하지 않을 경우

"BadRequest 로 4**" error가 발생합니다.

 

이를 방지하고자 default 값을 설정해줍니다.

바로 "DefaultValue"를 이용하여 기본 값을 설정해줍니다.

" required=false " 속성을 꼭 명시해줘야 합니다. )

@GetMapping("getDriver")
public String viewName( @RequestParam("name",required=false,defaultValue="")
			String name, @RequestParam("name2",required="false,defaultValue="") String name2){

		//이런식으로 defaultValue를 지정하려면 required 속성을 명시해줘야 합니다.

}

required = false 속성을 명시함으로써 키값이 존재하지 않다고 해서 BadRequest가 발생하지 않게 됩니다.

그리고 존재하지 않다면 String 변수에 default로 "" 값이 들어가게 됩니다.

 

| 만약파라미터가 많아지게 되면 ?

 

파라미터가 많아지게 된다면 일일이 파라미터를 지정하는게 귀찮아 집니다.

이럴때는 Map으로 간단하게 받아올 수 있습니다.

 

여러개의 Parameter일 경우

@GetMapping("test")
public void testMethod(@RequestParam HashMap<String,String> paramMap){
	
    String data = paramMap.get("testParam");

}

위와 같이 Map을 통하여 파라미터를 컨트롤할 수 있습니다.

대규모의 파라미터를 받는데 map을 사용하면 편하지만 개발한 이외의 사람들이 유지보수 하기에는

어류운 점이 있습니다.

 

그래서 주로 " 커맨드 패턴 " 인 데이터 커맨드를 만들어서 사용합니다.

데이터 커맨드는 다음 글에 다루도록 하겠습니다.

 

| @PathVariable이란?

Type2의 URL을 처리할 때는 @PathVariable을 사용하게 됩니다.

 

@PostMapping("delete/{idx}")
@ResponseBody
public void testMethod(@PathVariable("idx") int id ){
	return testService.deleteId(id);
}

위의 예제처럼 PathVariable 의 경우 url에서 각 구분자에 들어오는 값을 처리해야 할 때 사용합니다.

 

너무나도 중요한 점 !!!


WAS같은 경우 URL에 특수문자나 구분기호 " , , ` , . " 등을 사용하면 인식을 못한다.

따라서 URL에 태우지 말고 JSON 형태로 HTTP BODY에 실어 보내야 한다 .!!

그러므로 여러개의 파라미터값을 삭제할 때 ex)1,2,3,4 이런식으로 url에 요청하면 안된다.

주의하자 !!!!

 

 

 

실제 사용은

2개다 복합적으로 사용합니다.

@GetMapping("test")
public List<Test> testMethod( @PathVariable("idx) int id, @RequestParam(value="date",required="false)
Date userDate) {



}

 

'Spring' 카테고리의 다른 글

@RequestMapping의 produces,Content-Type,Consumes란?  (1) 2020.07.25
커맨드 객체란?  (0) 2020.07.25
[Spring]ResponseEntity  (0) 2020.03.11
[Spring]@Autowired와 @AllArgsConstructor의 차이  (0) 2020.03.11
[Spring Test]-IntStream의rangeClosed  (0) 2020.03.10