1. 왜 타입스크립트를 사용하는가?

 

많은 회사들이 typescript를 사용하고 있고 typescript 관련 영상들을 보면 '반드시 해야 할' 언어처럼 보인다. 왤까? 지금도 나는 js를 잘 사용하고 있고 나름 편리하다고 생각하고 있는데.. js를 쓰다가 typescript로 넘어가게 되면 역체 감이 심하다 하는데.. 왜 typescript를 써야 하며 js보다 어떤 점에서 이점을 갖고 있는지부터 살펴볼 필요가 있겠단 생각이 들었다.

 

아무래도 현재 내가 일하고 있는 회사에서는 현재 typescript를 사용하지 않는다. 'typescript를 사용해보자'라는 시도가 없었던 것은 아니고 내가 이 회사에 오기 전에 몇번의 시도가 있었던 것으로 보인다. 그러나 vue2를 사용하고 있고 사용은 할 수 있으나 몇몇 라이브러리의 도움을 받아야 하거나 구현 자체가 안 되는 문제도 다수 있다 한다. 당장에 feature 개발이 중요했던 과거에 typescript를 적용하고 개발하기에 실무적으로 경험도가 없었기에 우선적으로 적용될 수 없었던 가장 큰 이유가 아닐까 싶다.

 

typescript

개인적으로 typescript를 공부하기로 마음을 먹은 이상 내가 왜 typescript를 공부해야 하는가 에대한 질문을 스스로에게 던져보기로 했다. 글제 주가 없는 나지만 누군가 이 글을 읽고 왜 typescript를 사용하는가? 에 대한 물음에 대답 정도는 할 수 있었으면 좋겠고 공부해 보면서 나도 나름대로 느낀 점을 적용해보려 한다. 실무에서 사용해보지 못한다는 게 크지만.. 개인 프로젝트에도 적용해볼 예정이다

 

인터넷과 각종 youtube 영상들을 찾아본 결과 js에서의 다양한 문제점들을 찾을 수 있었다. 그 중 몇 가지는 나도 이미 경험해보았고 불편했던 점들도 포함되어 있었다.

 

 

기존 javascript

 

함수의 명확한 동작에 대한 예측이 어렵다.

javascript의 경우 런타임 시 타입을 지정하는 dinamic typing을 제공함에 따라 함수의 파라메터의 타입이 어떠한 값이 들어가도 error를 발생시키지 않는다는 것이다. 문자열 + 숫자 ,  문자열 + 문자열 또는 파라메터의 개수까지도 달라도 error가 발생하지 않아 함수의 정확한 동작에 대해 예측이 어렵다. 이는 개발자의 실수가 사용자에게 오류를 노출하기 쉽게 된다. 나도 개발을 하면서 예상치 못하게 NaN을 참 많이 보았던 것 같다.

 

 

 

suggestions기능이 약하다는 것

javascript로 개발을 하다보면 suggestions 기능에 대한 부재로 인해 내가 구현하지 않은 함수들을 사용할 때 해당 함수가 파라메터로 어떠한 값을 받는지, 뱉는지에 대한 인지가 쉽지 않다는 것이다. 어떠한 값을 뱉는지도, 어떠한 값을 넣어야 하는지도 모두 변수명과 함수명을 보고 추론하거나 콘솔을 찍어봐야 알 수 있다는 점이다. 어찌 보면 이러한 문제는 바로 위에서와 같이 함수에 대한 의도치 않은 동작을 불러일으킬 수 있다.

 

 

 

내가 개인적으로 느끼는 것 OOP와는 멀어지는 느낌

개인적으로 느끼는 자바스크립트의 느낌은 프론트 개발을 하면서 component 위주로 개발을 하는 나에겐 내가 짜는 코드가 OOP와는 멀어지는 듯한 느낌을 받았다. 학교를 다니면서 가장 중요하다고 배웠던 객체지향 코딩은 웹 개발을 하면서 신경 쓰지 않는 느낌이 들었고 적용하기 어렵다는 느낌을 받았다. 내가 공부를 조금은 개을리 했을 것이 분명하지만 말이다..

 

 

그렇다면 typescript에선?

typescript의 장점에 대해 찾아본 바로 대략적으로 3가지 정도의 장점을 가지고 있었다.

 

 

1. IDE와의 조합

vsc와의 조합이 굉장히 좋은 편이라 여러 exptention을 설치하지 않아도 Extension Pack 하나만으로도 굉장히 유용하게 사용할 수 있다 또한 개발하는 코드에 대해 실시간 피드백과 suggestions 기능이 잘 되어있어 개발자에게 많은 편의성을 제공해준다.

 

2. 타입 추론 & 타입 단언

타입에대한 서술을 해야한다는 단점이 있지만 타입에 대한 추론을 해주어 개발 시 개발자들의 예상치 못한 실수를 줄여주고 동작 시 예기치 못하게 바뀌는 값에 대한 방어가 가능하다.

 

3. 정적 타입

동적 타입핑인 javascript와는 달리 정적 타입핑을 지원하는 typescript는 정적 타입 언어에 대한 장점을 그대로 가져갈 수 있다. 타입에 따른 잘못된 값을 컴파일시에 걸러주기 때문에 실수에 대한 피드백과 함수에 대한 파라메터 값과 리턴 값에 대한 인지가 쉽다. 이에따라 개발에 대한 예측이 쉬워지고 안정적인 개발이 가능하다. 

 

 

 

이러한 장점들은 개발자의 실수 방지 + 개발의 편리성 제공의 역할이 가장 크게 보이는 듯하였다. typescript에 대해 조금 더 자세히 알아보기 위해 typescript의 작동 방식에 대해 조사를 하게 되었다.

 

typescript의 구조

 

Typescript Architectural

 

Core TypeScript Compile

    - 언어 변환을 수행 합니다.

    - 파서, 바인더, 타입 체커, 에미터 , 전처리기로 구성되어 있습니다.

 

2) Parser

일련의 소스에서 언어 문법의 생성에 따라 AST(추상 구문 트리) 생성

 

3) Binder

심볼을 사용하여 동일한 구조에 기여하는 선언을 연결합니다(예: 동일한 인터페이스 또는 모듈의 다른 선언, 또는 동일한 이름을 가진

함수와 모듈). 이렇게 하면 형식 시스템이 이러한 명명된 선언에 대해 추론할 수 있습니다.

 

4) Type resolver/ Checker

각 구문의 유형 해결하고, 의미 연산 확인 및 적절한 결과 및 타입에 대한 결과 생성.

 

5) Emitter

이벤트를 명시적으로 선언하여 이벤트 기반 프로그램을 명확히 하여 이벤트에 대한 처리기나 알 수 없는 이벤트 데이터를 참조하려는 시도가 이제 TypeScript 컴파일러에서 포착.

 

 

 

typescript를 조사를 하던 중 typescript는 단순히 javascript의 가장 앞단에 단계를 추가한 언어라는 느낌이 들었다. 인터프리터 기반의 javascript 언어에 compiler를 붙여준 셈이다. TSC(typescript compiler)의 역할이 typescript의 가장 큰 부분임을 알 수 있었고 TSC의 작동원리를 알아보기로 하였다.

 

 

TSC(typescript compiler)의 작동

 

1. 타입스크립트의 소스코드를 scanner.ts를 통해 읽어 들입니다. 읽어 들인 코드는 각각의 칸 수에 따라 의미를 갖는 Token으로 분류됩니다.

 

 

 

 

 

 

 

2. keyword 별로 token화된 데이터는 parser.ts를 통해

추상 구문 트리(AST) 형식으로 변환이 됩니다.

 

 

 

 

 

 

 

 

3.  binder.ts 사용하여 동일한 구조에 기여하는 선언을 연결합니다.

(예: 동일한 인터페이스 또는 모듈의 다른 선언, 또는 동일한 이름을 가진 함수와 모듈)

 

4.  checker.ts 를 활용하여 타입 체크를 수행합니다.

 

5. emitter.js 통해 javascript로 변환을 수행합니다.

 

 

 

그렇다면 단점은?

 

1. typescript를 사용하게 되면 javascript만큼 유연한 코드를 작성하기 힘들다.

이는 처음 typescript를 사용하게 되면 상대적으로 불편함으로 느껴질 수 있고 익숙해지기 전까지의 개발 기간이 늘어난다 것이다. 

 

2. 러닝커브에 대한 부담감

처음 typescript를 공부하면서 느끼는 것은 이게 맞게 쓰는건지 더 나은 방법이 있는지에 대해 계속해서 고민하게 된다. 하나의 페이지를 개발하면서 이러한 고민들은 필요 이상의 시간이 들어가는 것 같다.

 

3. 가독성

typescript가 익숙하지 않아서 인지는 잘 모르겠다.. 기존 javascript를 보던 나는 조금만 더 복잡한 코드를 볼때 가독성이 많이 떨어지는 듯한 느낌을 받았다.

 

 

 

typescript를 제대로 공부하기 전에 여러모로 조사를 좀 해보았다. 장점과 단점 에 대해 읽으면서 아직은 장점보단 단점에 공감이 많이 가고 있지만 조금 더 많은 시간을 투자하여 공부해보면 달라진 시야를 가지지 않을까 싶다. 앞으로의 사이드프로젝트는 웬만해서 typescript로 진행해보려 한다. 앞으로 typescript를 공부하며 다양한 케이스들을 블로그에 정리해 놓아야 겠다.

 

 

 

 

참고

https://cijbest.tistory.com/46

https://www.typescriptlang.org/docs/

https://github.com/Microsoft/TypeScript/wiki/Architectural-Overview

https://doitnow-man.tistory.com/169

 

 

 

 

 

 

 

  - slot

특정 컴포넌트에 등록된 하위 컴포넌트의 마크업을 확장하거나 재정의하여 재사용성을 높여주는 기능 입니다.

예를 들어 모든 페이지에서 범용성 있게 사용하는 컴포넌트에 간단한 추가적인 레이아웃을 구현해야 한다고 생각해 봅시다.

이미 사용중인 다른 페이지의 영향을 안받도록 구현해야할 뿐만 아니라 노출에 대한 분기처리를 해주어야 합니다.

v-slot을 사용할 경우 새로운 컴포넌트를 추가하지 않아도 기존의 컴포넌트를 확장하여 사용할 수 있습니다.

 

 

 

Vue.js 2.6.0이상 에서

named slot과 scoped slots 의 문법적 사용이 변경되었습니다. 따라서 설명은 최신 문법 기준으로 설명하겠습니다.

 

named Slot

                  <변경 전>                                                                                          <변경 후>   

<base-layout>                                                                                <base-layout>
    <template slot="header">                                                              <template v-slot:header> 
        <h1>Here might be a page title</h1>.                                              <h1>Here might be a page title</h1>
    </template>                                                                                      </template>
</base-layout>                                                                              </base-layout>

 

 

scoped slots

                  <변경 전>                                                                                         <변경 후>

<slot-example>                                                                         <slot-example>  
    <template slot="default" slot-scope="slotProps">               <template v-slot:default="slotProps" >
        {{ slotProps.msg }}                                                                     {{ slotProps.msg }}
    </template>                                                                                </template>
</slot-example>                                                                        </slot-example>

 

 

 

 

상위 컴포넌트

<template>
  <div class="app">
    <ChildComponent>
    
    <!-- default는 이름이 지어 지지않은 slot에 기본 값으로 적용 됩니다. -->
      <template v-slot:default>
        <span>안녕하세요</span>
      </template>
      
    </ChildComponent>
  </div>
</template>

하위 컴포넌트

<template>
  <div class="child-component">
    <slot></slot>  <!-- 해당 태그가 교체 됩니다. --> 
  </div>
</template>

 

결과

<template>
  <div class="child-component">
    <span>안녕하세요</span> 
  </div>
</template>

랜더링 시 <slot><slot> 태그는 상위 컴포넌트 하위 컴포넌트 태그 안의 값 <span>안녕하세요</span> 으로 치환됩니다. 

 

 

 

 

하나의 슬롯을 이용하는 것 말고 여러개의 슬롯을 특정 위치에 배치하고 싶다면 어떻게 할까요?

 

Named Slots

slot 마다의 이름을 지정해 준다면 원하는 위치에 해당 태그들을 대치 시킬 수 있습니다.

v-slot:[name] 또는 #[name]

하위 컴포넌트에서 아무 이름을 입력해 주지 않는다면 default 태그로 인식됩니다.

허나 default 이름을 가진 slot 태그와 아무 이름도 갖지 않은 slot태그가 동시에 존재한다면 default에 대치되게 됩니다.

 

 

상위 컴포넌트

<template>
  <div class="app">
  
    <ChildComponent>
    
      <template v-slot:apple>
        <span>apple</span>
      </template>

      <template v-slot:default>
        <span>기본값 이름입니다.</span>
      </template>
      
    </ChildComponent>
    
  </div>
</template>

하위컴포넌트

<template>
  <div class="child-component">

    <!-- v-slot:apple은 이곳에 대치 됩니다. -->
    <slot name="apple"></slot>

    <!-- v-slot:default는 이곳에 대치 됩니다.-->
    <slot></slot>
    
  </div>
</template>

결과

 

 

 

 

 

Scoped Slots

상위 컴포넌트에서 하위 컴포넌트의 값이 필요할 경우가 생긴다면 어떻게 될까요? 

 

하위 컴포넌트 

하위 컴포넌트에서 보내고자 하는 apple 과 func1을 slot 태그내에 v-bind 해주면 됩니다.

 

상위 컴포넌트

 

 

하위 컴포넌트에서 v-bind로 던저준 값을 상위 컴포넌트에서 구조분해 할당을 통해 가져올 수 있게 됩니다! 

 

 

 

v-slot을 알게 되면 여러모로 코드를 볼때 편해지게 됩니다. vutify의 dialog와 bootstrapVue의 tag등 편하게 사용하려쓰는

디자인 라이브러리 내에서도 v-slot을 많이 이용하고 있기 때문입니다. 

 

 

언제나 추가적인 질문 및 잘못된 내용을 알려주세요!

더 많은 공부가 될 수 있는 기회가 되었으면 좋겠습니다!

'FE > Vue' 카테고리의 다른 글

[vue.js] Vuex를 통한 상태 관리 패턴  (0) 2021.07.04

vuex란?

vuex는 vue에서 활용할 수 있는 상태관리라이브러리 입니다.

애플리케이션의 모든 컴포넌트에 대한 중앙 집중식 저장소 역할을 하며 예측 가능한 방식으로 상태를 변경할 수 있습니다.

 

vuex를 왜 사용하는가?

- 대용량의 SPA에서의 컴포넌트끼리 공통적인 데이터를 사용함에 있어 데이터 및 상태 관리를 용이하게 한다.

? 쇼핑몰 서비스를 예를 들자. 로그인을 한 고객의 정보를 다양한 컴포넌트에서 사용할 확률이 높다. (이름, 등급 등) 따라서 이러한 데이터를 vuex에 저장해 두고 다양한 컴포넌트에서 꺼내쓴다면? 

- 애플리케이션의 상태에 대한 예측이 쉬워진다. 

? 데이터를 변경하고 저장하는 일련의 공통적인 과정들을 vuex store내에서 관리하게 된다면 일괄적이고 지역적으로 관리할 수 있게 된다.

 

 

그렇다면 단점은?

- 새로고침시 vuex store내에 저장된 데이터가 사라지게된다.

- 공통의 상태를 공유하는 여러 컴포넌트가 있는 경우 단순함이 빠르게 저하된다. 즉 프로젝트가 복잡해진다.

 

 

즉 프로젝트가 크지않다면 굳이 vuex를 사용하지 않아도 된다. 컴포넌트별 상태를 주고 받는 이벤트는 사실 많기 때문이다!

( vuex공식 사이트에서도 그렇게 말하고 있다. )

화자도 vuex를 사용하면서 새로고침시 데이터가 사라지는 것을 방지하기 위해 localStorage등을 함께 사용하고 있다.

 

 

 

Vuex의 데이터 흐름도

 

stage, mutations, actions, getter 4가지 형태로 관리하게 된다

 

State

 - Vue Components에서의 data에 해당하는 것으로 원본 데이터를 의미한다.

 - state는 mutation을 통해서만 변경이 가능하다.

 

Mutations

- State를 변경하려면 반드시 호출해야하는 것으로 method와 비슷하다.

- 단 Mutations는 commit을 통해서만 호출 할 수 있으며 함수로 구현된다.

 

Actions

- 비동기 작업이 가능합니다.

 - mutation을 호출하기 위한 commit이 가능합니다.

 - action은 dispatch를 통해 호출할 수 있습니다.

 

 

'FE > Vue' 카테고리의 다른 글

[vue.js] slot에 대해 알아보자  (0) 2021.08.20

+ Recent posts