글 작성자: beaniejoy

Vue를 통해 프론트를 개발할 때 데이터를 표현하는 과정을 빼놓을 순 없습니다. 특히 화폐 단위 형식(₩100,000), 날짜 형식(2022/02/22) 등 여러 가지의 데이터 포멧이 존재하고 이를 적용해야 할 때가 있습니다.

그런데 가져온 데이터를 가지고 매번 프론트에 표현할 때 형식 변환 메소드를 가지고 계속 적용하며 사용하는 것은 비효율적입니다.

methods: {
    getMoneyData(accountId) {
        axios.get([URL 입력])
            .then((response) => {
                this.money = convertMoneyFormat(response.data.currentMoney);
            })
            .catch((error) => {
                //...
            });
    },
    convertMoneyFormat(value) {
        if (value === null) {
            return 0
        }

        return value.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
    }
}

이런 식으로 사용하면 money 데이터를 다루는 다른 메소드에서도 convertMoneyFormat을 가져다 변환해주는 작업이 필요할 것입니다.

Vue에서는 이것을 세련되게 표현할 수 있도록 filter api를 제공해줍니다.

 

📌 filter 설정

filter는 지역 컴포넌트에 적용하는 방법과 전역으로 적용하는 방법이 있습니다.

Local filter 적용

data() {
  return {
    amount: 200000
  }
},
filters: {
  currencyFormat(value) {
      if (value === null) {
          return 0
      }

      return value.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
  },
  monetaryUnitOfKorea(value) {
      return `${value} 원`;
  }
}

Vue 지역 객체 안에 filters라는 옵션을 추가할 수 있습니다. 
vue component 안에 filters 옵션에 filtering할 여러 기능들을 function 형태로 정의하면 됩니다. 인자로 받는 value는 filter 대상을 가리킵니다.

Global filter 적용

Vue.filter('currencyFormat', function(value) {
  if (value === null) {
      return 0
  }

  return value.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
});

Vue.filter('monetaryUnitOfKorea', function(value) {
  return `${value} 원`;
});

Vue를 사용하는 곳에 전역적으로 filter를 등록해놓고 사용하고 싶을 때 설정하는 방법입니다.

 

📌 HTML 요소에 filter 적용해서 데이터 표현

Vue 공식 문서에 filter를 적용할 수 있는 곳은 mustache interpolations({{  ...  }}) and v-bind expressions 라고 명시하고 있습니다.

 

<div>{{ amount | currency | monetaryUnitOfKorea }}</div>
200,000 원

먼저 mustache라고 하는 중괄호 표현에서 filter 사용하는 방법입니다. 가장 왼쪽에 표현 대상인 데이터를 놓고 오른쪽으로 적용하고자 하는 filter를 표시하면 됩니다. filter 적용하는 중간중간에  특수기호 잊으면 안됩니다.

filter는 chaining 기능도 있기 때문에 오른쪽으로 나열함으로써 차례차례로 각 filter의 기능들을 연달아 적용할 수 있습니다.

<input 
  type="text" 
  :value="amount | currencyFormat | monetaryUnitOfKorea" 
  disabled>

두 번째로 v-bind에 적용하는 법입니다. mustache와 비슷하게 사용하면 되는데 v-bind에서는 mustache 없이만 사용하면 됩니다.

 

이런 식으로 filter 기능을 미리 설정해놓고 사용하고 싶은 곳에만 filter 표현식으로 적용해서 사용하면 되기에 편리하게 사용할 수 있습니다. 로직 중간중간에 데이터 처리하는 과정이 필요없어지게 됩니다.

협업하여 개발할 때도 어떤 filter 기능을 적용했는지 한 눈에 들어와서 여러모로 좋은 듯 합니다.

'Vue' 카테고리의 다른 글

[ESLint] Vue 프로젝트에 ESLint 적용하기 (Vue CLI & ESLint)  (0) 2022.03.18