2021-02-22 TIL(at work)

업데이트:
2 분 소요

요청 사항 파악

  • 특정 데이터를 입력하면 그 값을 이용하여 또 다른 값을 자동으로 계산해주는 서비스가 있다. 그런데 자동으로 계산된 결과가 음수일 경우, 자동계산 직후에는 음수가 출력되지만 데이터를 저장후 조회해 보면 절댓값이 조회되는 상황이다.

에러 원인 분석

  • 우선 해당 값이 DB에는 어떻게 저장되는지 확인해본 결과, 계산값이 음수가 나오더라도 DB에는 절댓값이 저장되고 있음을 확인했다. 따라서 저장 버튼을 누르고 난 후 다시 그 페이지를 조회하면, 저장되어있던 값이 select되기 때문에 절댓값이 노출되는 것이다.

해결 방안 탐색

  • xxx.vue 파일에서 해당 값을 특정 형식으로 마스킹하고 있는데, 이때 값이 잘못 마스킹되고 있는지 확인해볼 필요가 있다.
  • 파라미터로 값을 넘기는 js코드를 확인하고, 또한 이를 받는 java 코드를 확인하면서, 값이 잘 넘어가는지 확인한다.
  • 파라미터로 넘어온 값이 원하는 값이라면, 저장되는 과정에서 어떤 코드가 작성되었는지 확인하고, DB에 저장되는 과정에서 잘못된 점이 없는지 파악한다.

해결 과정

1번째 시도

  • 잘못 저장되고 있던 해당 값은, jQuery의 플러그인 중 하나인 maskMoney로 값을 마스킹하고 있었다. 따라서 maskMoney라는 플러그인에 대해 찾아보았는데, alloNegative라는 속성이 존재한다는 것을 발견했다.allowNegativefalse가 디폴트이고, 음수 값을 마스킹하려면 true로 속성 값을 변경해야 한다는 글들을 보아, maskMoney가 정의된 코드를 찾아 allowNegative : true라는 코드를 추가하였다.
  • 결론 : 실패, 자동계산 직후에는 음수 값이 잘 노출되고 값을 저장하고 난 후 조회할 때 절댓값으로 조회되는 상황이기 때문에 마스킹의 문제는 아니었다.

2번째 시도

  • 일단 DB의 값까지 건드리기는 조금 로직이 복잡할 것 같아서, 일단 화면만 음수로 출력되도록 코드를 수정했다. 마스킹을 하는 코드는 그대로 두되, xxx.vue 파일에서 자동계산 값이 음수인지 확인하여 음수이면 -를 붙이도록 코드를 수정했다.
  • 파라미터로 값이 잘 넘어오는지 확인했다. 컨트롤러로 파라미터를 넘길 때 Map<String, String> paramMap을 이용해서 넘기고 있었기 때문에, 잘못 저장되고 있는 해당 값이 파라미터로 넘어올 때는 어떻게 넘어오는지 출력문을 통해 확인해 보았다. 아래와 같은 코드를 컨트롤러에 추가하여 실행해본 결과, 파라미터로는 원하는 값이 아주 잘 넘어오고 있음을 확인했다.
System.out.println(paramMap.get("parameter")); // -123,345,123 와 같이 값이 넘어옴
  • paramMap에 담겨 넘어오던 값들은 또다시 특정 키값으로 매칭되어 Map<String, String> dataMap에 담겨 DB에 저장되도록 코드가 작성되어 있었다. 따라서 해당 값이 저장되는 코드 부근을 유심히 살펴보았는데, 외부 라이브러리의 다양한 메서드들이 체이닝되어 있어 단번에 알아보기가 힘들었다.
  • 파라미터값의 형식을 바꾸는 여러 메서드 중 주목할 만한 부분이 있었다. 아래 코드에서 replaceAll("[^0-9]","")이다. 특히 괄호 안의 "[^0-9]" 이 부분 정규식이라 불리는데, 이와 관련하여 찾아보았고, replaceAll("[^0-9]","") 코드에서 숫자를 마스킹했던 ,-가 빠지고 0부터 9까지의 숫자만 남기 때문에 어떤 값이 파라미터로 넘어오든 절댓값이 저장되고 있었다.
String value = new String(paramMap.get("paramter").replaceAll("[^0-9]",""));
  • [0-9][0123456789]와 같고, ^ 기호는 반대를 의미한다. 따라서 [^0-9]0에서 9까지의 숫자를 뺀 나머지를 의미한다. 따라서 0부터 9까지의 숫자와 - 기호를 빼고는 ""로 대체되도록 코드를 변경하였다.
String value = new String(paramMap.get("paramter").replaceAll("[^-0-9]",""));
  • 결과 : 성공, 파라미터로 넘어온 음수 값이 DB에 음수로 잘 저장되고 또한 화면에서도 음수로 잘 나오는 것을 확인했다.

태그:

카테고리:

업데이트: