Vue

1. VueJS 란?

Vue.js는 웹 애플리케이션을 개발할 때 사용하는 JavaScript 프레임워크입니다.
Vue.js는 대화형이자 반응형인 웹 프론트엔드를 구축하는 데 사용됩니다.
웹 프론트엔드는 브라우저에서 실행되는 웹 애플리케이션으로, 사용자가 직접 상호작용하는 부분을 의미합니다.

JavaScript란?

JavaScript는 브라우저에서 실행되는 프로그래밍 언어로, 웹 페이지를 동적으로 조작할 수 있게 해줍니다.
예를 들어, 버튼을 클릭했을 때 페이지의 내용이 바뀌거나, 입력한 데이터에 따라 화면에 새로운 요소가 추가되는 등의 작업을 JavaScript로 할 수 있습니다.

프레임워크란?

프레임워크는 특정 프로그래밍 언어를 사용하는 데 있어, 개발자가 더 쉽게 작업할 수 있도록 도와주는 구조입니다.
다른 누군가가 작성한 유용한 코드 모음이자, 애플리케이션을 구축할 때 따라야 할 규칙을 제공합니다.
이를 통해 개발자는 기본적인 기능을 직접 작성하지 않고도, 규칙에 따라 애플리케이션을 쉽게 개발할 수 있습니다.

Vue.js의 주요 기능

Vue.js를 사용하면 대화형이고 반응형인 웹 애플리케이션을 쉽게 만들 수 있습니다.

  • 반응형(대화형)이란 사용자의 동작에 따라 애플리케이션이 실시간으로 변화하는 것을 의미합니다.
    사용자가 입력한 값에 따라 자동으로 화면이 업데이트되는 것을 생각할 수 있습니다.

VueJS를 사용하는 이유

웹 애플리케이션을 만들 때, Vue.js와 같은 프레임워크를 사용하면 많은 장점이 있습니다.

  1. 편리한 개발: Vue.js는 개발자가 일일이 작성해야 하는 반복적인 코드를 줄여주고, 애플리케이션의 핵심 로직에 집중할 수 있게 도와줍니다.
  2. 구조화된 코드: 프레임워크는 애플리케이션을 구조화하는 명확한 규칙을 제공하여, 코드가 체계적으로 작성될 수 있게 합니다.
  3. 팀 협업: 팀 내에서 동일한 규칙을 따르기 때문에, 코드의 일관성이 높아지고 협업이 쉬워집니다.

반응형 웹 애플리케이션의 중요성

모바일 애플리케이션을 예로 들어보면, 모바일 앱은 사용자의 동작에 즉시 반응하여, 부드러운 사용자 경험을 제공합니다.
웹 애플리케이션에서도 이런 경험을 제공하는 것이 중요합니다.
예전에는 웹 페이지에서 링크를 클릭하고 새 페이지가 로드될 때까지 기다려야 했지만, 현대적인 웹 애플리케이션에서는 JavaScript와 Vue.js를 사용하여, 페이지를 새로 로드하지 않고도 화면을 동적으로 업데이트할 수 있습니다.

2. VueJS의 다양한 활용방법

부분적 사용: 위젯 방식

Vue를 HTML 페이지의 일부분에만 사용하는 방법입니다.
예를 들어, 페이지의 특정 요소나 기능만 동적으로 만들고 싶을 때 사용합니다.

  • 예시:
    • 사이드바: 동적으로 내용을 로드하는 사이드바.
    • 챗 오버레이: 사용자가 열 수 있는 대화형 챗 창.

이 방법에서는 페이지의 모든 요소를 Vue로 제어하지 않고, 필요한 부분에만 Vue를 적용합니다.
이렇게 하면 필요한 부분에만 반응성을 추가할 수 있어 효율적입니다.

전체적 사용: 싱글 페이지 애플리케이션(SPA) 방식

Vue로 페이지 전체를 제어하는 방법입니다.
이를 통해 완전한 반응형 웹 애플리케이션을 만들 수 있습니다.

  • 예시:
    • 싱글 페이지 애플리케이션(SPA): 전체 페이지가 하나의 Vue 인스턴스에 의해 제어됩니다.
    • 서버는 기본적으로 HTML 페이지 하나만 전송하고, 나머지는 Vue가 브라우저에서 처리합니다.

이 방법에서는 처음 페이지가 로드될 때 HTML 파일 하나만 불러오고, 이후의 모든 화면 렌더링과 업데이트는 Vue가 브라우저 내에서 처리합니다.
이렇게 하면 사용자가 페이지를 탐색할 때마다 새 페이지를 로드할 필요 없이, 화면의 일부만 동적으로 업데이트할 수 있습니다.

두 가지 방식을 섞어 사용

이 두 가지 방법을 혼합해서 사용하는 것도 가능합니다.
예를 들어, 페이지의 일부는 SPA 방식으로, 다른 일부는 부분적 방식으로 처리할 수 있습니다.

3. VueJS 대안 알아보기

React

React는 Vue.js의 대안으로, Facebook에서 개발한 JavaScript 라이브러리입니다.
React는 Vue보다 기능이 적기 때문에 라이브러리로 불리지만, UI를 구축하는 데 매우 강력합니다.

  • 특징:
    • UI 렌더링 집중: React는 주로 사용자 인터페이스를 렌더링하는 데 집중합니다.
    • 커뮤니티 패키지 의존: Vue와 달리 React는 라우팅과 같은 기능을 기본적으로 제공하지 않으며, 필요한 기능을 커뮤니티에서 제공하는 패키지를 통해 추가합니다.
    • 인기: React는 매우 인기가 많고, 많은 대기업에서도 사용됩니다.

Angular

Angular는 Google에서 개발한 JavaScript 프레임워크로, Vue의 또 다른 대안입니다.
Angular는 Vue보다 더 많은 기능을 제공합니다.

  • 특징:
    • 기능 다양성: Angular는 아주 많은 기능을 제공하여, 발생할 수 있는 여러 문제를 해결할 수 있습니다.
    • 기업에서 인기: 많은 대기업에서 Angular를 사용하며, 특히 규모가 큰 프로젝트에 적합합니다.
    • TypeScript 사용: Angular는 TypeScript를 필수적으로 사용합니다. Vue도 TypeScript를 지원하지만 선택 사항입니다.
    • 컴포넌트 기반: Vue와 마찬가지로 컴포넌트 기반으로 동작합니다.

4. JavaScript App

5. VueJS App

6. Vue 앱 인스턴스 생성 및 연결하기

7. 보간법 및 데이터 바인딩

Vue.js를 사용하여 HTML 코드에서 데이터를 출력할 때, 특정 구문을 사용합니다.
이 구문은 열고 닫는 중괄호를 두 개씩 사용하는 것입니다: {{ }}.
이 구문을 보간법(Interpolation)이라고 합니다.

8. "v-bind" 디렉티브로 속성 바인딩하기 / Vue 앱 내에서 데이터 작업하기

9. Vue 앱의 "메서드" 이해하기

10. v-html 을 사용하여 원시 HTML 콘텐츠 출력하기

  • v-html 디렉티브:
    • v-html은 HTML 콘텐츠를 실제 HTML로 인식하여 출력합니다.
    • 이는 보안상의 이유로 기본적으로 사용하지 않는 것이 좋지만, 특정 상황에서는 유용하게 사용할 수 있습니다.

보안 고려 사항

  • 크로스 사이트 스크립팅(XSS):
    • v-html 디렉티브를 사용할 때는 외부 입력을 신뢰할 수 있을 때만 사용해야 합니다.
    • 이를 남용하면 크로스 사이트 스크립팅 공격에 취약해질 수 있습니다.
  • 기본 보안 기능:
    • Vue.js의 기본 보간법({{ }})은 HTML 콘텐츠를 일반 텍스트로 처리하여 XSS 공격을 방지합니다.

요약

  • v-html 디렉티브: HTML 콘텐츠를 실제 HTML로 출력할 때 사용합니다.
  • 보안 고려 사항: v-html 디렉티브를 사용할 때는 외부 입력의 신뢰성을 확인하여 사용해야 합니다.
  • 데이터와 메서드 사용: data 객체와 methods 객체를 사용하여 데이터를 저장하고 메서드를 정의합니다.
  • this 키워드: Vue 인스턴스 내에서 this 키워드를 사용하여 data 객체의 프로퍼티에 접근합니다.

11. 이벤트 바인딩 이해하기

12. 이벤트 인수 활용하기

13. 네이티브 이벤트 객체 사용하기

14. 이벤트 수식어 알아보기

15. v-once로 콘텐츠 잠그기

이벤트는 다양한 기능 중에서도 중요한 역할을 합니다.
이번에 설명할 디렉티브는 자주 사용되지는 않지만, 특정 상황에서 매우 유용하게 쓰일 수 있습니다.
어떤 상황인지 예를 들어 드리겠습니다.

특정 상황 설명

  1. 카운터 앱 상황

    • 우리가 만든 앱에서 카운터(counter)의 값을 관리한다고 가정해봅시다.
    • Starting Counter라는 문구와 함께 초기 카운터 값을 화면에 출력하고 있습니다.
    • Vue 인스턴스에서 counter라는 프로퍼티를 관리하고 있죠.
    • 현재 Starting Counter는 counter를 참조하고 있어서, counter 값이 바뀔 때마다 Starting Counter의 값도 함께 바뀝니다.
  2. 문제 발생

    • 하지만 우리는 Starting Counter의 초기 값을 유지하고, 이후에 counter 값이 변경되더라도 Starting Counter의 값은 바꾸고 싶지 않은 경우가 생길 수 있습니다.
    • 예를 들어, 초기 상태를 유지하면서 이후에 변경되는 상태는 반영하지 않아야 하는 경우죠.

해결 방법: v-once 디렉티브

이 문제를 해결하기 위해 Vue.js에서 제공하는 특별한 디렉티브가 있습니다.
바로 v-once 디렉티브입니다.

  • v-once 디렉티브
    • Vue.js에 내장된 기능입니다.
    • v-once를 사용하면 요소의 동적 데이터 바인딩을 한 번만 평가하고, 이후 값이 변경되더라도 해당 요소는 업데이트되지 않습니다.

16. 데이터 바인딩 + 이벤트 바인딩 = 양방향 바인딩

주어진 내용은 Vue.js에서 input 요소와 버튼을 이용해 사용자 입력을 처리하고 초기화하는 과정을 설명하는 것입니다.
이를 더 이해하기 쉽게 설명해드리겠습니다.

v-model 디렉티브 사용

  • v-bind:value와 v-on:input을 사용하여 input 요소와 name 데이터 프로퍼티를 바인딩하고 이벤트를 수신하는 대신, v-model 디렉티브를 사용합니다.
  • v-model은 양방향 바인딩을 제공하여 input 요소의 값이 변경될 때 자동으로 name 데이터 프로퍼티를 업데이트하고, 반대로 name이 변경되면 input 요소의 값도 업데이트됩니다.

17. 데이터 바인딩에 사용되는 메서드 작동 원리

메서드를 사용하여 계산된 값 출력하기

메서드를 사용하여 계산된 값을 출력할 때 문제가 발생할 수 있습니다.
예를 들어, 입력된 이름을 포함한 전체 이름을 출력하는 메서드를 만들어봅시다.

문제 설명

아래 코드에서는 outputFullname 메서드를 사용하여 이름과 성을 결합한 전체 이름을 출력합니다.
그러나 카운터를 변경할 때마다 outputFullname 메서드가 재실행되는 문제가 있습니다.
이는 Vue가 화면의 변경 사항을 감지하고 모든 메서드를 재실행하기 때문입니다.

18. 연산(Computed) 프로퍼티 소개

Vue.js에서 computed 속성 사용하기

Vue.js에서는 세 가지 주요 구성 요소가 있습니다:

  1. data: 애플리케이션에서 사용하는 데이터를 정의합니다.
  2. methods: 이벤트 처리 등에서 사용할 메서드를 정의합니다.
  3. computed: 특정 데이터에 의존하는 계산된 값을 정의합니다.

왜 computed 속성을 사용해야 하는가?

기존에 메서드를 사용하여 계산된 값을 출력할 수 있습니다.
예를 들어, 사용자가 입력한 이름과 성을 결합하여 전체 이름을 출력하는 메서드를 사용할 수 있습니다.
그러나 이 방법에는 문제가 있습니다:

  • Vue는 화면에 변화가 생길 때마다 모든 메서드를 재실행합니다. 이는 성능에 좋지 않습니다.
  • 예를 들어, 카운터 값을 변경하면 Vue는 전체 이름을 계산하는 메서드를 다시 실행합니다.

더 나은 해결책: computed 속성

computed 속성은 특정 데이터(의존성)가 변경될 때만 재계산됩니다.
이를 통해 불필요한 재실행을 방지하고 성능을 최적화할 수 있습니다.

19. 감시자(Watcher) 활용하기

20. 메서드 vs 연산(Computed) 프로퍼티 vs 감시자(Watcher)

메서드 (Methods)

  • 사용 용도:

    • 이벤트 바인딩: 버튼 클릭, 폼 제출 등 이벤트를 처리할 때 사용합니다.
    • 데이터 바인딩: 템플릿에서 데이터를 가져와서 처리할 때 사용합니다.
  • 특징:

    • 메서드는 호출될 때마다 실행됩니다.
    • Vue 컴포넌트가 리렌더링될 때마다 메서드도 다시 실행됩니다.
    • 이벤트 바인딩에는 항상 메서드를 사용합니다.

연산 프로퍼티 (Computed Properties)

  • 사용 용도:

    • 데이터 바인딩: 다른 데이터에 의존하는 데이터를 계산하여 출력할 때 사용합니다.
  • 특징:

    • 의존하는 데이터가 변경될 때만 재계산됩니다.
    • 데이터가 변경되지 않으면 캐싱된 값을 사용하여 성능을 최적화합니다.
    • 이벤트 바인딩에는 사용하지 않습니다.

감시자 (Watchers)

  • 사용 용도:

    • 데이터 변경에 따른 추가 작업: 데이터가 변경될 때 특정 작업을 실행할 때 사용합니다.
      예를 들어, HTTP 요청을 보내거나, 타이머를 설정하거나, 로컬 스토리지에 데이터를 저장하는 작업 등이 있습니다.
  • 특징:

    • 감시자는 데이터가 변경될 때 실행됩니다.
    • 템플릿에서 직접 사용하지 않습니다.
    • 데이터 변경에 따른 비동기 작업이나 복잡한 로직을 처리할 때 유용합니다.

21. v-bind 및 v-on 축약어

v-on과 v-bind 축약어

Vue.js에서 v-on과 v-bind는 매우 자주 사용됩니다.
그래서 Vue는 이 두 디렉티브에 대해 축약어를 제공합니다.

  • v-on
    • 원래 문법: v-on:click="methodName"
    • 축약어: @click="methodName"

v-on 디렉티브는 이벤트 리스너를 추가할 때 사용됩니다.
예를 들어, 클릭 이벤트를 처리할 때 v-on:click을 사용할 수 있습니다.
이를 축약어로 작성하면 @click이 됩니다.

<!-- 원래 문법 -->
<button v-on:click="increment">Increment</button>

<!-- 축약어 사용 -->
<button @click="increment">Increment</button>
  • v-bind
    • 원래 문법: v-bind:src="imageUrl"
    • 축약어: :src="imageUrl"

v-bind 디렉티브는 동적으로 속성을 바인딩할 때 사용됩니다.
예를 들어, 이미지의 src 속성을 동적으로 바인딩할 때 v-bind:src를 사용할 수 있습니다.
이를 축약어로 작성하면 :src가 됩니다.

<!-- 원래 문법 -->
<img v-bind:src="imageUrl">

<!-- 축약어 사용 -->
<img :src="imageUrl">

22. 인라인 스타일을 사용한 동적 스타일링

23. 동적으로 CSS 클래스 추가하기

24. 클래스 및 연산(Computed) 프로퍼티

25. 동적 클래스: 배열 구문

26. 중간 정리

Vue.js의 기본 개념과 핵심 기능

  1. Vue의 선언형 접근 방식:

    • Vue.js는 선언형 접근 방식을 따릅니다.
      이는 개별 단계나 절차를 정의하지 않고, 원하는 최종 목표를 정의하는 방식입니다.
      Vue는 정의된 목표에 도달하는 방법을 스스로 알아내어 동작합니다.
  2. Vue 인스턴스 생성 및 마운트:

    • Vue 앱을 만들기 위해 Vue.createApp을 사용합니다.
    • mount 메서드를 사용하여 Vue 인스턴스를 실제 HTML 코드에 연결합니다.
      예를 들어, 특정 CSS 선택자를 통해 페이지 일부를 선택하고, 그 부분을 Vue 앱 템플릿으로 전환합니다.
  3. 데이터 바인딩:

    • 보간법: 이중 중괄호 {{ }}를 사용하여 동적 데이터를 템플릿에서 출력합니다.
    • 속성 바인딩: v-bind 디렉티브 또는 축약어 :를 사용하여 HTML 속성을 동적 값에 바인딩합니다.
      예를 들어, v-bind:href 대신 :href를 사용할 수 있습니다.
  4. 이벤트 바인딩:

    • v-on 디렉티브 또는 축약어 @를 사용하여 이벤트를 바인딩합니다.
      예를 들어, v-on:click 대신 @click을 사용할 수 있습니다.
  5. 반응성 시스템:

    • Vue의 반응성 시스템은 데이터가 변경될 때마다 DOM을 자동으로 업데이트합니다. 이를 통해 사용자에게 최신 정보를 보여줍니다.
    • 데이터 옵션: Vue 인스턴스의 data 옵션에 변경 가능한 데이터를 등록합니다.
    • 연산 프로퍼티 (Computed Properties): 동적으로 계산된 값을 반환합니다. 연산 프로퍼티는 의존하는 데이터가 변경될 때만 재계산됩니다.
    • 감시자 (Watchers): 특정 데이터가 변경될 때 실행될 코드를 정의합니다. 주로 데이터 변경에 따른 추가 작업(예: HTTP 요청, 타이머 설정 등)을 처리할 때 사용합니다.
  6. 동적 스타일링:

    • Vue를 사용하여 동적 스타일링을 구현할 수 있습니다. 이를 통해 페이지 요소의 스타일을 동적으로 변경할 수 있습니다.
    • 클래스 바인딩: v-bind:class 또는 축약어 :class를 사용하여 CSS 클래스를 동적으로 바인딩합니다. 객체 또는 배열 구문을 사용하여 여러 클래스를 조건에 따라 적용할 수 있습니다.
    • 인라인 스타일 바인딩: v-bind:style 또는 축약어 :style을 사용하여 인라인 스타일을 동적으로 바인딩합니다. 객체 구문을 사용하여 여러 스타일 속성을 조건에 따라 적용할 수 있습니다.

27. 콘텐츠 조건부 렌더링 + v-if, v-else 및 v-else-if

28. v-if 대신 v-show 사용하기

29. 데이터 목록 렌더링 v-for

30. 목록 및 키

v-for 디렉티브에서 key 속성 사용

Vue.js에서 v-for를 사용하여 목록을 렌더링할 때, 각 항목에 고유한 key 속성을 추가하는 것이 매우 중요합니다.
그렇지 않으면 예상치 못한 버그가 발생할 수 있습니다.
key 속성은 Vue가 각 항목을 고유하게 식별할 수 있도록 도와주며, 성능 최적화에도 큰 도움을 줍니다.

문제 상황

v-for를 사용하여 목록을 렌더링할 때, 각 항목에 고유한 key 속성이 없으면 Vue는 성능 최적화를 위해 DOM 요소를 재사용합니다.
이로 인해 예상치 못한 버그가 발생할 수 있습니다.

예를 들어, 다음과 같은 상황을 생각해 봅시다:

  1. 여러 개의 목표를 추가합니다.
  2. 각 목표 항목에 텍스트를 입력합니다.
  3. 특정 목표 항목을 삭제합니다.

이 경우, 삭제된 목표의 위치에 있던 DOM 요소가 그대로 재사용되기 때문에, 입력했던 텍스트가 다른 목표 항목으로 이동하는 문제가 발생할 수 있습니다.

해결 방법

v-for 디렉티브를 사용할 때 key 속성을 추가하여 각 항목을 고유하게 식별할 수 있도록 합니다.
이는 Vue가 각 항목을 올바르게 추적하고, DOM을 효율적으로 업데이트하는 데 도움이 됩니다.

--51부터--

☰