ํ•ด๋ฒ„๋‹ˆ 2023. 6. 25. 15:29
๋ฐ˜์‘ํ˜•

Vue๋Š” ๋ฌด์—‡์ธ๊ฐ€?

MVVM ํŒจํ„ด์˜ ๋ทฐ๋ชจ๋ธ(ViewModel) ๋ ˆ์ด์–ด์— ํ•ด๋‹นํ•˜๋Š” ํ™”๋ฉด(View)๋‹จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.

 

 

View

๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋น„์ณ์ง€๋Š” ํ™”๋ฉด์ด๋‹ค. 

์ž…๋ ฅ๋ฐ•์Šค, ๋ฒ„ํŠผ ๋“ฑ์ด view์— ํ•ด๋‹นํ•˜๊ณ ,

html์€ dom์„ ์ด์šฉํ•ด์„œ javascript๋กœ ์กฐ์ž‘์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ๋” ๊ตฌ์„ฑ์ด ๋˜์–ด ์žˆ๋‹ค. 

 

Vue 

ํŠน์ • ์‚ฌ์šฉ์ž๊ฐ€ ํ‚ค๋ณด๋“œ๋ฅผ ์ž…๋ ฅํ•˜๊ฑฐ๋‚˜ ๋งˆ์šฐ์Šค๋ฅผ ํด๋ฆญํ•˜๋ฉด ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.

๊ทธ ์ด๋ฒคํŠธ๋ฅผ ์ค‘๊ฐ„์— view์—์„œ dom listeners๋กœ ์ฒญ์ทจํ•˜๊ฒŒ ๋œ๋‹ค.

๊ทธ๋Ÿฐ ์ด๋ฒคํŠธ๋ฅผ์žก์•„์„œ javascript์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ–๊ณ ์™€ ์ฃผ๊ฑฐ๋‚˜ ํ˜น์€

์ด javascript์— ์ง€์ •ํ–ˆ๋˜ ํŠน์ • ๋กœ์ง์—์„œ ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค. 

๊ทธ๋ž˜์„œ javascript ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€ํ–ˆ์„ ๋•Œ๋Š” data Bindings๋ฅผ ํ•˜๊ฒŒ๋˜๋Š”๋ฐ 

๋งŒ์•ฝ, ๋ฌธ์ž์—ด์ด ๋ฐ”๋€Œ๊ฑฐ๋‚˜ ์ˆซ์ž๊ฐ€ ๋ฐ”๊ผˆ์„ ๋•Œ ๋ฐ”๋กœ data Bindings ์ด์šฉํ•ด view์— ์ ์šฉํ•ด ์ค€๋‹ค. 

 

 

 

 

 

 

 

๊ทธ๋ฆฌ๊ณ  ์œ„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ƒˆ๋กœ๊ณ ์นจ ํ–ˆ์„ ๋•Œ ๋ฐ”๋กœ ๋ฐ˜์˜์ด ๋˜๋Š” ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
    </div>
    <script>
        var div = document.querySelector('#app');
        console.log(div);
        div.innerHTML = 'hello world!!!';
    </script>
</body>
</html>

 

 

 

 

 

 

DATA BINDINGS์˜ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด์ž. 

Object.defineProperty()

๊ฐ์ฒด์˜ ๋™์ž‘์„ ์žฌ์ •์˜ ํ•˜๋Š” API์ด๋‹ค. 

(์›ํ•˜๋Š” ๊ฐ’์œผ๋กœ ์žฌ์ •์˜ ํ•  ์ˆ˜ ์žˆ๋‹ค.)

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

 

Object.defineProperty() - JavaScript | MDN

The Object.defineProperty() static method defines a new property directly on an object, or modifies an existing property on an object, and returns the object.

developer.mozilla.org

 

    <script>
        Object.defineProperty(๋Œ€์ƒ ๊ฐ์ฒด, ๊ฐ์ฒด์˜ ์†์„ฑ, {
            // ์ •์˜ํ•  ๋‚ด์šฉ
        })
    </script>

์ด๋Ÿฐ ์‹์œผ๋กœ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค. 

 

 

 

 

 

 

 <script>
        Object.defineProperty(viewModel, 'str', {
            // get : ์†์„ฑ์— ์ ‘๊ทผํ–ˆ์„ ๋•Œ์˜ ๋™์ž‘์„ ์ •์˜
            get: function () {
                console.log('์ ‘๊ทผ');
            },
            // ์†์„ฑ์— ๊ฐ’์„ ํ• ๋‹นํ–ˆ์„ ๋•Œ์˜ ๋™์ž‘์„ ์ •์˜ 
            set: function (newValue) {
                console.log('ํ• ๋‹น', newValue);
            }
        })
 </script>

์ด๋Ÿฐ์‹์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

 

 

 

 

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="app"></div>
    <script>
        var div = document.querySelector('#app');
        var viewModel = {};

        Object.defineProperty(viewModel, 'str', {
            // get : ์†์„ฑ์— ์ ‘๊ทผํ–ˆ์„ ๋•Œ์˜ ๋™์ž‘์„ ์ •์˜
            get: function () {
                console.log('์ ‘๊ทผ');
            },
            // ์†์„ฑ์— ๊ฐ’์„ ํ• ๋‹นํ–ˆ์„ ๋•Œ์˜ ๋™์ž‘์„ ์ •์˜ 
            set: function (newValue) {
                console.log('ํ• ๋‹น', newValue);
                div.innerHTML = newValue
            }
        })
    </script>
</body>

</html>

์ฝ˜์†”์ฐฝ์— ๊ฐ’์„ ์ž…๋ ฅํ•  ๋•Œ๋งˆ๋‹ค app๋ถ€๋ถ„์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋Š” ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

 

 

Reactivity ์ฝ”๋“œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌํ™” ํ•˜๊ธฐ

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="app"></div>
    <script>
        var div = document.querySelector('#app');
        var viewModel = {};

        // ์ฆ‰์‹œ ์‹คํ–‰ํ•จ์ˆ˜
        (function () {
            function init() {
                Object.defineProperty(viewModel, 'str', {
                    // get : ์†์„ฑ์— ์ ‘๊ทผํ–ˆ์„ ๋•Œ์˜ ๋™์ž‘์„ ์ •์˜
                    get: function () {
                        console.log('์ ‘๊ทผ');
                    },
                    // ์†์„ฑ์— ๊ฐ’์„ ํ• ๋‹นํ–ˆ์„ ๋•Œ์˜ ๋™์ž‘์„ ์ •์˜ 
                    set: function (newValue) {
                        console.log('ํ• ๋‹น', newValue);
                        render(newValue);
                    }
                })
            }

            function render(value) {
                div.innerHTML = value;
            }

            init();
        })();
    </script>
</body>

</html>

 

 

 

 

 

๋ทฐ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ 

๊ฐœ๋ฐœ์ž ๋„๊ตฌ > vue ํด๋ฆญ 

data > message ์— ๊ฐ’์„ ์ž…๋ ฅํ•˜๋ฉด ํŽ˜์ด์ง€์—์„œ๋„ ๋ณ€ํ•˜๋Š” ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

 

 

 

 

 

 

Visual Studio ๊ฟ€ํŒ! 

div#app ๋„ฃ๊ณ  ์—”ํ„ฐ๋ฅผ ๋ˆ„๋ฅด๋ฉด 

 

 

์ž๋™์œผ๋กœ ์ƒ์„ฑ์ด ๋œ๋‹ค. 

 

 

 

 

๋ฐ˜์‘ํ˜•