본문 바로가기

IT Study./Do it! Vue.js 입문

부록. 지금 당장 실무에서 써먹는 Vue.js - 1

 

 

 

부록 - 1

 

 

 


Tip 1. 뷰와 제이쿼리를 같이 사용해도 되나요?

<뷰에서 제이쿼리가 과연 필요할까?>

  • 제이쿼리(jQuery)는 현재 대다수의 기업 시스템에서 활용하고 있는 자바스크립트 라이브러리이다.
  • 2006년에 등장한 이래로 많은 기업에서 도입하여 기업용 시스템을 구축하였다.
  • 이제 막 새로운 웹 기술로 사업용 서비스를 구축하는 스타트업을 제외하고는 대부분의 기업용 시스템이 이미 제이쿼리로 구현되어 있다 해도 과언이 아니다.
  • 왜냐하면 프런트엔드 프레임워크의 대중화가 시작된 지도 얼마 되지 않았고, 웹 페이지에서 더 나은 사용자 경험을 제공하는 동적 화면 구성에 대한 수요 역시 최근에서야 높아졌기 때문이다.

 

  • 따라서 기존 제이쿼리에 익숙한 개발자들이 뷰를 배우고 나면 실제로 개발할 때 가장 먼저 하게 되는 질문이 있다.
  • 바로 '뷰와 제이쿼리를 어떻게 같이 사용하나요?'이다.
  • 이 질문에 대한 해답을 알려주기 전에 먼저 고민해 봐야 하는 부분은 '뷰 프레임워크에서 제이쿼리를 반드시 사용해야 하느야?' 라는 부분이다.

 

  • 많은 웹 개발자들이 제이쿼리를 선호하는 이유는 순수 자바스크립트에 비해 화면 돔 요소 조작과 ajax 같은 데이터 요청을 쉽게 할 수 있기 때문이다.
  • 제이쿼리로 코딩하면 순수 자바스크립트를 사용할 때보다 훨씬 편하게 코딩할 수 있고 코드의 양도 확실히 줄어든다.
  • 그런데 과연 이러한 제이쿼리의 특성이 뷰에서도 필요할까?

 

  • 정답은 '뷰에서 제이쿼리는 필요 없다'이다.
  • 제이쿼리처럼 뷰에서도 화면의 요소를 쉽게 접근할 수 있는 ref 속성을 제공한다.
  • 또한 화면의 특정 요소 이벤트도 v-on 디렉티브로 처리할 수 있다.
  • 아래는 같은 동작을 하는 코드를 각각 제이쿼리와 뷰로 구현한 것이다.
<!-- jQuery -->
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>jQuery Example</title>
    </head>
    <body>
        <button id="btn">시작</button>
        <p id="pEl"></p>    
    </body>

    <script src="https://code.jquery.com/jquery-3.6.0.js" integrity="sha256-H+K7U5CnXl1h5ywQfKtSj8PCmoN9aaq30gDh27Xc0jk=" crossorigin="anonymous"></script>
    <script>
        $('#btn').click(function() {
            $('#pEl').text('jQuery');
        });
    </script>
</html>
<!-- Vue -->
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Vue Example</title>
    </head>
    <body>
        <div id="app">
            <button v-on:click="clickBtn">시작</button>
            <p ref="pEl"></p>
        </div>

        <script src="https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js"></script>
        <script>
            new Vue({
                el: '#app',
                methods: {
                    clickBtn: function() {
                        this.$refs.pEl.innerText = 'Vue';
                    }
                }
            });
        </script>
    </body>
</html>
  • 두 코드 모두 [시작] 버튼을 클릭하면 <p> 태그에 제이쿼리는 'jQuery'를, 뷰는 'Vue'를 각각 삽입한다.

[시작] 버튼을 클릭했을 때 결과 화면

  • 뷰와 제이쿼리 모두 <button> 태그를 클릭했을 때 이벤트를 감지하여 <p> 태그에 텍스트 값을 넣어 준다.
  • 결론적으로, 제이쿼리에서 구현할 수 있는 기능이라면 뷰에서도 모두 구현할 수 있으므로 굳이 제이쿼리를 함께 사용할 필요가 없다.

 

<뷰와 제이쿼리의 잘못된 동거>

  • 또한 뷰의 template 속성으로 화면을 렌더링하면 중간 과정에서 가상 돔이 개입한다.
  • 따라서 인스턴스 라이프 사이클을 정확히 이해하지 못한 상태에서 제이쿼리와 함께 사용하면 오류가 발생하기 쉽다.
  • 그 예로 아래의 코드를 살펴보자.
<template>
    <div id="app">
        {{ msg }}
        <button id="btn">시작</button>
        <p id="pEl"></p>
    </div>
</template>

<script>
export default {
    data () {
        return {
            msg: 'Hello Vue.js!'
        }
    },
    created() {
        $('#btn').click(function() {
            $('#pEl').text('jQuery');
        });
    }
}
</script>

<style>
</style>
  • 위 코드는 앞서 살펴봤던 제이쿼리 예제를 .vue 파일의 인스턴스 라이프 사이클 훅인 created( )에 추가하여 구현한 예제이다.
  • <button> 태그를 클릭했을 때 제이쿼리로 <p> 태그에 텍스트를 삽입하는 코드이다.
  • 화면에는 동일하게 [시작] 버튼이 있고, 클릭하면 <p> 태그에 텍스트 값으로 'jQuery'를 삽입해야 한다.
  • 하지만 실제로 버튼을 클릭해보면 아무런 방응도 일어나지 않는다.

[시작] 버튼을 클릭해도 아무런 반응이 없는 화면

  • 버튼이 정상적으로 동작하지 않는 이유는 3장 인스턴스 라이프 사이클에서 살펴봤던 내용을 보면 인스턴스가 생성된 시점인 created 라이프 사이클 훅에서는 아직 화면의 돔 요소에 접근할 수 없다고 하였다.
  • 따라서 $('#btn')는 <template> 상에 <button id="btn">가 있더라도 코드를 실행하는 시점에서는 <button> 태그를 인식하지 못한다. 그래서 .click( ) 이벤트가 수행되지 않는다.

 

  • 즉, 뷰와 제이쿼리의 화면 요소 접근 방식에는 서로 차이가 있기 때문에 혼용하지 않는 것이 좋다.
  • 그럼 어떻게 제이쿼리로 뷰 template의 화면 요소를 조작할 수 있을까? 다음 팁에서 살펴보자.

 

 

 


해당 글은 [Do it! Vue.js 입문] 책을 토대로 공부한 내용을 기록하기 위하여 작성됨.