외부 api 불러올때 spa 주의 사항 정보
SVELTE 외부 api 불러올때 spa 주의 사항본문
지도와 같이 외부 api를 불러오거나
push 설정과 같이 특정 push 만 조건을 걸어 처리하는 등의 하이브리드앱의 네이티브 연결들을 처리할때
spa 의 특성을 잘 고려해서 구성을 해야합니다.
spa 를 사용하는 이유중 하나로 상태유지라는 개념이 있습니다.
처음 페이지를 불러오고 그리고 다음 페이지 부터는 js에서 route 를 자체적으로 처리하면서
사용자 경험적으로는 페이지가 넘어가는데, 실제로는 페이지는 변하지 않고 레이어만 병경되고 있는 것이어서 처음 불러온 페이지의 javascript 설정이 변함없이 유지됩니다.
이러한 상태가 유지되는 방식은 주로 네이티브 기능을 호출할때 초기 설정 값등을 유지해야하는 경우에 사용됩니다.
일반 그누보드로 개발을 하게 되면, 페이지가 변경되면 새로운 페이지를 재로딩하는 방식이어서
상태가 재설정되어 코르도바나 아이오닉의 웹뷰방식으로 개발을 했어도 네이티브 기능이 꼬여서 이거 잡으려고 고군분투하다가 500만원 주고 강릉 사장님께 열락하시게 됩니다. - 제가 지금 다니는 회사 들어오기 전까지 저희 회사도 그렇게 했다고 하더라구요.
상태 유지되지 않는 경우 격게되는 흔한 증상은 푸시설정이 꼬여서 푸시를 한번 보내면, 화면에서 여러번 호출됩니다. - 푸시 설정햇던 페이지를 여러번 재호출한 경우라서 그렇게 됩니다.
푸시 상태 값은 하이브리드앱에서 네이티브를 호출할때 네이티브에 저장됩니다.
그런데, 웹으로 개발을해서 같은 페이지를 반복 호출하게 되면 네이티브에 계속 호출을 하게되어
네이티브에 설정된 값이 덮어 쓰게 되면 되는데 이게 값이 추가되는 방식으로 되어 있어서 의도하지 않은 에러가 나게 됩니다.
그래서 이런 현상을 피하기 위해 spa(Single Page App)로 개발하는 겁니다.
react, vue, svelte 등의 rout 잡아주는 라이브러리들이 이런역할을 합니다.
next.js, nuxt.js, sveltekit 들이 이렇게 spa 가 유지되도록 라우팅을 잡아주는 역할을 합니다.
그런데 문제는
이러한 네이티브 문제를 해결하기 위해 spa로 개발을 하면 두번째 문재가 발생합니다.
바로 외부 api 중복로딩 문제입니다.
하나를 해결했더니 다른 문제가 터져 나옵니다.
일반 웹에서 외부 api 설정을 불러오면 이 설정의 상태값은 브라우저에 저장됩니다.
일반웹으로 개발하면 페이지 불러올때마다 페이지가 리셋되어서, 기존 페이지에 저장된 값이 사라지게 되어 클리어한 환경에서 설정을 다시 불러오게 됩니다. 그래서 웹브라우저 상의 설정 중복이 안됩니다.
그런데 spa 로 불러오게 되면 처음에 불러온 값이 브라우저에 저장되고
다른 페이지 돌아나니다가 다시 api 기능이 있는 페이지로 돌아오면 다시 api 가 로드되어
기존 값이 사라지지 않고 api 가 중복으로 로딩되게 됩니다.
이렇게 되면, 지도의 경우 지도가 2개 이상이 위아래로 뜨는 현상이 발생됩니다.
그래서 api 로드하고 해당 페이지를 다시 불러올때 api 가 로드 되어 있는 먼저 검사하고
안되어 있으면 로드하는 방식을 사용합니다.
페이지와 페이지를 넘기는 경우에도 값이 글로벌하게 동일하게 유지 되는 방식은 여러가지 방법으로 확인 가능한데
이럴때 쓰라고 store 가 있는 것 같습니다.
api 로드 여부 store 에 넣어두고 페이지 다시 불러오기 할때 api 재로드 여부를 store 로 확인해서 처리합니다.
상태관리 차원에서
spa를 써야하는 이유와, spa 를 쓰게 되면 에러나는 부분을 대처하는 방법에 대해서 알아봤습니다.
React 도 사용하게 되면 어려운 부분이 상태관리하는 redux 를 사용하는 부분입니다.
Svelte도 사용하게 되면 좀 해깔리는 부분이 store 사용하는 부분입니다.
그나마 svelte 가 react 보다 한 3배정도 쉽습니다.
최근 react도 redux toolkit 을 사용하면서 좀더 쉬워졌지만 그래도 svelte가 더 쉽습니다.
외부 api 는 프로젝트 최상위 html 에 넣어서 쓰는 경우도 있습니다.
이건 한번만 불러와서 사용하니까 중복 재로드 되지 않아서 사용할 수 잇습니다.
그러나, api 로드시 서비스 값을 변경하거다할 때 또 재로드가 필요하게 됩니다.
재로드시 기존 상태를 버리고 재로드하려면, 스토어에 잘 담아서 관리해야합니다.
그래야 반대로 버릴 수도 있습니다.
2
댓글 10개
스벨트 경험담 참고해볼게요~~!!
딱 그런거 하라고 만들어 놓은 라이브러리 입니다.
react-query 만든 회사가(vercel 이네요) svelte 버전도 만들어서 배포 중입니다.
https://sveltequery.vercel.app/
비트코인 사이트들 챠트 이걸로 많이 만듭니다.
+layout.svelte
<script lang="ts">
import { QueryClient, QueryClientProvider } from '@sveltestack/svelte-query';
const queryClient = new QueryClient({
defaultOptions: {
queries: {
keepPreviousData: true,
refetchOnWindowFocus: false,
refetchOnMount: true,
refetchOnReconnect: false,
retry: 2,
refetchInterval: refreshStop ? false : 10 * 1000, // 10초 단위로 불러옴
refetchIntervalInBackground: true,
onError: (err) => {
console.log(err);
refreshStop = false;
// logout()
},
onSuccess: (data) => {
if (refreshStop) {
// refreshCheck()
}
}
}
}
});
</script>
<QueryClientProvider client={queryClient}>
<slot />
</QueryClientProvider>
이렇게 선언하면 10초 단위로 불러오는 설정이 된것이고
+page.svelte
각 페이지에서
<script lang="ts">
import { useQuery } from '@sveltestack/svelte-query';
const getChart = async (id)=>{
}
let id ='';//챠트
$: queryResult = useQuery([`getChart${id}`, id], getChart(
id
), {
onSuccess: res => {
if(res.data){
// console.log(res.data)
}
}
});
</script>
{#if $queryResult.isLoading}
<!-- 로딩 보여주는 곳 -->
<Loading />
{:else if $queryResult.error}
<!-- 에러 메시지 보여주는 곳 -->
에러
{:else}
{#if $queryResult.data.data != null}
{@const {
// 받아온 값을 개별로 넘기거나
id,xval,yval
}= $queryResult.data.data}
<!-- 아니면 직접 컴포넌트에 넘기거다 -->
<Chart data={$queryResult.data.data} />
{/if}
{/if}
{/if}
이런식으로 하시면 되는데,
svelte-query 는
spa 앱을 만들때
사용자 경험을 높개 향상시켜주는 이유로 사용하게 됩니다.
서버와 통신은 시간적 지연이 있습니다. 먼곳에서 데이터를 불러오기 때문이죠
만면 페이지 전환은 즉각적으로 잃어납니다.
그래서 페이지전환이 이루어지고 데이터가 불러오기까지의 텀을 어떻게 처리하느냐의
문제가 발생합니다.
이를 위해서
스켈렛톤 바를 보여주기도 하고 로딩바를 보여주기도 하는데
이와 동시에
프론트를 직접 컨트롤 할 수 있기 때문에
프론트에 값을 주기적으로 갱신해서 프론트 브라우저의 저장공간에
저장해 놓습니다. 그리고
페이지가 전환되면 즉각적으로 레이아웃(디자인)과 브라우저 저장공간에 저장된
내용을 먼저 보여주고 그리고 서버 요청을 보내 내용을 갱신하는 방식을 사용합니다.
그러면 페이지전환이 즉각적으로 이루어지면서 동시에 데이터도 보이게 되겠죠.
그리고 스므스하게 데이터가 변경됩니다.
그래서 사용자는 매무 빠른 서비스를 받는다는 느낌을 받게 되는 기술입니다.
svelte-query 는
백그라운드에서 주기적으로 데이터를 불러와서 갱신처리할 수 있는 기술을
짧게 설정하면 자주 갱신되는 주식 챠트나
가끔 변경하면 사용자 경험개선에 사용합니다.
작업하다가 특정페이지를 새로고침 하게되면 위 에레메세지가 뜨는데 이것도 api 중복관련 에러일까요?
php만 하다가 spa를 작업하다보니 생각지도 못한 문제에 계속 맞닥뜨리는군요 ㅎㅎ;
url route slug 를 이용하거나 아니면,
stoer와 함께 보조 수단으로 브라우저의 스토리지를 사용하는 방법도 있습니다.
store 에 저장하면 localstorage 에 같이 자동 저장되는 라이브러리도 있습니다.
svelte 개발자인 리치헤리슨도 얼마전 사람들이 타입스크리트 쓴다고들 하는데, 대부분이 요 3개만 쓰는 경우가 많아서, 타입스크립트 쓰지말고, jsdoc 쓰는 쪽으로 말을 하는 것 같더라구요.