[Spring] @RequestParam 활용하기

반응형

@RequestParam 활용하기

 

 

  RequestParam

 Spring Controller에서 @RequestParam은 매우 유용한 기능입니다.

 

jsp를 배웠다면 request.getParameter의 기능이라고 생각하시면 됩니다.

 

requestParam은  jsp에서 보낸 request값을 효율적으로 받기 위해 사용합니다.

 

기본적인 정의입니다.

@Controller
public class TestController {


	
	//테스트 입니다.
	@RequestMapping(value="/test/Test_edit.do", method= {RequestMethod.GET})
	public String Test_edit(Model model, @RequestParam(value="mod") String mod) throws Exception {
		
        
		
		return "test/park_edit.do";
	}
}

 

@RequestMapping을 통해 Spring의 /test/Test_edit.do를 불러옵니다.

여기서, 만약 호출한 곳에서 mod값이 있을 경우 그 값은 자동으로 String mod에 담기게 됩니다.

 

호출하는 곳의 방법은 아래와 같습니다.

 <li><a href="/test/Test_edit.do?mod=I">등록하기</a></li>

jsp의 대표적인 get 방식 호출이며, mod의 값을 I로 담았을 때, Controller에서는 mod를 I로 받게 됩니다.

이제 이를 활용하여, 응용 방법을 넓히도록 하겠습니다.

 

System.out.print를 통해 결과 출력

mod의 결과는 I로 출력되었습니다.

 

 

  @RequestParam 응용하기

 @RequestParam을 통해서 웹에서의 호출을 서버가 받는 방법에 대해 이야기를 하였습니다.

만약 하나씩 받는다면, 한 개씩 작성해야 하는 불편함이 존재합니다. 이를 단순하게 해결하는 방법이 있습니다.

@Controller
public class TestController {


	
	//테스트 입니다.
	@RequestMapping(value="/test/Test_edit.do", method= {RequestMethod.GET})
	public String Test_edit(Model model, @RequestParam HashMap<String, Object> param) throws Exception {
		
        
		
		return "test/park_edit.do";
	}
}

바로 HashMap을 통해 받는 방법입니다.

이는 jsp에서 보낸 모든 request값을 HashMap의 특성인 키값과 결괏값으로 담게 됩니다.

이를 활용하여 모든 request값을 map의 key값을 통해 호출할 수 있습니다.

 

결과는 param.toString()을 통하여 담겨있는 key와 value를 모두 조회할 수 있습니다.

 

 

map은 toString을 통해 담긴 값을 모두 확인 할 수 있다.

이 방법을 활용하는 이유는 vo, bean의 사용을 줄이거나 없앨 수 있습니다.

vo의 특성인 get과 set 방식을 map이 대신하고 있기 때문입니다.

 

이 방법을 활용하여 Spring의 대표적인 mybatis에서도 hashmap을 통해 key값을 대신 삽입할 수 있게 됩니다.

결과 또한 hashmap을 통해 받아 올 수 있습니다.

 

Spring이 생각보다 HashMap에 매우 관대하여, vo의 사용을 생략하게 만들었습니다.

 

 

  requestParam의 null 생략하기

 이 과정을 본다면 requestParam은 매우 유용하나, 100% 완벽한 기술은 아닙니다.

몇 가지 잔 스킬이 필요하기도 합니다.

 

 

1. requestParam값의 null 통과 하기

@RequestParam(value="idx", required = false) int idx)

위의 requestParam은 required = false가 추가되었습니다.

만약 null 값이 넘어온다면, 위 부분에서 Error가 발생합니다.

 

이를 보안하기 위해서 null값이 넘어온다면, idx에 null을 담게 됩니다. 하지만

 

 

위 방법은 안 좋은 방법입니다.

 

2. @RequestParam은 되도록 String 타입 활용할 것.

만약 설명대로라면, null은 정상적으로 넘어오게 됩니다. 하지만 int를 활용할 경우, String 타입을 Spring에서는 int로 자동으로 형 변환을 시켜줍니다.

 

이 과정에서 null은 int로 형 변환이 안되기 때문에 Error가 발생하게 됩니다.

 

즉, null 값이 올 수 있는 상황이 있다면, int가 아닌 String 타입을 활용하는 것이 매우 좋습니다.

 

3. 아무런 속성이 없다면, value는 생략이 된다. 만약 매개변수의 변수 타입이 jsp에서 호출하는 키값과 같다면, @RequestParam의 소괄호는 생략이 가능합니다.

 

4. vo를 활용할 경우, @RequestParam 자체가 생략이 된다. 만약 bean, vo를 활용할 경우 매개변수에 vo를 입력하게 된다면 자동으로 set과 get이 형성됩니다. 이는 jsp의 beans의 기능을 대신하고 있습니다.

 

 

 

  마무리

 위의 기능을 활용하여 아래와 같은 소스가 만들어지게 됩니다.

//테스트 입니다.
@RequestMapping(value="/test/Test_edit.do", method= {RequestMethod.GET})
public String Test_edit(Model model, @RequestParam(value="mod", required = false) String mod,
@RequestParam(value="idx", required=false) String idx) throws Exception {

log.info("============/park_Edit Start ==================");

//등록하기
    if(mod == null) {
    	mod = "I";
    } else if(mod.equals("I")) {
    	mod = "I";
    }
    //수정하기
    else if(mod.equals("U")) {
    	int idx_num = Integer.parseInt(idx);
    	mod = "U";
    	HashMap<String, Object> result = parkservice.selectParkDetail(idx_num);
    }

    //TopMenu 체크하기
    model.addAttribute("topMenu", TOPMENUSELECT);
    model.addAttribute("mode", mod);

    return "test/Test_edit.do";
}

오늘 설명드린 방법을 활용하여 작성된 방법입니다.

 

오늘도 즐거운 코딩이 되길 바랍니다.

 

감사합니다.

반응형

댓글

Designed by JB FACTORY