반응형

프론트 개발을 하며 서버단과 소통을 하다보면 REST API라는 말을 자주 듣게 된다.

REST API는 웹 기반의 시스템에서 클라이언트와 서버가 원활하게 통신할 수 있게 해주는 일종의 지침이자 설계 원칙이다.

 

1. REST

REST는 Representational State Transfer의 약자로 

HTTP URI를 통해 자원(Resource)를 명시하고, HTTP 메소드 (GET, POST, PUT, PATCH, DELETE)를 통해 해당 자원에 대한 CRUD(Create, Read, Update, Delete)를 적용하는 것을 의미한다.

 

2020.04.10 - [Frontend/Web] - URI vs URL 비교

 

자원 즉, 문서, 사진, 그림, 데이터 등의 정보를 URI를 통해 명시한다 (이 때 URI는 동사가 아닌 명사로만 이뤄진다.)

 

ex) 특정 예술가들의 정보가 자원일 경우 /artists 라고 URI에 자원을 명시한다. (명사, 복수형으로 작성한다.)

 

GET        /artists       -> 아티스트 목록을 가져온다.

GET        /artists/musician        -> 아티스트 중 세부 카테고리 뮤지션 목록을 가져온다.

POST      /artists        -> 아티스트 목록에 새로운 아티스트 정보를 추가한다.

PUT         /artists        -> 아티스트 목록을 수정한다.

DELETE  /artists        -> 아티스트 목록을 제거한다.

 

위와 같이 artists 라는 복수형 명사로 URI에 자원을 명시한다.

그리고 GET, POST, PUT, DELETE 와 같은 HTTP 메소드를 통해서 서버에 요청을 하기 때문에

REST API 메시지만으로도 어떤 자원을 어떤식으로 처리할 것인지를 명시적으로 알 수 있다.

 

그리고 클라이언트에서 URI에 자원을 적어서 HTTP 메소드로 요청을 하면

서버에서는 적절한 응답을 보내게 되는데 JSON, XML, TEXT, RSS 등 여러 형태로 응답을 받을 수 있지만

주로 JSON이나 XML을 통해 데이터를 주고 받는 것이 일반적이다.

 

 

2. REST API 특징

1. Uniform Interface(인터페이스 일관성)

표준화된 인터페이스로 다양한 클라이언트에서 서버로 접근이 가능하다. 

URI로 지정한 자원에 대해 요청을 통일되게 수행한다.

또한 HTTP 표준 프로토콜에 따르는 모든 플랫폼에서 사용이 가능하기 때문에 특정 언어나 기술에 종속되지 않는다.

 

2. Stateless(무상태성)

서버가 클라이언트 요청에 대한 상태를 저장하지 않는다. 그렇기 때문에 API 서버는 클라이언트의 요청만 단순 처리한다.

클라이언트의 이전 요청이나 세션, 쿠키 정보를 별도로 저장 및 관리하지 않기 때문에 서비스의 자유도가 높아진다. (단순 처리만 하면 돼서 구현이 단순해진다.)

 

3. Cacheble(캐시가능)

HTTP 캐싱을 활용할 수 있어서 성능이 향상되고 대량의 요청을 효율적으로 처리할 수 있다.

*무상태성과의 차이라면 무상태성은 서버가 클라이언트의 '상태'를 저장하지 않고 요청마다 독립적으로 처리하는 것이고

캐시 가능은 서버의 '응답' 데이터를 클라이언트나 중간 프록시 서버에서 저장해서 재사용 할 수 있는 것이다.

 

4. Server-Client(서버-클라이언트 구조)

자원이 있는 쪽이 서버, 요청하는 쪽이 클라이언트가 된다. 

서버는 API를 제공하고 비즈니스 로직 처리 및 저장을 담당하고

클라이언트는 사용자 인증이나 세션, 로그인 등을 직접 관리하고 책임진다.

이런식으로 역할을 확실하게 분리해서 서로간의 의존성을 줄인다.

 

5. Self-descriptiveness(자체 표현 구조)

REST API 메시지만 보고도 어떤 자원에 어떤 요청을 하는지 쉽게 이해할 수 있다.

 

 

 


 

https://aws.amazon.com/ko/what-is/restful-api/

https://junvelee.tistory.com/107

 

 

반응형

'Frontend > Vue.js, React' 카테고리의 다른 글

CSR, SSR, 유니버셜 렌더링  (0) 2025.09.10
[vue 2 기초] Axios (액시오스)  (0) 2023.11.07
[vue 2 기초] 라우터  (1) 2023.11.06
[vue 2 기초] 컴포넌트 통신(props, event emit)  (1) 2023.11.04
[Vue 2 기초] 컴포넌트  (0) 2023.11.03
반응형

프론트엔드 프레임워크인 Vue나 React를 공부하다보면 많이 보게되는 개념이 CSR, SSR이다. 

각 용어는 웹 페이지가 어떻게 렌더링 되는지에 대한 방식을 얘기한다.

 

1. CSR

CSR은 Client Side Rendering으로 가장 큰 특징으로 웹 페이지를 클라이언트(브라우저)에서 렌더링 하는 것이다.

사용자가 웹 페이지를 이용할 때 클라이언트(브라우저)가 서버에 웹페이지 요청을 하면 서버는 HTML, CSS, Javascript 파일을 전달해주고 클라이언트에서는 서버에서 받은 해당 리소스로 직접 페이지를 그린다.(렌더링한다.)

 

클라이언트 --(웹 페이지 요청)--->  서버

클라이언트  <---(html, css, js 리소스 전달)---  서버

 

그래서 서버에서 내려준 response 값을 봐도 소스는 <div id="app"> 과 같이 간단한 소스만 받아오는 것을 알 수 있다.

 

일반적인 SPA 프레임워크가 CSR에 해당한다. (Vue.js, React...)

 

- 장점

1. 초기에 페이지에 필요한 소스를 한 번에 렌더링 하기 때문에 페이지 전환할 때 빠른 속도뛰어난 사용자 경험을 제공한다.

2. 대부분의 연산을 클라이언트에서 처리하기 때문에 서버 부하가 감소한다.

 

- 단점

1. 장점 1에서 말했 듯이 초기에 페이지에 필요한 소스를 한 번에 렌더링 하기 때문에 초기 로딩 시간이 느려질 수 있다.

2. 최초 HTML에 실제 페이지에 노출되는 소스가 아닌 <div id="app"> 과 같이 렌더링을 위한 소스만 보여지기 때문에 SEO에 불리하다.

 

2. SSR

SSR은 Server Side Rendering으로 CSR과 다르게 웹 페이지를 서버에서 렌더링한다.

사용자가 웹 페이지를 이용할 때 클라이언트를 통해 요청을 하면 서버에서 HTML을 다 렌더링한 소스를 클라이언트로 전달한다.

 

클라이언트 --(웹 페이지 요청)--->  서버

클라이언트  <---(서버에서 그린 html 소스 전달)---  서버

 

그래서 서버에서 내려준 response 값에는 내가 요청한 html 소스가 담겨져서 받아온다.

CSR과 다르게 사용자가 페이지를 요청하면 요청을 할 때마다 HTML을 서버에서 그려서 클라이언트로 내려준다.

(CSR은 한 번에 내려준다.)

 

- 장점

1. 서버에서 최초 화면에 대한 HTML을 먼저 제공해주기 때문에 초기 로딩 속도가 빠르다.

2. 최초 HTML에 실제 페이지에 노출되는 소스가 적용되어있기 때문에 SEO에 유리하다.

 

- 단점

1. CSR과 다르게 페이지를 한 번에 로드하는 것이 아닌 사용자의 요청에 따라 필요한 데이터를 서버에서 가져오기 때문에 사용자 경험이 떨어질 수 있다.

2. 서버에 매번 요청을 하기 때문에 서버 부하가 증가할 수 있다.

 

 

3. 유니버셜 렌더링(Universal Rendering)

유니버셜 렌더링은 CSR과 SSR의 장점을 결합해서 사용하는 개념으로 Nuxt.js, Next.js를 통해 사용하는 것이 일반적이다.

유니버셜 렌더링은 초기 화면을 서버에서 SSR로 렌더링 한 후에 사용자들의 페이지 상호작용은 클라이언트에서 CSR로 처리하는 하이브리드형 방식이다.

 

서버에서 생성된 정적인 HTML을 클라이언트에서 동적이고 상호작용 가능한 애플리케이션으로 변환

- 사용자는 먼저 뿌려진 HTML을 보기 때문에 초기 로딩 시간이 빠르다. (자바스크립트가 로드되기 전에 컨텐츠를 본다.)

- 검색엔진이 서버에서 완전히 뿌려진 HTML을 크롤링해서 SEO가 향상 된다.

- 클라이언트에서는 하이드레이션 과정을 거쳐서 서버가 내려준 HTML을 스크립트로 제어할 수 있도록 처리해준다.

 

 

반응형

'Frontend > Vue.js, React' 카테고리의 다른 글

REST API란?  (0) 2025.09.10
[vue 2 기초] Axios (액시오스)  (0) 2023.11.07
[vue 2 기초] 라우터  (1) 2023.11.06
[vue 2 기초] 컴포넌트 통신(props, event emit)  (1) 2023.11.04
[Vue 2 기초] 컴포넌트  (0) 2023.11.03
반응형

Axios(액시오스)는 뷰에서 권고하고 있는 HTTP 통신 라이브러리 이고

Promise 기반이다.

 

*Promise : 자바스크립트 비동기 처리 패턴

 

HTTP 통신 라이브러리인 Axios를 알아보기 전에 간단하게 HTTP 통신 구조를 알아보려한다.

1. HTTP 통신 구조 (클라이언트 <-> 서버)

브라우저 (클라이언트)와 서버에서 HTTP 통신 방법을 간단하게 정리하자면

  1. 브라우저(클라이언트)에서 HTTP Requset를 통해 서버의 특정 백엔드 로직을 실행하고
  2. 백엔드 로직을 통해 DB에서 로직에 맞는 데이터를 가져온다.
  3. 가져온 데이터를 또 다시 특정 백엔드 로직을 통해 HTTP Response로 브라우저(클라이언트)에 응답을 한다.
  4. HTTP Response를 통해 가져온 데이터를 브라우저에 뿌려준다.

위와 같이 HTTP 통신 구조를 간략하게 정리할 수 있다.

 

2. Axios 적용

CDN 방식 or NPM 방식으로 axios 라이브러리를 설치한 뒤에

<div id="app">
    <button v-on:click="getData">get user</button><!-- 버튼 클릭시 vue 인스턴스에 저장해놓은 getData 메소드를 호출한다. -->
    <div> {{ users }} </div>
</div>
 
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script>
    new Vue({
        el: '#app',
        data: {
            users: []
        },
        methods: {
            getData: function(){
                var vm = this;
                axios.get('https://jsonplaceholder.typicode.com/users/')    // https://jsonplaceholder.typicode.com/users/ 에서 데이터 받아오기
                    .then(function(response){
                        console.log(response.data);     // response에서 data 속성 값 출력
                        // this.users = response.data;  // 함수 안에 this로 해당 this는 vue 인스턴스에 대한 this가 window를 가르킨다.
                        vm = response.data;             // getData 함수 내부에 this를 따로 변수에 담아서 사용
                    }.catch(function(){
                        console.log(error);
                    });
            }
        }
    });
</script>

 

vue 인스턴스 methods에 axios를 사용하기 위한 함수를 등록해준다.

axios.get() : 데이터 가져오기

axios.then() : 비동기 통신이 성공했을 경우 처리

axios.catch() : 통신시 오류가 발생했을 때의 처리

 

위의 소스와 같이 작성할 때 주의해야 할 점은 vue 인스턴스 내부에 있는 데이터에 접근하기 위해 this를 사용하게 되는데

함수 내에서 this를 사용하게되면 함수 내부에서 this를 가르키게 되어 this는 윈도우를 가르키게 된다.

 

그렇게 때문에 getData 메소드 내부에 this를 별도 변수에 담아서 사용하거나

then에서 function(){} 이 아닌 => 화살표 함수 방식으로 작성하여 this가 원하는 방향으로 지정되도록 처리할 필요가 있다.

 

 


출처

인프런 'Vue.js 시작하기 - Age of Vue.js' 강좌

 

 

반응형

'Frontend > Vue.js, React' 카테고리의 다른 글

REST API란?  (0) 2025.09.10
CSR, SSR, 유니버셜 렌더링  (0) 2025.09.10
[vue 2 기초] 라우터  (1) 2023.11.06
[vue 2 기초] 컴포넌트 통신(props, event emit)  (1) 2023.11.04
[Vue 2 기초] 컴포넌트  (0) 2023.11.03
반응형

라우터는 뷰 라이브러리를 이용하여 SPA(Single Page Appliaction) 구현을 할 때 사용하는 라이브러리이다.

 

1. 라우터 연결

라우터를 사용하기 위해서는 CDN 방식 혹은 NPM 방식으로 설치할 수 있다.

 

CDN 방식은 script 태그에 CDN 링크를 추가해서 연결을 하는 방식이고

NPM 방식은 Vue CLI로 프로젝트를 생성하거나 NPM 기반으로 프로젝트를 생성해서 라우터 설치 명령어 입력을 통해 설치한다.

<!-- CDN 방식 -->
<script src="https://unpkg.com/vue@2"></script>
<script src="https://unpkg.com/vue-router@3"></script>
  
<!-- NPM 방식(아래 명령어 입력) -->
npm install vue-router@3

 

위와 같이 설치한 뒤 아래 소스와 같이 뷰 라우터를 등록할 수 있다.

 

var router = new VueRouter({
    // 라우터 옵션
});
 
// 인스턴스에 라우터 인스턴스를 등록
new Vue({
    router: router,     //  라우터 인스턴스의 변수명으로 등록
});

 

2. 라우터 옵션

라우터를 연결 및 등록한 뒤 라우터를 사용할 때 라우터 옵션을 지정한다.

2가지의 필수 옵션이 있다.

 

- routes: 라우팅 할 URL과 컴포넌트 값 지정(페이지의 라우팅 정보)

- mode: URL의 해쉬 값 제거 속성

 

var LoginComponent = {
    template: '<div>Login</div>'
}
var MainComponent = {
    template: '<div>Main</div>'
}
 
var router = new VueRouter({
    mode: 'history',
    routes: [   // 배열 형식으로 지정
        {
            // 페이지의  url 이름
            path:'/login',
            // 해당 url에서 표시될 컴포넌트
            component: LoginComponent,
        },
        {
            path: '/main',
            component: MainComponent,
        }
    ]
});

 

위와 같이 라우터 옵션들을 입력해서 특정 컴포넌트들을 세부 페이지처럼 사용할 수 있게 url을 지정하고 연결해준다.

 

3. router-view

라우터 옵션으로 라우터를 컴포넌트와 연결하고 화면에 해당 컴포넌트를 뿌릴 때 router-view를 사용한다.

<div id="app">
    <router-view></router-view><!-- 라우터에 등록한 LoginComponent 혹은 MainComponent를 화면에 보여준다 -->
</div>

 

localhost:0000/router.html/login 으로 url을 입력시 LoginComponent 내용이,

localhost:0000/router.html/main 으로 url을 입력시 MainComponent 내용이 <router-view> 영역에 뿌려진다.

 

4. router-link

사용자들이 일반적인 웹 페이지에서 a태그를 통해 링크 이동을 하여 페이지를 탐색하듯

vue 화면에서 특정 링크를 클릭해서 화면을 이동할 수 있게 해주는 것이 router-link 이다. (실제 html 소스상에 <router-link> 는 a태그로 출력된다.)

<div id="app">
    <!-- <router-link to="이동할 URL"></router-link> -->
    <router-link to="/login">로그인</router-link>
    <router-link to="/main">메인</router-link>
 
    <router-view></router-view> <!-- routerlink를 클릭할 때마다 to에 연결된 url의 화면이 출력된다. -->
</div>
 
<!-- 출력
<a href="/login">로그인</a>
<a href="/main">메인</a>
-->

 

 


출처

인프런 'Vue.js 시작하기 - Age of Vue.js' 강좌

 

 

반응형
반응형

컴포넌트의 데이터는 각 컴포넌트에서 관리하기 때문에 각 컴포넌트는 고유한 데이터 유효범위를 갖는다.

따라서 컴포넌트간 데이터를 주고 받기 위해서는 특별한 규칙을 따라야한다.

 

 

위와 같이 상→하로 props를 통해 데이터를 전달하고

하→상은 이벤트를 올려서 전달한다.

 

*컴포넌트 통신 규칙 : 직접 연관이 되어있는 상, 하위 컴포넌트 간의 데이터 전달이 가능하다. (데이터 오류 발생시 추적에 용이)

 

 

1. props (상 -> 하)

props는 위에서 설명한 것과 같이 상위 컴포넌트에서 하위 컴포넌트로 데이터를 전달하는 방법이다.

 

부모 컴포넌트에 등록되어 있는 데이터를 가져오는 기본적인 사용 방법은 

 

1. 자식(하위) 컴포넌트에 props 속성을 사용해 프롭스 속성명을 등록해준다.

var appHeader = {
    template: '<h1>Title</h1>',
    props: ['propsdata']    // 프롭스 속성 명은 임의로 지정이 가능하다.
}
 
new Vue({
    el: '#app',
    component: {
        'app-header' : appHeader,
    },
    data: {
        message: 'hi',
    }
})

 

2. 자식 컴포넌트에서 v-bind를 사용해서 상위 컴포넌트의 데이터 속성을 해당하는 자식 컴포넌트로 전달한다. 

<!-- v-bind:프롭스 명="상위 컴포넌트의 data 속성" -->
<app-header v-bind:propsdata="message"></app-header>

 

크게 위 1, 2번의 방법으로 적용할 수 있다.

 

<div id="app">
    <app-header v-bind:propsdata="message"></app-header>
    <app-content v-bind:propsnum="num"></app-content>
</div>
 
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    var appHeader = {
        template: '<h1>{{ propsdata }}</h1>',   // {{ 데이터 }} 이중 괄호를 통해 부모 컴포넌트로부터 받은 props 값을 그대로 뿌려줄 수 있다.
        props: ['propsdata'],
    }
    var appContent = {
        // 각 영역 안에 데이터는 고유의 데이터로 가진다. 따라서 appHeader와 마찬가지로 propsdata라는 같은 이름으로 사용해도 된다.
        template: '<div>{{ propsnum }}</div>',
        props: ['propsnum'],
    }
    new Vue({
        el: '#app',
        components: {
            'app-header' : appHeader,
            'app-content' : appContent,
        },
        data: {
            message: 'hi',
            num: 10
        }
    });
</script>

 

 

2. Event Emit (하 -> 상)

부모 컴포넌트의 데이터를 가져올 때 props 속성을 사용한다면

자식 컴포넌트에서는 이벤트 발생(emit)을 통해 상위로 이벤트를 전달해준다.

 

방법은

1. 자식 컴포넌트에 event emit 메소드를 등록해준다.

// appHeader에 있는 button을 클릭하면 passEvent 함수가 실행되고 그 함수는 'pass'라는 이벤트명을 가진 event emit용 함수이다.
var appHeader = {
    template: '<button v-on:click="passEvent">click me</button>',
    methods: {
        passEvent: function(){  //passEvent라는 메소드를 통해 해당 자식 컴포넌트에 $emit 이벤트명은 정의한다.
            this.$emit('pass'); // 이벤트 이름 등록 : $emit('이벤트명')
        }
    }
}
 
new Vue({
    el: '#app',
    components: {
        'app-header': appHeader,
    },
    methods: {
        logText: function(){
            console.log('hi');
        },
    }
})

 

2. 자식 컴포넌트에 $emit으로 등록한 이벤트 명을 통해 부모 컴포넌트의 메소드를 가져온다.

<!-- v:on:하위 컴포넌트에서 발생한 이벤트 이름="상위 컴포넌트의 메소드 이름" -->
<app-header v-on:pass="logText"></app-header>

 

위와 같이 작업하면 app-header 영역에 버튼이 생기고

해당 버튼을 클릭하면 자식 요소의 버튼을 클릭하지만 부모 요소에 logText() 메소드가 실행된다.

<div id="app">
    <!-- v:on:하위 컴포넌트에서 발생한 이벤트 이름="상위 컴포넌트의 메소드 이름" -->
    <app-header v-on:pass="logText"></app-header>
    <app-content v-on:number="addNum"></app-content>
</div>
 
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    var appHeader = {
        template: '<button v-on:click="passEvent">click me</button>',
        methods: {
            passEvent: function(){
                this.$emit('pass');
            }
        }
    }
    var appContent = {
        template: '<button v-on:click="addNumber">add</button>',
        methods: {
            addNumber: function(){
                this.$emit('number');
            }
        }
    }
    new Vue({
        el: '#app',
        components: {
            'app-header': appHeader,
            'app-content': appContent,
        },
        methods: {
            logText: function(){
                console.log('hi');
            },
            addNum: function(){
                this.num++
                console.log(this.num);
            }
        },
        data: {
            num: 10,
        }
    })
</script>

 

위와 같은 소스로 자식 컴포넌트에서의 이벤트로 부모 컴포넌트의 data 값을 변경할 수도 있다.

 

3. 같은 레벨에서의 컴포넌트 통신 방법

같은 레벨의 컴포넌트에서는 다이렉트로 데이터를 통신할 수 없고 연결되어 있는 부모 컴포넌트를 통해서 데이터를 주고받을 수 있다.

 

AppContent에서 버튼을 클릭해서 10이라는 숫자를 AppHeader로 보내기 위해서는 다음과 같이 적용할 수 있다.

 

1. AppContent에서 Root 컴포넌트로 event emit을 이용해서 이벤트를 전달한다.

<div id="app">
    <app-header></app-header>
    <app-content v-on:pass="deliverNum"></app-content>
</div>
 
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    var appHeader = {
        template: '<div>header</div>',
    }
    var appContent = {
        template: '<div>Content <button v-on:click="passNum">pass</button></div>',
        methods: {
            passNum: function(){
                this.$emit('pass', 10); // 10이라는 숫자를 pass 이벤트에 담아 보낸다.
            },
        }
    }
    new Vue({
        el: '#app',
        components: {
            'app-header' : appHeader,
            'app-content' : appContent,
        },
        data: {
            num: 0,
        },
        methods: {
            deliverNum: function(value){    // value는 $emit으로 보낸 10이 담겨온다.
                this.num = value;
            }
        }
    });
</script>

 

2. 부모 컴포넌트에서 AppContent로부터 받아온 이벤트를 AppHeader로 props를 통해 전달한다.

<div id="app">
    <app-header v-bind:propsdata="num"></app-header>
    <app-content v-on:pass="deliverNum"></app-content>
</div>
 
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    var appHeader = {
        template: '<div>header</div>',
        props: ['propsdata']    // props 등록
    }
    var appContent = {
        template: '<div>Content <button v-on:click="passNum">pass</button></div>',
        methods: {
            passNum: function(){
                this.$emit('pass', 10);
            },
        }
    }
    new Vue({
        el: '#app',
        components: {
            'app-header' : appHeader,
            'app-content' : appContent,
        },
        data: {
            num: 0,
        },
        methods: {
            deliverNum: function(value){
                this.num = value;
            }
        }
    });
</script>

 

위 처럼 작업하게 되면 AppContent에 있는 버튼을 클릭할 때 

AppHeader에 propsdata:10 값이 전달된다.

 

 

 


참고

인프런 'Vue.js 시작하기 - Age of Vue.js' 강좌

 

 

 

반응형

'Frontend > Vue.js, React' 카테고리의 다른 글

[vue 2 기초] Axios (액시오스)  (0) 2023.11.07
[vue 2 기초] 라우터  (1) 2023.11.06
[Vue 2 기초] 컴포넌트  (0) 2023.11.03
[Vue 2 기초] 인스턴스  (0) 2023.11.03
Vue.js 란?  (0) 2023.11.03
반응형

컴포넌트란 화면을 영역별로 구분하고 개발할 수 있는 뷰의 기능이다. 

컴포넌트 단위로 화면을 개발하게 되면 특정 영역을 여러 페이지에서 사용하게 될 때 특정한 컴포넌트를 가져와서 사용하면 되기 때문에 재사용성이 올라가고 효율이 올라간다.

 

1. 전역 컴포넌트

<div id="app">
    <app-header></app-header>   <!-- 컴포넌트를 생성하면 컴포넌트 태그를 써서 적용한다. -->
    <app-content></app-content>
</div>
 
<!-- 적용 후
<div id="app">
    <h1>Header</h1>
    <div>Content</div>
</div>
-->
 
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    // Vue.component('컴포넌트 이름', 컴포넌트 내용);
    // 전역 컴포넌트
    Vue.component('app-header', {
        template: '<h1>Header</h1>',
    });
    Vue.component('app-content', {
        template: '<div>Content</div>',
    });
 
    new Vue({
        el: '#app',
    });
</script>

 

위와 같은 소스를 Vue 개발자 도구에서 확인해보면

<Root>
    <app-header>
    <app-content>

 

위와 같이 생성된다.

(인스턴스를 생성하면 기본적으로 <Root> 컴포넌트가 만들어진다.)

 

위 방법은 전역 컴포넌트를 등록하는 방법이고 실 서비스에서는 주로 지역 컴포넌트를 사용하게 된다.

 

2. 지역 컴포넌트

<div id="app">
    <app-footer></app-footer>
</div>
 
<!-- 적용 후
<div id="app">
    <footer>Footer</footer>
</div>
-->
 
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    new Vue({
        el: '#app',
        // 지역 컴포넌트
        components: {
            // '키(컴포넌트 이름)' : 값(컴포넌트 내용)
            'app-footer' : {
                template: '<footer>Footer</footer>'
            }
        },
    });
</script>

 

3. 전역 컴포넌트, 지역 컴포넌트의 차이

- 지역 컴포넌트는 components 속성에 있는 컴포넌트들을 통해 해당 페이지를 봤을 때 어떤 컴포넌트들이 연결이 되어있는지 명시적으로 확인이 수월하다. (일반적으로는 지역 컴포넌트 사용)

- 전역 컴포넌트는 플러그인이나 라이브러리와 같이 전역으로 사용해야하는 컴포넌트만 등록해서 사용한다.

 

 

 


참고

인프런 'Vue.js 시작하기 - Age of Vue.js' 강좌

 

 

 

반응형

'Frontend > Vue.js, React' 카테고리의 다른 글

[vue 2 기초] 라우터  (1) 2023.11.06
[vue 2 기초] 컴포넌트 통신(props, event emit)  (1) 2023.11.04
[Vue 2 기초] 인스턴스  (0) 2023.11.03
Vue.js 란?  (0) 2023.11.03
SPA 란?  (0) 2020.04.20
반응형

인스턴스는 뷰를 개발할 때 필수로 생성해야하는 코드이다.

 

인스턴스는 기본적으로 new Vue() 로 생성한다.(Vue 2 기준)

 

<div id="app"></div>
 
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    new Vue({
        el: '#app',     // 인스턴스가 그려지는 화면의 시작점
        template: ,     // 화면에 표시할 요소 (HTML, CSS 등)
        data: ,         // 뷰의 반응성(Reactivity)이 반영된 데이터 속성
        methods: ,      // 화면의 동작과 이벤트 로직을 제어하는 메소드
        created: ,
        watch: ,
    });
</script>

 

vue에서 사용할 수 있는 속성과 API는 위와 같이 el, template, data, methods, created, watch 등이 있다.

 

*인스턴스 내 this

인스턴스 내에서 this는 인스턴스 객체 자체를 가르킨다.

var Vue = {
    el: '',
    data: {
        num: 10,
    },
    methods: {
        getNumber: function(){
            console.log(this.num);  // 10 출력
        }
    }
}

 

 

 


참고

인프런 'Vue.js 시작하기 - Age of Vue.js' 강좌

 

 

 

 

반응형

'Frontend > Vue.js, React' 카테고리의 다른 글

[vue 2 기초] 라우터  (1) 2023.11.06
[vue 2 기초] 컴포넌트 통신(props, event emit)  (1) 2023.11.04
[Vue 2 기초] 컴포넌트  (0) 2023.11.03
Vue.js 란?  (0) 2023.11.03
SPA 란?  (0) 2020.04.20
반응형

일반적인 웹에서는 html, css, javascript를 이용해서 화면을 구성하고 조작한다.

 

Vue.js 

 

 

<div id="app"></div>
 
<script>
    const app = document.querySelector('#app');
    let str = 'hello';
    app.innerHTML = str;    // #app 영역에 hello 텍스트 노출
 
    str = 'Hi';
    app.innerHTML = str;    // str 변수의 값을 바꿨지만 바뀐 내용이 즉시 반영되는 것이 아닌 innerHTML 을 통해 다시 선언해줘야 바뀐 변수값이 #app 영역에 적용된다.
</script>

 

반면 Vue.js는 MVVM(Model-View-ViewModel) 패턴으로 

화면에서 보여지는 내용들을(View) Vue의 Dom Listeners를 통해 자바스크립트에 있는 데이터를 바꿔주거나 특정 자바스크립트를 실행하게 된다.

그리고 Dom Listeners를 통해 자바스크립트의 데이터가 변경 됐을 때 Data Bindings를 통해 변경된 내용을 화면에 반영하게 된다.

<div id="app"></div>
 
<script>
    const app = document.querySelector('#app');
    const viewModel = {};
 
    // Object.defineProperty(대상 객체, 객체의 속성, {
    //      정의할 내용
    // })
 
    Object.defineProperty(viewModel, 'str', {
        // 속성에 접근했을 때의 동작을 정의
        get: function(){
            console.log('접근')       // 콘솔창에서 viewModel.str 을 입력하면 '접근' 출력
        }
        // 속성에 값을 할당했을 때의 동작을 정의
        set: function(newValue){
            console.log('할당', newValue)     // 콘솔창에서 viewModel.str = 'Hi' 를 입력하면 '할당 10'  출력
            app.innerHTML = newValue        // viewModel.str 값을 할당/변경할 때 마다 해당하는 값을 app에 뿌려준다.
        }
    });
</script>

 

* Object.defineProperty : 객체의 속성에 접근, 할당 했을 때의 동작을 정의한다.

 

위와 같이 데이터를 접근/변경할 때 마다 바로바로 데이터를 바인딩 시켜주는 것은 Vue.js의 가장 중요한 특징인 Reactivity이다.

 

 

반응형

'Frontend > Vue.js, React' 카테고리의 다른 글

[vue 2 기초] 라우터  (1) 2023.11.06
[vue 2 기초] 컴포넌트 통신(props, event emit)  (1) 2023.11.04
[Vue 2 기초] 컴포넌트  (0) 2023.11.03
[Vue 2 기초] 인스턴스  (0) 2023.11.03
SPA 란?  (0) 2020.04.20
반응형

SPA란 Single Page Application 의 약자로 

 

기존의 웹 페이지는 페이지 자체가 여러개 존재하고

원하는 정보가 있으면 새 데이터를 요청할 때 마다

전체 페이지가 다시 로드 되었다.

 

하지만 SPA를 사용하게 되면

맨 처음 로딩할 때 하나의 페이지를 불러오고

그 페이지에서 JSON/XML 등의 데이터를 동적으로 가져오는 형태로 페이지를 바꿔나간다.

 

즉, 새로고침이나 새로운 페이지를 부르지 않고

데이터를 가지고만 페이지를 운영한다.

 

 

1. SPA의 장점

그렇다면 왜 기존의 페이지를 불러오는 방식이 아닌

SPA 방식을 사용하는지 즉, 장점에 대한 생각을 해봐야한다.

 

1. 사용자가 페이지를 이용할 때의 속도가 빠르다. (반응성이 빠르다)

  : 초기 로딩에 데이터를 가져오기 때문에 로딩이 된 후에는 새로고침 없이 빠르게 페이지를 이용할 수 있다.

 

2. 화면에 필요한 데이터만 가져와서 렌더링 하기 때문에 효율적이다.

 

3. 신속한 개발이 가능

  : 단일 페이지 응용 프로그램 아키텍처가 분리되어 있기 때문에 프론트엔드와 백엔드 개발 서비스를 분리하여 작업할 수 있다. 그렇기 때문에 개발자는 독립적이고 신속하게 작업을 할 수 있다.

 

4. 캐싱 능력

  : 데이터에 대한 지속적인 액세스가 있기 때문에 캐싱 관리하기에 수월하다.

 

2. SPA의 단점

SPA가 장점만 갖고있는 것은 아니라

SPA를 사용했을 때의 단점도 몇 가지 있다.

 

1. 초기 로딩시에 데이터를 가져오는 문제로 초기 로딩 속도 저하의 문제가 발생할 수 있다.

 

2. 검색엔진최적화 (SEO)에 어려움이 있을 수 있다.

  : 스크립트 언어로 화면의 전환이 되기 때문에 검색엔진에서 크롤링 하기가 어렵다.

 

 

 

 


 

참고

https://www.excellentwebworld.com/what-is-a-single-page-application/

 

 

반응형

'Frontend > Vue.js, React' 카테고리의 다른 글

[vue 2 기초] 라우터  (1) 2023.11.06
[vue 2 기초] 컴포넌트 통신(props, event emit)  (1) 2023.11.04
[Vue 2 기초] 컴포넌트  (0) 2023.11.03
[Vue 2 기초] 인스턴스  (0) 2023.11.03
Vue.js 란?  (0) 2023.11.03

+ Recent posts