본문 바로가기

Programing/JVM(Java, Kotlin)

스프링에서 요청파라메터 처리하기

서블릿에 보면 HttpServletRequest를 통해 요청에 대한 여러 정보를 가져올 수 있다.

어떤 정보를 포함하는지는 HTTP 프로토콜에 대해 이해를 하고 있다면 쉽게 짐작할 수 있다.

(혹시 모른다면 RFC 2616을 참고, 영문의 스압에 구토가 난다면 한글을 번역해 놓은 곳도 있으니 => http://aamyaa.egloos.com/category/HTTP%201.1/list/2 로)


웹 페이지 개발을 하다보면 폼에 의한 사용자 조작을 Java 코드로 받아올 일이 생기게 된다.


서블릿을 사용한다면 HttpServletRequest의 (사실 ServletRequest에서 정의) getParameter 메소드를 이용했을 것이다.

 ServletRequest <- HttpServletRequest 구조이다.(인터페이스의 상속)

public interface HttpServletRequest extends ServletRequest

사례)

안모 후배의 코드를 어깨너머로 보고 있으니 다음과 같았다.


request 객체에서 파라메터를 가져오고, 기본 값으로 빈 문자열을 넣어주는 부분이 가득 차고 넘쳤다.


게다가 ModelAndView로 map을 넘기는데,

String groupIdFlag = req.getParameter("groupIdFlag")==null?"off" :req.getParameter("groupIdFlag");

map.put("groupIdFlag", groupIdFlag);

를 한 줄로

String groupIdFlag = req.getParameter("groupIdFlag")==null?"off" :req.getParameter("groupIdFlag"); map.put("groupIdFlag", groupIdFlag);

열심히 손 편집을 하고 있었다.


뭔가 딱한 마음이 들어 짝 프로그래밍을 했다.

리팩토링하고 난 결과는 아래와 같다.



extract method 리팩토링 기법을 사용했는데, processParameter라는 메소드를 만들어서 기능을 뺀 것이다.

private String processParameter(HttpServletRequest request, String parameterName, String defaultValue, HashMap<String,String> map)

{

       String parameterCandidate = request.getParameter(parameterName);

       String parameterSelected = (parameterCandidate == null) ? defaultValue : parameterCandidate;

       if (map != null) {

             map.put(parameterName, parameterSelected);

       }

       return parameterSelected;

}

반복적으로 컨트롤러 본체에 들어있는 로직이 빠지면서 가로 길이가 줄어 들었다.


앞에 두 이미지에 보면 세로로 선이 있는데 컬럼 80을 보여주는 선(Window > Preferences > General > Editors > Text Editors : [ ] Show print marging에 체크)인데,  이전에는 선을 넘어 횡 스크롤을 해야 했지만 이제는 스크롤 할 필요가 없어졌다.


하지만 이것은 리팩토링을 보여주기 위함이고 실제 스프링을 사용하고 있다면 이렇게 손수 파라메터 처리해주는 것을 작성할 필요가 없다. @RequestParam으로 동일한 기능을 할 수 있기 때문이다.


샘플)

      @RequestMapping(value = "/loginProcess.do", method = RequestMethod.POST)

public ModelAndView login(

HttpServletRequest request,

@RequestParam("id") String id,

@RequestParam("password") String password) {

 

Account account = (Account) loginService.authenticate(id,password);

...


login이라는 메소드에 보면 가 있음을 알 수 있다.

그냥 문자열 하나면 넘기면 getParameter의 키로 사용이 된다.

세부적인 사용은 아래와 같이 프로퍼티를 지정해 줌으로서 할 수 있다.


@RequestParam(value = "status", required = false, defaultValue = "STATUS")



참고:

 http://renzizzang.tistory.com/entry/Spring-Framework-5-Annotation-based-Controller

 http://docs.spring.io/spring/docs/3.2.x/javadoc-api/org/springframework/web/bind/annotation/RequestParam.html