[Java] 스프링 MVC 패턴 프로젝트 코드 개선
프로젝트 코드를 보던 중 아래 형식의 코드를 발견했다.
String param1 = (String) paramMap.get("param1");
String param2 = (String) paramMap.get("param2");
String param3 = (String) paramMap.get("param3");
String queryString = String.format("param1=%s¶m2=%s¶m3=%s", param1, param2, param3);
쿼리스트링을 포함해 특정 경로를 호출하면 쿼리스트링의 파라미터들을 맵 형식으로 받아와
(@RequestParam Map<String, Object> paramMap)
그 맵의 값들을 일일이 가져와 쿼리스트링 문자열을 만드는 코드이다.
이 쿼리스트링의 값은 모델에 담아 뷰로 페이지 이동 시 이 값을 넘기고
이전 페이지로 이동하는 버튼 클릭 시
(브라우저 뒤로가기 버튼 말고)
URL주소에 해당 쿼리스트링 값을 포함시킨 상태로 이동하여 파라미터 값을 유지하는 용도로 사용된다.
이런 코드 작성 방식이 특정 파라미터만 가져와 쿼리스트링을 만들면 문제가 안돼 보이지만,
거의 모든 페이지가 쿼리스트링을 만들 때 요청받은 모든 파라미터를
그대로 가져와 만들기 때문에 개선할 필요가 있어 보였다.
(또 무엇보다 하나씩 값을 넣어 문자열을 만들기 때문에
새 페이지를 만들어 서비스 로직을 짤 때 쿼리스트링 문자열을 만들 일이 생기면 굉장히 불편할 것 같았다.)

위 사진처럼 요청 파라미터가 담긴 Map을 쿼리스트링 문자열로 만드는 함수를 만들었다.
Map에 있는 키를 기준으로 loop를 돌려 Map의 키, 값을 가져와 문자열을 만드는 식이다.
쿼리스트링에서 파라미터가 여러 개일 경우 "&" 구분자를 통해 구분해줘야 하는데 이는
삼항 연산자를 사용하여 두번째 파라미터부터 "&"문자가 붙도록 하였다.
참고로 @RequestParam Map<String, Object> map 형태로 파라미터를 가져오면 파라미터의 순서가 뒤죽박죽일 것이다.
하지만 이 함수는 쿼리스트링 용으로 사용할 것이기 때문에 순서가 뒤바껴도
이 쿼리스트링을 받은 서버는 그대로 파라미터를 받을 것이기 때문에 상관 없을 것이다.
즉 위 함수는 파라미터 순서 상관없이 쿼리스트링 문자열을 만드는 함수이다.

위 내용을 기반으로 테스트 코드를 작성하였다.
개선되기 전의 쿼리스트링 문자열을 만드는 방식과
함수를 통해 쿼리스트링을 만드는 문자열을 비교하여 일치한지 검사하는 코드이다.
Map에 값을 넣으면 순서 상관없이 들어가기 때문에
3개의 값을 Map에 들어간 순서대로의 쿼리스트링 문자열끼리 비교하도록 하였다.

테스트 결과 성공인 것을 확인할 수 있다.
위 함수를 만든 덕에 함수에 요청 파라미터 맵만 인수로 넘기면 쿼리스트링을 만들 수 있게 되었다.