데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      Vue2와 Vue3 과도기 Composition API 를 서비스에 적용해보자.

      스카이 22.11.23
      2,606 9 1

      Vue 기반의 Nuxt를 이용한 신규 프로젝트를 시작하게 되면서 너무나 쓰고 싶었던 Composition API를 도입해 볼 수 있었습니다.

      실제 사용해 보면서 느꼈던 점을 공유합니다.


      왜 도입했나?

      Vue3 기반으로 한 라이브러리도 적고 하위 브라우저 호환성도 장담할 수 없었기 때문에 Vue3를 도입하는 건 아직 시기 상조라는 판단이 들었습니다

      하지만 언젠가는 Vue3로 넘어가야 할 테고 그 중간 단계인 Composition API는 당장 도입이 가능하기 때문에 이를 활용해서 개발하면 차후에 업데이트하기 쉽겠다는 생각이 들었습니다.

      Vue2에서 Vue3로 바로 가려면 많은 수정사항이 발생하지만 중간 단계를 걸치고 가면 좀 더 수월하니까요.


      Composition API 장점과 단점

      Vuejs 공식 홈페이지에는 Composition API 장점을 크게 4가지로 설명합니다.

      • 더 나은 로직 재사용

      • 더 유연한 코드 구성

      • 더 나은 유형 추론

      • 더 작은 번들과 더 적은 오버헤드

      제가 실제로 사용하면서 느꼈던 큰 장점은 1번과 2번이었습니다. 타입 스크립트를 도입한다면 3번의 장점도 느낄 수 있을 거라고 생각합니다.


      더 나은 로직 재사용

      Composition useXX 같은 훅(hook)으로 반복되는 코드를 분리하고 재사용할 수 있습니다.

      기존의 경우 유사한 성격의 컴포넌트의 코드가 반복되면 코드를 재사용하기 위해서 mixin으로 구현하고 컴포넌트에 확장하는 방식을 사용했는데요.

      그러다 보면 불필요한 코드가 추가되거나 혹은 mixin 여러 개 넣는 경우 디버깅하는데 어려움이 있었습니다.

      하지만 단일 책임 원칙에 따라 한 가지 책임만 가진 동작을 별도의 훅으로 분리하여 메서드를 호출하면 깔끔해지고 필요한 곳에서만 가져다 쓰면 되는 장점이 부각되었습니다.


      예를 들어 기능은 거의 동일한데 일부 UI가 다른 2개의 페이지가 있다고 가정할 때 useCancellation.js 에 공통적인 부분을 작성하고 필요한 list.vue에서 필요한 메서드와 달라지는 상태 값을 넣어 분리할 수 있습니다.

      useCancellation.js
      export default function useCancellation(initSearchForm) {}


      pages/customer/list.vue setup method
      const initSearchForm = {
      }
      
      const {
        state,
        fetchList,
      } = useCancellation(initSearchForm)


      pages/purchase/list.vue setup method
      const initSearchForm = {}
      
      const {
        state,
        fetchList,
      } = useCancellation(initSearchForm)


      더 유연한 코드 구성

      기존의 방식의 경우 data, methods, computed, watch, mounted 등등 항목을 옵션으로 선언했습니다.

      그러디보니 코드가 전체적으로 길어질 수밖에 없고 코드를 이해하려면 지속적으로 위/아래로 스크롤 하면서 파악해야 하는 단점도 있습니다.

      하지만 Composition API로 변경되면 setup에 있기 때문에 코드 전체가 덜 늘어지게 됩니다.

      그리고 필요할 때 useRouter, useStore 훅을 활용하여 필요한 시점에 꺼내 쓸 수 있어 불필요한 의존성이 필요 없게 됩니다.

      또한 기존에는 methods로 선언한 것 중 일부는 template에서 사용하지 않고 있음에도 다른 곳에서 this로 접근하기 위해서 구현했는데 Compostion API의 setup 마지막에 return 값으로 template에서 접근 가능한 값과 메서드를 선별할 수 있다는 장점이 있습니다.

      Vue2에는 props와 state를 구분하기 어려웠으나 Compostion API를 사용하면 setup에서 props를 받아 사용하고 필요한 state 값을 상수로 선언하여 구분할 수 있습니다.


      예를 들어 아래처럼 props로 data를 받고 내부에서 사용하는 상태 값을 state로 선언한다면

      export default {
        props: {
          data: {
            type: Object,
            default: null,
          },
        },
        setup(props, context) {
          const state = reactive({
            reasonCode: 'ETC',
            reason: '',
          })
          
        return { state }
        }
      }


      템플릿에서 다음과 같이 접근해서 사용할 수 있어 state, props 구분이 가능합니다.

      {{ data.cancellationAdditionalInfo }}
      
      <CheckRadio
        v-model="state.reasonCode" />

      가장 큰 단점은 Trade-offs에서 말하고 있는 코드 구성 더 나쁘게 보인다는 점인데 이는 전체 옵션으로 흩여져 있던 코드가 setup 한곳에 모여 있게 되면서 발생하는 이슈라고 보입니다.


      setup()에서 아래처럼 onMounted, computed, 함수가 섞이게 되어 이전보다 구분이 안된다는 느낌을 받을 수 있습니다. 기존에 자바스크립트 코드를 작성했을 때처럼 적절하게 분리하고 구성하면 크게 복잡하지 않다고 느껴집니다. 처음엔 익숙하지 않아 낯설었는데 작성하다 보니 오히려 한곳만 봐서 편하게 느껴졌습니다.

      setup method
         const showModal = computed({
            get() {
              return props.value
            },
            set(value) {
              context.emit('input', value)
            },
          })
      
      
          const handlerCloseModal = () => {
          }
          
      
         onMounted(async () => {
         })


      결론

      Vue3가 공식적으로 기본이 되었고 아직은 징검다리인 시기지만 Vue2를 구성하고 있다면 Composition API를 미리 사용해서 Vue3감을 익히는 게 좋다는 생각이 들었습니다. 실제로 사용해 보니 장점을 확실하게 느낄 수 있었습니다.

      얼마 전에 Nuxt3.0로 릴리스되었고 곧 Vue3가 주가 될 것으로 생각됩니다.


      읽어주셔서 감사합니다.

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      스카이 님의 최신 블로그

      더보기
      동영상 기고하기