๐Ÿ’ก๋ผ์šฐํ„ฐ & HTTPํ†ต์‹ 

sujinยท2021๋…„ 11์›” 5์ผ
0

๋ทฐ

๋ชฉ๋ก ๋ณด๊ธฐ
2/6
post-thumbnail

01. ๋ทฐ ๋ผ์šฐํ„ฐ

01-1. ๋ผ์šฐํŒ…์ด๋ž€?

  • ์›นํŽ˜์ด์ง€ ๊ฐ„์˜ ์ด๋™ ๋ฐฉ๋ฒ•, ์‹ฑ๊ธ€ ํŽ˜์ด์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(SPA)์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ
  • ๋ธŒ๋ผ์šฐ์ €์—์„œ ์›น ํŽ˜์ด์ง€๋ฅผ ์š”์ฒญํ•˜๋ฉด ์„œ๋ฒ„์—์„œ ์‘๋‹ต์„ ๋ฐ›์•„ ์›น ํŽ˜์ด์ง€๋ฅผ ๋‹ค์‹œ ์‚ฌ์šฉ์ž์—์„ธ ๋Œ๋ ค์ฃผ๋Š” ์‹œ๊ฐ„ ๋™์•ˆ ํ™”๋ฉด ์ƒ์— ๊นœ๋นก๊ฑฐ๋ฆผ ํ˜„์ƒ์—†์ด ๋งค๋„๋Ÿฌ์šด ์ „ํ™˜ ๊ฐ€๋Šฅ

01-2. ๋ทฐ ๋ผ์šฐํ„ฐ

  • ๋ทฐ์—์„œ ๋ผ์šฐํŒ… ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” ๊ณต์‹ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • ๋ทฐ๋กœ ๋งŒ๋“  ํŽ˜์ด์ง€ ๊ฐ„์— ์ž์œ ๋กญ๊ฒŒ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • <router-link to = "URL๊ฐ’"> : ํŽ˜์ด์ง€ ์ด๋™ ํƒœ๊ทธ/ ํ™”๋ฉด์—์„œ๋Š” <a>๋กœ ํ‘œ์‹œ๋˜๋ฉฐ ํด๋ฆญํ•˜๋ฉด to์— ์ง€์ •ํ•œ URL๋กœ ์ด๋™
  • <router-view> : ํŽ˜์ด์ง€ ํ‘œ์‹œ ํƒœ๊ทธ/ ๋ณ€๊ฒฝ๋˜๋Š” URL์— ๋”ฐ๋ผ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฟŒ๋ ค์ฃผ๋Š” ์˜์—ญ
<div id="app">
    <h1></h1> 
    <p>
        <!-- URL ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ํƒœ๊ทธ -->
        <router-link to="/main"><button type="button">Main ์ปดํฌ๋„ŒํŠธ๋กœ ์ด๋™</button></router-link>
        <router-link to="/login"><button type="button">Login ์ปดํฌ๋„ŒํŠธ๋กœ ์ด๋™</button></router-link>
    </p>
    <!-- URL ๊ฐ’์— ๋”ฐ๋ผ ๊ฐฑ์‹ ๋˜๋Š” ํ™”๋ฉด ์˜์—ญ -->
    <router-view></router-view>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<!-- ๋ผ์šฐํ„ฐ CDN -->
<script src="https://unpkg.com/vue-router@2.0.0/dist/vue-router.js"></script>

<script>
    // Main, Login ์ปดํฌ๋„ŒํŠธ ์ •์˜
    var Main = {template : '<div>main</div>'}
    var Login = {template : '<div>login</div>'}

    // ๊ฐ URL์— ๋งž์ถฐ ํ‘œ์‹œํ•  ์ปดํฌ๋„ŒํŠธ ์ง€์ •
    var routes = [
        {path: '/main', component: Main},
        {path: '/login', component: Login}
    ];

    // ๋ทฐ ๋ผ์šฐํ„ฐ ์ •์˜
    var router = new VueRouter({
        mode : 'history', // ๋ผ์šฐํ„ฐ URL์˜ ํ•ด์‹œ ๊ฐ’(#) ์—†์• ๊ธฐ
        routes
    });

    // ๋ทฐ ์ธ์Šคํ„ด์Šค์— ๋ผ์šฐํ„ฐ ์ถ”๊ฐ€
    var app = new Vue({
        router
    }).$mount('#app');
</script>  

โœ‹ $mount( )

- el์†์„ฑ๊ณผ ๋™์ผํ•˜๊ฒŒ ์ธ์Šคํ„ด์Šค๋ฅผ ํ™”๋ฉด์— ๋ถ™์ด๋Š” ์—ญํ• 
- ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ el์†ก์„ฑ์„ ๋„ฃ์ง€ ์•Š์•˜๋”๋ผ๋„ ์ƒ์„ฑํ•˜๊ณ  ๋‚˜์„œ $mount( )๋ฅผ ์ด์šฉํ•˜๋ฉด ๊ฐ•์ œ๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ํ™”๋ฉด์— ๋ถ™์ผ ์ˆ˜ ์žˆ๋‹ค
- ๋ทฐ ๋ผ์šฐํ„ฐ์˜ ๊ณต์‹๋ฌธ์„œ์—์„œ๋Š” ๋ชจ๋‘ ์ธ์Šคํ„ด์Šค ์•ˆ์— el์„ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ  ๋ผ์šฐํ„ฐ๋งŒ ์ง€์ •ํ•˜์—ฌ ์ƒ์„ฑํ•˜์—ฌ $mount( )๋ฅผ ์ด์šฉํ•œ๋‹ค 

๊ฒฐ๊ณผ๋ฌผ ๋ณด๊ธฐ

01-3. ๋„ค์Šคํ‹ฐ๋“œ ๋ผ์šฐํ„ฐ

  • ๋ผ์šฐํ„ฐ๋กœ ํŽ˜์ด์ง€ ์ด๋™ํ•  ๋•Œ, ์ตœ์†Œ 2๊ฐœ ์ด์ƒ์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
  • ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ์ˆ˜๊ฐ€ ์ ์„ ๋•Œ๋Š” ์œ ์šฉํ•˜์ง€๋งŒ ํ•œ ๋ฒˆ์— ๋งŽ์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ‘œ์‹œํ•˜๋Š”๋ฐ๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ๋‹ค.
<div id="app">
    <!-- URL ๊ฐ’์— ๋”ฐ๋ผ ๊ฐฑ์‹ ๋˜๋Š” ํ™”๋ฉด ์˜์—ญ -->
    <router-view></router-view><!-- user ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฟŒ๋ ค์งˆ ์˜์—ญ -->
</div>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<!-- ๋ผ์šฐํ„ฐ CDN -->
<script src="https://unpkg.com/vue-router@2.0.0/dist/vue-router.js"></script>

<script>
    // ====== ์ปดํฌ๋„ŒํŠธ ๋‚ด์šฉ ์ •์˜ S ====== //
    var User = {
        template : `
            <div>
                User Comonent
                <router-view></router-view>  
            </div>
        `
    };
    var UserProfile = { template: '<p>User Profile Component</p>' };
    var UserPost = { template: '<p>User Post Component</p>' };
    // ====== ์ปดํฌ๋„ŒํŠธ ๋‚ด์šฉ ์ •์˜ E ====== //

    // ====== ๋„ค์Šคํ‹ฐ๋“œ ๋ผ์šฐํŒ… ์ •์˜ S ====== //
    var routes = [
        {
            path:'/user',
            component: User,
            children: [
                {
                    path: 'posts',
                    component : UserPost
                }, 
                {
                    path: 'profile',
                    component : UserProfile
                },
            ]
        }  
    ];
    // ====== ๋„ค์Šคํ‹ฐ๋“œ ๋ผ์šฐํŒ… ์ •์˜ E ====== //

    // ====== ๋ทฐ ๋ผ์šฐํ„ฐ ์ •์˜ S ====== //
    var router = new VueRouter({
        routes
    });
    // ====== ๋ทฐ ๋ผ์šฐํ„ฐ ์ •์˜ E ====== //

    // ====== ๋ทฐ ์ธ์Šคํ„ด์Šค์— ๋ผ์šฐ์ฒ˜ ์ถ”๊ฐ€ S ====== //
    var app = new Vue({
        router
    }).$mount('#app');
    // ====== ๋ทฐ ์ธ์Šคํ„ด์Šค์— ๋ผ์šฐ์ฒ˜ ์ถ”๊ฐ€ E ====== //
</script>	

๊ฒฐ๊ณผ๋ฌผ ๋ณด๊ธฐ

  • ์ฒซ ํ™”๋ฉด์—๋Š” ์•„๋ฌด๊ฒƒ๋„ ๋ณด์ด์ง€ ์•Š์œผ๋ฏ€๋กœ URL๊ฐ’์˜ ๋์— user๋ฅผ ์ž…๋ ฅํ•œ๋‹ค.

01-4. ๋„ค์ž„๋“œ ๋ทฐ

  • ํŠน์ • ํŽ˜์ด์ง€๋กœ ์ด๋™ํ–ˆ์„ ๋•Œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋™์‹œ์— ํ‘œ์‹œํ•˜๋Š” ๋ผ์šฐํŒ… ๋ฐฉ์‹
  • ๋„ค์Šคํ‹ฐ๋“œ ๋ผ์šฐํ„ฐ๊ฐ€ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํฌํ•จํ•˜๋Š” ํ˜•์‹์ด๋ผ๋ฉด, ๋„ค์ž„๋“œ ๋ทฐ๋Š” ์˜ค๋ฅธ์ชฝ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ๊ฐ™์€ ๋ ˆ๋ฒจ์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•œ ๋ฒˆ์— ํ‘œ์‹œํ•œ๋‹ค.
<div id="app">
    <!-- URL ๊ฐ’์— ๋”ฐ๋ผ ๊ฐฑ์‹ ๋˜๋Š” ํ™”๋ฉด ์˜์—ญ -->
    <!-- name์†์„ฑ์€ ์•„๋ž˜ components ์†์„ฑ์— ์ •์˜ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์™€ ๋งค์นญํ•˜๊ธฐ ์œ„ํ•œ ์†์„ฑ -->
    <!-- name์†์„ฑ์ด ์—†์„ ๋•Œ, default๋กœ ํ‘œ์‹œ๋  ์ปดํฌ๋„ŒํŠธ ์˜๋ฏธ -->
    <router-view name="header"></router-view> 
    <router-view></router-view>
    <router-view name="footer"></router-view>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<!-- ๋ผ์šฐํ„ฐ CDN -->
<script src="https://unpkg.com/vue-router@2.0.0/dist/vue-router.js"></script>

<script>
    // ====== ์ปดํฌ๋„ŒํŠธ ๋‚ด์šฉ ์ •์˜ S ====== //
    var Body = { template: '<div>This is Body</div>'};
    var Header = { template: '<div>This is Header</div>'};
    var Footer = { template: '<div>This is Footer</div>'};

    // ====== ์ปดํฌ๋„ŒํŠธ ๋‚ด์šฉ ์ •์˜ E ====== //

    // ====== ๋ทฐ ๋ผ์šฐํ„ฐ ์ •์˜ S ====== //
    var router = new VueRouter({
        routes : [
            {
                path: '/',
                components : {
                    default: Body,
                    header: Header,
                    footer: Footer
                }
            }
        ]
    });
    // ====== ๋ทฐ ๋ผ์šฐํ„ฐ ์ •์˜ E ====== //

    // ====== ๋ทฐ ์ธ์Šคํ„ด์Šค์— ๋ผ์šฐํ„ฐ ์ถ”๊ฐ€ S ====== //
    var app = new Vue({
        router
    }).$mount('#app');
    // ====== ๋ทฐ ์ธ์Šคํ„ด์Šค์— ๋ผ์šฐํ„ฐ ์ถ”๊ฐ€ E ====== //
</script>	
	

๊ฒฐ๊ณผ๋ฌผ ๋ณด๊ธฐ



02. ๋ทฐ HTTP ํ†ต์‹ 

02-1. HTTPํ†ต์‹  ๋ฐฉ๋ฒ•

  • HTTP๋Š” ๋ธŒ๋ผ์šฐ์ €์™€ ์„œ๋ฒ„ ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ํ†ต์‹  ํ”„๋กœํ† ์ฝœ(์ปดํ“จํ„ฐ๊ฐ„ ํ†ต์‹ ์„ ์œ„ํ•ด ์ƒํ˜ธ๊ฐ„ ์ •์˜ํ•œ ๊ทœ์น™)์ด๋‹ค
  • ๋ธŒ๋ผ์šฐ์ €์—์„œ ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋‹ฌ๋ผ๊ณ  ์š”์ฒญ ๋ณด๋‚ด๋ฉด, ์„œ๋ฒ„์—์„œ ์‘๋‹ต์œผ๋กœ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด์ฃผ๋ฉฐ ๋™์ž‘
  • ์›น ์•ฑ HTTPํ†ต์‹ ์˜ ๋Œ€ํ‘œ์ ์ธ ์‚ฌ๋ก€ : ์ œ์ด์ฟผ๋ฆฌ, ajax
  • ajax๋Š” ๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œ๊ธฐํ•  ๋•Œ ํ™”๋ฉด ์ „์ฒด๋ฅผ ๊ฐฑ์‹ ํ•˜์ง€ ์•Š๊ณ ๋„ ํ™”๋ฉด์˜ ์ผ๋ถ€๋ถ„๋งŒ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
  • ๋ทฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ : ๋ทฐ ๋ฆฌ์†Œ์Šค, ์•ก์‹œ์˜ค์Šค(axios)

02-2. ๋ทฐ ๋ฆฌ์†Œ์Šค

<div id="app">
    <button v-on:click="getData">ํ”„๋ ˆ์ž„์›Œํฌ ๋ชฉ๋ก ๊ฐ€์ ธ์˜ค๊ธฐ</button>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<!-- ๋ทฐ ๋ฆฌ์†Œ์Šค CDN -->
<script src="https://cdn.jsdelivr.net/npm/vue-resource@1.3.4"></script>
<script>
    new Vue({
        el:'#app',
        methods: {
            getData: function() {
                this.$http.get(`https://raw.githubusercontent.com/joshua1988/doit-vuejs/master/data/demo.json`)
                .then(function(response){
                    console.log(response);
                    console.log(JSON.parse(response.data)); // ๊ฐ์ฒด ์ „ํ™˜
                });
            }
        }
    });
</script>	

๊ฒฐ๊ณผ๋ฌผ ๋ณด๊ธฐ

02-3. ์•ก์‹œ์˜ค์Šค

  • ๋ทฐ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” HTTPํ†ต์‹  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • ๋ทฐ ๋ฆฌ์†Œ์Šค๋ณด๋‹ค ๋” ์•ˆ์ •์ ์œผ๋กœ ์ง€์›๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • Promise ๊ธฐ๋ฐ˜์˜ APIํ˜•์‹ ์ด ๋‹ค์–‘ํ•˜๊ฒŒ ์ œ๊ณต๋˜์–ด ๋ณ„๋„์˜ ๋กœ์ง์„ ๊ตฌํ˜„ํ•  ํ•„์š”์—†์ด ๊ฐ„ํŽธํ•˜๊ฒŒ ์›ํ•˜๋Š” ๋กœ์ง์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค

โœ‹ promise ๊ธฐ๋ฐ˜์˜ API ํ˜•์‹์ด๋ž€?

  • ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜์—ฌ ๋ฐ›์•„์˜ค๋Š” ๋™์ž‘๊ณผ ๊ฐ™์€ ๋น„๋™๊ธฐ ๋กœ์ง ์ฒ˜๋ฆฌ์— ์œ ์šฉํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด์ด๋‹ค
  • ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๊ณ  ๋ฐ›์•„์˜ฌ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚ด๋Š” ๋กœ์ง์„ ์‹คํ–‰ํ•ด์•ผ ํ•  ๋•Œ ํ™œ์šฉ๋œ๋‹ค
  • ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์™”์„ ๋•Œ Promise๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ํ™”๋ฉด์— ํ‘œ์‹œํ•˜๊ฑฐ๋‚˜ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋“ฑ ํŠน์ • ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•œ๋‹ค
// HTTP GET์š”์ฒญ
axious.get('URL ์ฃผ์†Œ').then().catch();

ํ•ด๋‹นURL ์ฃผ์†Œ์— ๋Œ€ํ•ด HTTP GET์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค. ์„œ๋ฒ„์—์„œ ๋ณด๋‚ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ •์ƒ์ ์œผ๋กœ ๋ฐ›์•„์˜ค๋ฉด then() ์•ˆ์— ์ •์˜ํ•œ ๋กœ์ง์ด ์‹คํ–‰๋˜๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ฌ ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด catch()์— ์ •์˜ํ•œ ๋กœ์ง์ด ์ˆ˜ํ–‰๋œ๋‹ค.

// HTTP POST์š”์ฒญ
axious.post('URL ์ฃผ์†Œ').then().catch();

ํ•ด๋‹นURL ์ฃผ์†Œ์— ๋Œ€ํ•ด HTTP POST์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค. then()๊ณผ catch()์˜ ๋™์ž‘์€ ์œ„์—์„œ ์‚ดํŽด๋ณธ ๋‚ด์šฉ๊ณผ ๋™์ผํ•˜๋‹ค.

// HTTP ์š”์ฒญ์— ๋Œ€ํ•œ ์˜ต์…˜ ์†์„ฑ ์ •์˜
axious({
	method: 'get',
  	url: 'URL ์ฃผ์†Œ',
  	...
});

HTTP ์š”์ฒญ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์†์„ฑ๋“ค์„ ์ง์ ‘ ์ •์˜ํ•˜์—ฌ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ๋ฐ์ดํ„ฐ ์š”์ฒญ์„ ๋ณด๋‚ผ URL, HTTP ์š”์ฒญ ๋ฐฉ์‹, ๋ณด๋‚ด๋Š” ๋ฐ์ดํ„ฐ ์œ ํ˜•, ๊ธฐํƒ€ ๋“ฑ๋“ฑ...

<div id="app">
    <button v-on:click="getData">ํ”„๋ ˆ์ž„์›Œํฌ ๋ชฉ๋ก ๊ฐ€์ ธ์˜ค๊ธฐ</button>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<!-- ๋ทฐ ๋ฆฌ์†Œ์Šค CDN -->
<!-- <script src="https://cdn.jsdelivr.net/npm/vue-resource@1.3.4"></script> -->
<!-- ์•ก์‹œ์˜ค์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋กœ๋”ฉ -->
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script>
    new Vue({
        el:'#app',
        methods: {
            getData: function() {
                axios.get(`https://raw.githubusercontent.com/joshua1988/doit-vuejs/master/data/demo.json`)
                .then(function(response){
                    console.log(response);
                });
            }
        }
    });
</script>		

๊ฒฐ๊ณผ๋ฌผ ๋ณด๊ธฐ



์ฐธ๊ณ  do it vue.js

profile
๊ฐœ๋ฐœ๋Œ•๋ฐœ

0๊ฐœ์˜ ๋Œ“๊ธ€