서버로부터 새로운 페이지를 불러오지않고 페이지 요청에 따라(페이지 간 이동 시) 페이지 갱신에 필요한 데이터만을 JSON으로 전달받아 페이지를 갱신한다.
원래 전통적인 Web Application 방식은 전체 페이지를 다시 렌더링하는 방식을 사용하므로 새로고침 시 변경이 필요하지않는 부분들까지 갱신되므로 비효울적인 방식을 보안하고자 SPA를 사용하게 되었다.
Vue, React, Angular는 SPA기반으로 웹 페이지를 만들기위한 라이브러리/프레임워크이다.
SPA는 SSR방식이 아닌 js를 통해 동적으로 렌더링하는 CSR방식을 사용한다.
SPA 정리
- 첫 로딩시 전체페이지를 로딩하고 필요한 데이터만 JSON형태로 받아 동적으로 렌더링하는 방식
- CSR방식을 사용하나 SPA라해서 CSR은 아니다!
- 대표적인 SPA프레임워크는 react, vue, angular가 있다.
sever side rendering으로 서버에서 렌더링을 마치고, 완전하게 만들어진 HTML파일을
브라우저로 전달한 후 렌더링하는 방식이다.
전통적인 SPA렌더링 방식으로 최초 로딩 시 브라우저가 서버에 HTML, CSS, JS리소스를 받아오고 정의된 JS를 통해 동적으로 렌더링
1. 웹사이트 방문하면 브라우저가 서버에 "콘텐츠 요청"
2. 서버는 브라우저에게 "빈 html, 연결된 js링크 반환"
-> js파일을 다운로드 받아 동적으로 만들어서 띄운다.
동적으로 페이지를 만들어서 띄운다. DOM을 다운로드 해야함
JS을 다운로드받고 , 동적으로 띄우므로 초기로딩속도가 느림
-> 일부변경: 서버 데이터만 요청하므로 빠름
-> 서버측에 부하가 적음: 빈 html만 넘겨주므로
1. 유저가 브라우저 -> 서버 콘텐츠를 요청
서버에서 필요한 데이터를 삽입하고 렌더링 준비를 마친 HTML, CSS, JS를 전달
2. 브라우저는 전달받은 페이지를 띄운다.
3. 브라우저가 JS를 다운로드하고 HTML을 연결한다.
4. JS를 받고 실행하기전에 사용자가 화면을 볼 수 있다 -> 초기구동속도 굿
-> 내용과 스타일만 입혀져서 사실은 JS가 연결될때까지 기다려야함
브라우저가 가진 웹 크롤러는 HTML을 읽어서 검색 색인을 만들어내는데 HTML이 비어있는경우 검색엔진이 색인할만한 컨텐츠가 없음
서버에서 렌더링 준비를 마친 HTML 브라우저에게 응답하므로 검색엔진에 최적화(모든 데이터가 담겨진 상태이므로)
그것또한 아니다. 모든 프로젝트가 SEO(검색엔진최적화)를 필요로 하는것이 아니기 때문이다.
오히려 SEO가 필요치않은 프로젝트에서 SSR을 사용함으로써 서버에 부하를 줄 수 있기때문이다. 그러니 프로젝트 상황에 맞춰서 적절한 상황에 맞게 사용하는 것을 추천한다.
//template
<OrderInput v-model="userNm" />
//script
data() {
userNm: '',
},
computed: {
userInfo() {
return this.$store.getters['pay/userInfo']
}
},
mounted() {
this.userNm = this.userInfo.userNm
}
mounted() 라이프 사이클 훅을 이용해 컴포넌트 생성후 데이터를 불러온다.
sync fetch () {
await Promise.all([
this.getCategoryList(this.categoryLevel),
this.getMDListData(),
this.getBrandList({}),
])
},
페이지가 created,mounted되기저에 API를 호출해 데이터를 가져와야하는 경우 Nuxt.js SSR을 사용해 서버에서 html페이지의 내용을 모두 그려서 화면에 그려주는것이 특징이다.
https://velog.io/@gwanuuoo/SPA%EB%8A%94-%EA%B8%B0%EC%A1%B4-%EC%9B%B9%EC%82%AC%EC%9D%B4%ED%8A%B8%EC%99%80-%EC%B0%A8%EC%9D%B4
https://www.youtube.com/watch?v=YuqB8D6eCKE
https://joshua1988.github.io/vue-camp/nuxt/data-fetching.html#fetch
공부한 내용을 정리하고자 작성했습니다
내용에 문제가 있다면 피드백 부탁드립니다 감사합니다