Akashic Records

SPA(Single page application) 본문

Infrastructure

SPA(Single page application)

Andrew's Akashic Records 2023. 6. 15. 16:59
728x90

Single Page Application (SPA)는 웹 애플리케이션의 한 종류로, 웹사이트를 하나의 웹 페이지로 구성하고 사용자와의 상호작용 시 전체 페이지를 다시 로드하는 대신 필요한 부분만을 업데이트하는 방식을 사용합니다.

 

전통적인 웹 애플리케이션에서는 사용자가 페이지를 네비게이션할 때마다 서버로부터 새로운 HTML 페이지를 전송받아 전체 페이지를 다시 로드합니다. 반면에 SPA에서는 처음에 전체 페이지를 로드하고, 이후에는 사용자의 상호작용에 따라 필요한 데이터만 서버로부터 가져와서 페이지의 일부를 동적으로 업데이트합니다.

 

SPA의 주요 장점은 다음과 같습니다:

 

  1. 사용자 경험: SPA는 사용자와의 상호작용이 자연스럽고 부드럽습니다. 전체 페이지를 다시 로드하지 않기 때문에 애플리케이션이 더욱 반응성이 좋고 빠른 느낌을 줄 수 있습니다.

  2. 서버 부하 감소: SPA는 필요한 데이터만 서버로부터 가져오므로, 서버 부하를 줄이는 데 도움이 될 수 있습니다.
  3.  
  4. 개발 편의성: 클라이언트와 서버의 역할이 명확하게 분리되므로, 개발이 더욱 단순해질 수 있습니다. 또한 다양한 프레임워크(예: Angular, React, Vue.js 등)를 사용하면 SPA 개발이 더욱 쉬워집니다.

하지만 SPA도 몇 가지 단점이 있습니다:

 

  1. 초기 로딩 시간: SPA는 애플리케이션의 모든 코드와 리소스를 한 번에 로드하므로, 초기 로딩 시간이 길 수 있습니다.

  2. SEO 문제: SPA는 동적으로 콘텐츠를 로드하기 때문에, 검색 엔진이 페이지의 콘텐츠를 제대로 인덱싱하지 못할 수 있습니다. 이는 SEO(Search Engine Optimization)에 영향을 미칠 수 있습니다. 그러나 현재는 대부분의 검색 엔진이 JavaScript를 이해하고 인덱싱할 수 있어, 이 문제는 점차 줄어들고 있습니다.

  3. 브라우저의 뒤로 가기 버튼 문제: SPA에서는 페이지 이동이 URL의 해시(#)를 변경하는 방식으로 이루어지므로, 브라우저의 뒤로 가기 버튼을 사용할 때 예상치 못한 동작이 발생할 수 있습니다. 이는 프레임워크의라우팅 기능이나 HTML5의 History API를 이용해 해결할 수 있습니다.

  4. 보안 이슈: SPA는 클라이언트 사이드에서 많은 처리를 담당하므로, 보안에 신경을 써야 합니다. 예를 들어, 인증과 인가는 클라이언트 사이드에서 완전히 처리하면 안 되며, CSRF(Cross Site Request Forgery)나 XSS(Cross-site Scripting) 공격에 취약할 수 있습니다.

Single Page Application (SPA)에서 파라미터를 전달하는 방법은 여러 가지가 있습니다. 여기서는 두 가지 주요한 방법을 소개하겠습니다: URL 파라미터를 통한 전달과 애플리케이션 상태 관리 도구를 이용한 전달.

  1. URL 파라미터: URL 파라미터는 SPA 내에서 페이지 이동 시 정보를 전달하는 간단한 방법입니다. 예를 들어, 사용자가 특정 항목을 클릭하여 상세 페이지로 이동하는 경우, 해당 항목의 ID를 URL 파라미터로 전달할 수 있습니다. Angular의 경우 ActivatedRoute, React의 경우 react-router-dom 라이브러리의 useLocation이나 useParams 훅을 사용하여 URL 파라미터를 읽을 수 있습니다.

  2. 애플리케이션 상태 관리 도구: Redux나 MobX 같은 상태 관리 라이브러리, 혹은 React의 Context API 같은 도구를 사용하면 애플리케이션의 전역 상태를 관리할 수 있습니다. 이를 통해 한 컴포넌트에서 설정한 상태를 다른 컴포넌트에서 읽어 사용할 수 있습니다. 따라서 이러한 도구를 이용하면 파라미터를 전달하는 것과 유사한 기능을 수행할 수 있습니다.

두 방법 모두 SPA에서 파라미터를 전달하는 효과적인 방법이지만, 각각 적합한 상황이 다릅니다. URL 파라미터는 주로 다른 사용자가 해당 URL을 직접 접근할 수 있는 상황이거나, 페이지 새로고침에 대비해야 할 때 유용합니다. 반면, 애플리케이션 상태 관리 도구는 애플리케이션 내에서 다양한 컴포넌트 간 복잡한 상태를 공유해야 할 때 효과적입니다.

 

Single Page Application (SPA)에서는 전통적인 웹 사이트와 달리 페이지 간의 이동이 서버에 새로운 요청을 보내는 것이 아니라, 클라이언트 사이드에서 JavaScript를 통해 URL을 변경하고 해당 URL에 맞는 뷰를 렌더링하는 방식을 사용합니다. 이를 위해 사용되는 기술이 라우팅입니다.

 

여러 프론트엔드 프레임워크는 SPA의 라우팅을 지원하기 위해 각자의 라우팅 라이브러리를 제공하고 있습니다.

  1. React Router: React에서 가장 널리 사용되는 라우팅 라이브러리입니다. <BrowserRouter>, <Route>, <Switch> 등의 컴포넌트를 제공하여 URL별로 특정 컴포넌트를 렌더링하게 합니다.
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';

<Router>
  <Switch>
    <Route exact path="/" component={Home} />
    <Route path="/about" component={About} />
    <Route path="/users/:id" component={User} />
  </Switch>
</Router>

 

  1. Vue Router: Vue.js에서 제공하는 공식 라우팅 라이브러리입니다. Vue Router 또한 URL별로 특정 컴포넌트를 렌더링합니다.
import Vue from 'vue'
import VueRouter from 'vue-router'

Vue.use(VueRouter)

const routes = [
  { path: '/', component: Home },
  { path: '/about', component: About },
  { path: '/user/:id', component: User },
]

const router = new VueRouter({
  routes
})

new Vue({
  router,
}).$mount('#app')

 

  1. Angular Router: Angular에서는 자체 라우팅 모듈을 제공합니다. Angular의 라우팅 설정 역시 URL별로 특정 컴포넌트를 렌더링하게 합니다.
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';

const routes: Routes = [
  { path: '', component: HomeComponent },
  { path: 'about', component: AboutComponent },
  { path: 'user/:id', component: UserComponent },
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }

이 외에도 많은 SPA 프레임워크들이 라우팅을 위한 자체적인 라이브러리를 제공하며, 이를 통해 URL을 관리하고 렌더링할 컴포넌트를 결정합니다. 이 방식을 통해 SPA는 전통적인 페이지 로드 방식 없이도 사용자에게 여러 페이지가 있는 것처럼 보이게 할 수 있습니다.

 

SPA (Single Page Application)에서 사용자 인증을 구현하는 방법은 여러 가지가 있습니다. 인증 절차의 주요 목표는 사용자의 신원을 확인하고, 그 사용자가 허가된 액세스를 가지고 있는지 검증하는 것입니다. 다음은 몇 가지 일반적인 방법들입니다.

 

  1. JWT (JSON Web Tokens): JWT는 사용자 인증에 많이 사용되는 방법 중 하나입니다. 사용자가 자신의 크리덴셜 (예: 사용자명과 비밀번호)을 사용하여 로그인하면, 서버는 JWT를 생성하고 이를 클라이언트에게 전송합니다. 클라이언트는 이 토큰을 저장하고 (예: 로컬 스토리지나 쿠키에), 이후의 모든 요청에 이 토큰을 포함시킵니다. 서버는 이 토큰을 검증하여 사용자의 신원을 확인하고 요청이 유효한지 판단합니다.

  2. OAuth / OpenID Connect: OAuth는 사용자가 특정 애플리케이션에 자신의 계정 데이터에 대한 액세스를 부여할 수 있게 해주는 개방형 표준입니다. 예를 들어, 사용자가 "Facebook으로 로그인" 또는 "Google로 로그인" 기능을 사용하는 것이 OAuth를 이용한 예입니다. OpenID Connect는 OAuth 2.0을 기반으로 하는 인증 프로토콜입니다.

  3. Session Cookies: 전통적인 방식으로, 사용자가 로그인하면 서버는 세션을 생성하고, 이 세션의 ID를 쿠키에 저장한 다음 클라이언트에게 전송합니다. 클라이언트는 이후의 모든 요청에 이 쿠키를 포함시킵니다. 서버는 쿠키를 검증하여 사용자의 신원을 확인하고 요청이 유효한지 판단합니다.

이 방법들 중 어느 것을 사용할지는 애플리케이션의 요구사항, 보안 요구사항, 개발팀의 경험 등에 따라 달라집니다. 중요한 것은 사용자 인증 정보를 안전하게 보관하고, 서버에서는 인증 토큰이나 쿠키를 항상 검증하여 보안을 유지하는 것입니다.

 

Single Page Application (SPA)의 런타임 업데이트는 전통적인 웹 애플리케이션에서와는 다르게 동작합니다. 전통적인 웹 애플리케이션에서는 페이지를 새로 고침하거나 다른 페이지로 이동함으로써 새로운 코드를 로드할 수 있지만, SPA에서는 일반적으로 새로운 페이지 로드 없이 애플리케이션의 상태를 변경하고 사용자에게 새로운 뷰를 제공합니다. 그렇기 때문에 SPA에서 런타임 업데이트를 처리하는 것은 약간 복잡해질 수 있습니다.

 

다음은 SPA에서 런타임 업데이트를 처리하는 방법 중 하나인 서비스 워커를 사용한 방법에 대한 설명입니다:

 

서비스 워커 (Service Workers):

서비스 워커는 웹 브라우저에서 백그라운드에서 실행되는 스크립트로, 네트워크 요청을 가로채고 캐시와 같은 기술을 활용하여 애플리케이션의 동작을 제어할 수 있습니다.

 

서비스 워커를 이용하면 SPA에 대한 업데이트를 비교적 쉽게 관리할 수 있습니다. 예를 들어, Create React App과 같은 도구는 기본적으로 서비스 워커를 설정하여 "앱 셸"을 캐싱하고, 업데이트가 이용 가능해질 때 사용자에게 알리는 기능을 제공합니다. 이렇게 하면 사용자는 페이지를 새로 고침하거나 앱을 다시 시작함으로써 새로운 버전의 앱을 받아볼 수 있습니다.

 

서비스 워커를 사용하여 SPA를 업데이트하는 것은 다음과 같은 단계를 포함합니다:

  1. 서비스 워커를 등록합니다. 서비스 워커는 일반적으로 앱의 엔트리 포인트에서 등록됩니다.
  2. 서비스 워커가 설치되면, 서비스 워커는 앱의 모든 자산 (HTML, CSS, JavaScript 파일 등)을 캐시합니다.
  3. 사용자가 앱을 방문하면, 서비스 워커는 요청된 자산을 캐시에서 제공합니다.
  4. 서버에 새 버전의 앱이 배포되면, 서비스 워커는 이를 감지하고 새 자산을 다운로드하여 캐시를 업데이트합니다.
  5. 사용자가 다음 번에 앱을 방문하거나 페이지를 새로 고침하면, 서비스 워커는 새 버전의 자산을 제공하여 앱을 업데이트합니다.

이러한 방법은 앱이 오프라인에서도 작동하도록 하고, 업데이트를 쉽게 관리할 수 있게 해주지만, 복잡한 경우에는 추가적인 로직이 필요할 수 있습니다. 예를 들어, 사용자가 여러 탭에서 앱을 동시에 사용하는 경우, 새 버전의 앱이 설치되어 있지만 아직 활성화되지 않은 상태에서 어떻게 동작해야 할지 결정해야 할 수 있습니다. 이와 같은 상황을 처리하기 위해 다양한 전략들이 존재하며, 이는 개발자의 결정에 달려 있습니다.

728x90

'Infrastructure' 카테고리의 다른 글

초자동화(Hyperautomation)  (0) 2023.06.30
데이터 공유 프로그램(Data sharing as a program)  (0) 2023.06.29
병렬 컴퓨터(parallel computer)  (0) 2023.05.25
6시그마(Six Sigma)  (0) 2023.05.25
RPA(Robotic Process Automation)  (0) 2023.05.25
Comments