본문 바로가기

[React] React SPA

[React] React SPA

전통적인 웹페이지에서는 페이지를 유저에게 보여줄 때 즉, 페이지를 로딩할 때마다 서버에 미리 준비되어 있는 페이지를 전달 받아와서 렌더링을 했다. 하지만, 규모가 커질수록 사용자와의 상호 작용이 많아지고 그에 따라, 속도 저하 등의 문제가 발생하게 된다. React에서는 이러한 문제를 해결하기 위해 SPA를 사용한다.  

 


 

SPA 등장 배경, 개념, 장단점

 

기존의 방식 : MPA(Multiple Page Application)

전통적인 웹사이트에서는 사용자가 웹사이트 내의 다른 페이지로 이동하면, 브라우저가 페이지를 보여주기 위해 매번 HTML 파일로 된 "페이지 전체"를 불러와야만(MPA: Multiple Page Application) 했다.  

웹사이트가 보다 복잡해지고 애플리케이션의 형태를 가지게 되면서, 사용자와 서비스 사이에 더욱 많은 상호작용이 일어나게 되었다. 

 

여기서 발생하게 되는 문제

  • 이때마다 Header나 Navigation Bar 등과 같이 중복되는 요소들을 매번 불러오는 것이 서버와의 불필요한 트래픽을 발생시킨다.
  • 사용자 입장에서는 매번 모든 페이지를 불러옴에 따라 더 느린 반응성을 갖게 된다.
    -> 애플리케이션과 같은 사용자 경험을 제공하기 어렵게 만든다.

 

해결 방안 : SPA(Single Page Application)

  • 1990년대 후반에 HTML 문서 전체가 아닌, 업데이트에 필요한 데이터만 서버에서 전달받아 이 데이터를 JavaScript가 동적으로 HTML 요소를 생성해서 화면에 보여주는 방식이 개발되어 사용되기 시작했다.
  • 2000년대 중반부터 이러한 개발 방식을 이용한 웹 애플리케이션이 보편화되었으며, 이것이 싱글 페이지 애플리케이션, 즉 SPA이다.

* SPA(Single Page Application) : 서버로부터 완전히 새로운 페이지를 불러오는 것이 아니라, 화면을 업데이트하기 위해 필요한 데이터만 서버에서 전달받아 브라우저에서 해당하는 부분만 업데이트하는 방식으로 사용자와 소통하는 웹 애플리케이션이나 웹 사이트 

 

MPA(Multiple Page Application) vs SPA(Single Page Application)

아래 예시 그림은 동일한 페이지 전환을 보여주고 있다.

  • 전통적인 웹사이트는 페이지가 전환될 때 마다 페이지 전체를 로딩한다. (페이지 이동마다 전체 HTML을 받아오는 것) 전통적인 웹사이트에서는 이와 같이 "페이지 전체를 불러오는 행위"를 보통 깜빡인다고 표현한다.
  • SPA는 Menu와 Footer와 같이 페이지 전환 전후에 중복되는 부분은 새로 불러오지 않는다. 

 

SPA(Single Page Application)의 장점

  1. 자바스크립트를 사용해서 웹 문서에 여러 interaction을 부여한 웹 애플리케이션 형태로 사용할 수 있다는 점이다. 그러기 위해서 중요한 점은 JavaScript 파일과 HTML을 받아와서, 대부분의 동작은 JavaScript에 의존하여 작동시킬 수 있어야힌다.  
  2. 서버 입장에서는 요청받은 데이터만 넘겨주면 되기 때문에 과거와 같은 과부하 문제도 현저히 줄일 수 있다.
  3. SNS를 예로 들어보면 사진에 "좋아요"를 누르고, 댓글을 달고, 궁금할 땐 검색을 하기도 한다. 이렇게 애플리케이션과 사용자 사이에 수시로 상호작용이 발생하는데, 이때 페이지 전체를 렌더링하는 것이 아니라 필요한 부분만 업데이트하기 때문에 SPA는 사용자의 행동에 빠르게 반응한다. 
    -> 화면 전체를 새로 렌더링할 필요가 없기 때문에 보다 나은 사용자 경험을 제공한다. 

 

이런 SPA 방식으로 만들어진 대표적인 서비스로는 Youtube 가 있다. 이 밖에 facebook, Gmail, airbnb, Netflix 등 우리가 일상적으로 사용하는 다양한 서비스들이 SPA 방식으로 제작되어 있다.

 

SPA(Single Page Application)의 단점

앞서 봤던 다양한 장점들 때문에 SPA를 많이 사용하지만, SPA도 단점을 가지고 있다.

 

  1. 브라우저는 첫 화면 로딩 시에 HTML 파일을 읽어들인 후 그 안의 script 요안에 있는 JavaScript 파일을 다시 받아오는 과정을 거친다. 이때 첫 화면 로딩 시 읽어들인 HTML 파일은 거의 비어있고, 대부분의 코드는 JavaScript 파일 안에 들어있다 보니 자연스럽게 JavaScript 파일이 무거워진다. 때문에 이 JavaScript 파일을 기다리는 시간으로 인해 첫 화면의 로딩 시간이 길어진다.
  2. 검색 엔진 최적화(SEO)가 좋지 않다.
    (
    검색엔진 최적화란 구글이나 네이버 같은 검색엔진이 자료를 수집하기 좋도록 웹 페이지를 구성하는 것을 뜻한다.
    검색 엔진의 작동 방식을 잠깐 알아보면, 검색 로봇이 웹 페이지에 있는 정보를 수집하고 분석해서 그 결괏값에 인덱스를 만들어 보관하고 있다가 사용자가 검색어를 입력하면 보관하고 있던 인덱스에서 검색어와 가장 연관성이 높은 웹 페이지들을 순서대로 보여주는 방식으로 작동한다.)
     
    검색 로봇은 자료를 수집할 때에 웹 페이지의 URL은 물론이고 HTML 문서 내의 각종 태그나 링크 등을 분석한다. SPA는 HTML이 거의 비어있다 보니 검색 로봇이 충분한 자료를 수집하지 못한다.

 

 

SPA(Single Page Application)의 2번 단점 보안 


 2번의 단점 때문에 검색 노출이 중요한 웹 애플리케이션은 검색 엔진 최적화에 대한 대응책을 따로 마련해야 하고, 더불어 앱 안에서 브라우저의 앞으로 가기/뒤로 가기 등의 상태 관리도 해야 하기 때문에 개발의 복잡도가 더욱 늘어난다. 다만 SPA에서도 검색 엔진 최적화에 대응할 수 있도록 검색 엔진이 발전하고 있어서, 점차 이 단점은 사라지고 있는 추세이다.

 


 

와이어프레임(Wireframe)

 

와이어프레임(Wireframe)디자인에 들어가기 전 단계선(wire)를 이용해 윤곽선(frame)을 잡는 것을 말한다. 이 작업을 통해 개발자는 디자인 컨셉과 사이트 기능에 대한 이해를 할 수 있다. 그리고 목업(mockup)은 데스크톱, 스마트폰의 프레임을 덧씌워 직관적으로 이해하기 쉽게 디자인한 것을 말한다.

 

 

 

유튜브 애플리케이션을 컴포넌트 기반 개발 방법을 사용하여 설계하기

유튜브 애플리케이션을 React를 이용해 어떻게 만들지 설계를 한다고 가정해보자.

 

컴포넌트 기반 개발을 위해 페이지를 먼저 만들기보다는 어떤 컴포넌트를 만들고 이들을 조합할지부터 구상해본다.  

  • 먼저 화면 상단의 경우, 상단 전체를 아우르는 Header라는 컴포넌트가 있고, 그의 자식으로 Search와 Setting이라는 컴포넌트를 만들기로 하였다. Header 컴포넌트는 애플리케이션 내의 어떤 페이지에 가더라도 늘 상단에 위치하니 이 부분을 감안해서 설계 로직을 작성해야겠다고 생각했다.

 

  • 화면 중앙에는리에이터들이 올린 영상을 담고 있는 ContentsList라는 컴포넌트가 있고, 그 안에는 동일한 형태를 가진 영상물들이 반복적인 형태로 화면을 구성하고 있기 때문에 Content라는 컴포넌트를 한 번만 만들어 재사용하기로 한다.

 

어떤 컴포넌트들이 필요하고, 이들을 어떻게 조합하여 전체 UI를 만들지 설계가 끝났으면 가장 작은 단위의 컴포넌트를 설계해야 한다.

 

  • 한눈에도 다양한 정보를 담고 있는 Content 컴포넌트를 예로 들면 고려해야 할 부분들은 다음과 같다.

    (1) 상단에는 썸네일, 중앙에는 아바타와 영상 소개 글, 하단에는 채널 이름과 조회 수, 업로드한 날짜가 기재되어 있다.
    (2) Content 컴포넌트는 영상과 관련된 데이터를 입력받아, UI에 맞게 화면에 출력해 준다.
    (3) 눈에 보이지는 않지만 클릭 시 해당 영상을 재생해 주는 기능도 가지고 있다.
    (4) 이 데이터는 영상이 대기 목록에 있을 때도, 혹은 재생 중일 때도 동일한 내용이 화면에 출력된다.
    (-> 어떤 상태로 있느냐에 따라 출력되는 위치만 조금씩 달라질 뿐이다.)

 

 

 

컴포넌트가 UI의 필수 요소란 정의도 맞고, 각자 고유의 기능을 가지고 있다는 정의도 맞다. 하지만 조금 더 고차원의 React 개발자라면, 애플리케이션 안에서 다뤄지는 데이터를 컴포넌트들끼리 보다 유기적으로 주고받을 수 있도록 설계해야 한다. 이는 다음에 포스팅될 React Router와 함께 컴포넌트 활용도 할 수 있다.  

 

 


 

정리

React에서 컴포넌트를 효율적으로 나누는 방법 중 하나는 ________ 이다.
  • 와이어프레임(Wireframe)으로 먼저 어떤 컴포넌트를 만들고 조합할지 구상하는 것
  • 재사용이 가능한 컴포넌트를 미리 구상하는 것
  • 애플리케이션 안에서 다뤄지는 데이터를 컴포넌트들끼리 보다 유기적으로 주고받을 수 있도록 설계하는 것

 

 

 

 

728x90
⬆︎