본문 바로가기

Computer Science

CSR vs SSR

1. 웹의 역사(SPA 시대까지)

1/ 1990년 중반까지는 모두 다 static sites(정적 사이트)였다.

서버에 이미 잘 만들어진 html 문서들이 있고, 사용자가 브라우저에서 www.hello.com과 같은 주소에 접속하면 서버에 이미 배포되어져있는 HTML 문서를 받아와서 보여주는 형식

 

 

한가지 문제점은, 페이지 내에서 다른 링크를 클릭하면 (www.hello.com/about) 다시 서버에서 해당 페이지의 HTML을 받아와서 페이지 전체가 업데이트 되어야 한다.

 

 

 

2/ 1996

1996년 문서 내에서 또 다른 문서를 담을 수 있는 iframe 태그가 도입되었고, 이제는 페이지내에서 부분적으로 문서를 받아와서 업데이트 할 수가 있게 된다. (지금도 간혹 쓰이고 있는 태그!)

 

 

3/ 1998년

우리가 많이 쓰고 있는 fetch API의 원조, XMLHttpRequest API가 개발이 되어 이제는 HTML 문서 전체가 아니라 JSON과 같은 포맷으로 서버에서 가볍게 필요한 데이터만 받아올 수 있게 된다.

그 데이터를 자바스크립트를 이용해서 동적으로 HTML 요소를 생성해서 페이지에 업데이트하는 방식. ex: 티켓 날짜, 시간 등

 

 

4/ 2005년

이런 방식이 드디어 공식적인 AJAX라는 이름을 가지게 되고, 구글에서도 AJAX를 이용해서 Gmail, Google Maps와 같은 우리가 많이 쓰고 있는 웹 어플리케이션을 만들기 시작한다. 이것이 현재 널리 쓰이고 있는 SPA 싱글페이지 어플리케이션.

사용자가 한 페이지 내에서 머무르면서 필요한 데이터를 서버에서 받아와서 부분적으로만 업데이트하게된다. 이런 방식으로 하나의 어플리케이션만 사용하듯 웹사이트에서도 사용성이 조금씩 좋아지게 된다.
** 처음 SPA가 등장했을 때, CSR방식으로 구현되었는지에 대한 여부는 조금 모호하다. 초기에는 SPA개념 자체가 등장하고, 이후에 클라이언트 측 렌더링방식이 CSR이라는 용어로 구체화되었다.

초기 SPA구현은 서버측 템플릿을 사용하여 전체 페이지를 생성하고, 클라이언트 측에서는 필요한 데이터만을 동기적으로 받아오고 업데이트하는 방식으로 이루어졌을 수 있다.

초기에 SPA의 개념이 나타났고, 그 후에 CSR이 SPA를 구현하는 방법 중 하나로 발전함.

 

2. CSR

이런 SPA 트렌드 + 사용자들의 PC성능이 점차 좋아져서 많은 것들을 무리없이 처리할 수 있게 되었고 자바스크립트도 표준화가 잘되어짐에 따라서 강력한 커뮤니티를 바탕으로 Angular, React, Vue와 같은 프레임워크가 나와서 CSR(Client Side Rendering) 시대로 접어든다.

 

클라이언트 사이드 렌더링이란 쉽게 이야기하면 클라이언트 측에서 다 해먹는걸 말하는것.

서버에서 보내주는 index라는 HTML파일을 보면 body안에는 id="root"만 달랑 하나 들어있고, 어플리케이션에서 필요한 JS링크만 들어있다.

 

 

이렇게 HTML은 텅텅 비어있기때문에 처음에 접속하면 빈 화면만 보인다.

 

 

다시 링크된 어플리케이션 자바스크립트를 서버로부터 다운로드 받는다.

- 자바스크립트 파일에는 어플리케이션에서 필요한 로직들 뿐만 아니라 어플리케이션을 구동하는 프레임워크, 라이브러리의 소스코드들도 다 포함이 되어있다.

- 그렇기때문에 굉장히 사이즈가 커서 다운로드 받는데도 시간이 소요될 수 있다.

- 메인 페이지가 아닌, 다른 페이지에 접속하게되면 해당페이지에 필요한 JS파일을 실행해 새로운 컴포넌트를 렌더링하고 화면을 업데이트한다.(즉, 컴포넌트만 교체하여 렌더링!) 

 

 

 

추가로 필요한 데이터가 있다면 서버에 요청해서 데이터를 받아온 다음에 이것들을 기반으로 해서 동적으로 HTML을 생성해 드디어 사용자에게 최종적인 어플리케이션을 보여주게 된다.

 

 

# CSR의 문제점

1. 사용자가 첫 화면을 보기까지 시간이 오래걸릴 수 있다.

 

 

2. 썩 좋지 않은 SEO(Search Engine Optimization)

구글, 네이버와 같은 검색엔진들은 서버에 등록된 웹사이트들을 하나하나 돌아다니면서 웹사이트의 HTML문서를 분석한다.

'아, 여기 HTML은 이런 title과 description이 있으니 이런 검색어로 찾아질 수 있는 웹사이트군. 그리고 여기에 이런 링크들이 있으니 이것도 검색엔진에 등록해놔야겠어'라고 판단해서 검색할 때 웹사이트를 빠르게 검색할 수 있게 도와준다.

 

하지만 CSR에서 사용되어지고있는 HTML는 대부분 텅텅 비어져있기때문에 검색엔진들이 CSR로 작성된 웹페이지를 분석하는데 많은 어려움을 겪고있다.

구글에서는 조금 개선이 되었지만 여전히 SEO가 좋지 않다.

 

이러한 CSR의 문제점들 때문에 1990년 중반쯤에 사용했던 static sites에 영감을 받은 SSR이 도입되게 된다.

 

 

3. SSR

이제 클라이언트에서 모든 것을 처리하는 방식과는 다르게 웹사이트에 접속하면 이제 '서버에서' 필요한 데이터를 모두 가져와서 HTML파일을 만들게 되고, 이렇게 잘 만들어진 HTML파일 + 동적으로 조금 제어할 수 있는 소스코드와 함께 클라이언트에게 보내주게된다. 그러면 클라이언트 측에서는 잘 만들어진 HTML문서를 받아와서 바로 사용자에게 보여줄 수 있게 되는 것.

 

 

# SSR의 장점

이런 SSR을 이용하게 되면 CSR을 사용했을 때보다 

1. 첫번째 페이지 로딩이 빨라진다.

 

 

2. 모든 컨텐츠가 HTML에 담겨져 있기 때문에 조금 더 효율적인 SEO를 할 수 있다.

 

 

그럼 이런 SSR이 모든 것에 솔루션이 될 수 있을까?

→ 그건 아니다. SSR에도 큰 문제점이 존재한다.

 

# SSR의 문제점

1. Static Sites에서 발생했던 깜빡임 이슈가 여전히 존재한다.

사용자가 클릭을 하게되면 전체적인 웹사이트를 다시 서버에서 받아 오는것과 동일하기 때문에 썩 좋지 않은 User experience를 겪을 수 있다.

 

 

2. 서버에 과부하가 걸리기 쉽다.

특히 사용자가 많은 제품일수록 사용자가 클릭을 할때마다 서버에 요청해서 서버에서 필요한 데이터를 가지고와서 HTML을 만들어야 하므로 서버에 과부하가 걸리기가 쉽다.

 

 

3. 사용자가 빠르게 웹사이트를 확인할 수 있지만 동적으로 데이터를 처리하는 자바스크립트를 아직 다운로드받지 못해서 여기저기 클릭했는데 반응이 없는 경우가 발생할 수 있다.(치명적단점이다!)

자세히 이해하려면 TTV(Time To View), TTI(Time To Interactive) 이 두가지에 대해서 살펴볼 필요가 있다.

 

 

 

4. TTV와 TTI측면에서 한번 더 정리

CSR과 SSR을 시간이 흘러가는 순서대로 분석해보면,

 

# CSR

1. CSR은 사이트에 접속하게 되면

2. 서버로부터 index.html파일을 받아온다. 이 index.html파일은 텅텅 비어져있기 때문에 사용자에게는 아무것도 보여지지 않는다.

3. 이 HTML파일에 링크되어져있는 이 웹사이트에서 필요한 모든 로직이 담겨있는 JS파일을 요청하게 된다.

4. 동적으로 HTML을 생성할 수 있는 어플리케이션 로직이 담긴 자바스크립트 파일을 받아오게 된다.

이 순간부터 웹사이트가 사용자에게 보여지게 되고, 또 사용자가 클릭이 가능하게 된다.

즉, CSR은 TTV(Time To View) 사용자가 웹사이트를 볼 수 있음과 동시에 TTI(Time To Interact), 클릭을 하거나 인터랙션이 가능하게 된다.

 

 

# SSR

1. 사이트에 접속을 하게되면

2. 서버에서 이미 잘 만들어진 index파일을 받아오게되고, 사용자가 웹사이트를 볼 수 있다.(Time To View)

하지만, 아직 동적으로 제어할 수 있는 자바스크립트 파일은 받아오지 않았으므로 사용자가 클릭을 해도 아무것도 처리할 수 없게된다.

최종적으로 자바스크립트 파일을 서버에서 받아와야지만 그때부터 사용자의 클릭을 처리할 수 있는 인터랙션이 가능해진다.

그래서 서버사이드 랜더링은 사용자가 사이트를 볼 수 있는 시간과 실제로 인터렉션 할 수 있는 시간의 공백기간이 꽤 긴편이다. (Time To View !== Time To Interact)

 

그래서 웹사이트의 성능을 분석할 때, TTV와 TTI도 중요한 매트릭으로 사용할 수 있다.

CSR을 정말 많이 사용하는 사람이라면 우리가 최종적으로 번들링해서 사용자에게 보내주는 이 자바스크립트 파일을 어떻게 하면 효율적으로 많이 분할해서 첫번째로 사용자가 보기위해서 필요한 정말 필수적인 아이만 보낼 수 있을지 고민해보면 좋을 것 같다.

 

SSR같은 경우 : 사용자가 보고, 인터렉션하는 이 시간의 단차를 줄이기위해 어떤 노력을 할 수 있을지, 우리가 어떻게 조금 더 매끄러운 UI와 UX를 제공할 수 있을지 고민해보면 좋을 것 같다.

그리고 요즘에는 꼭 CSR 또는 SSR만을 고집해서 사용하기보다는 SSG도 있다.

 

5. 어떻게 개선할 수 있을까?

SSG

Static Site Generation의 약자

 

6. Gatsby

리액트같은 경우는 Client Side Rendering에 특화된 라이브러리지만, Gatsby라는 라이브러리와 함께 사용하면 리액트로 만든 웹어플리케이션을 정적으로 웹페이지를 미리 생성해두어서 서버에 배포해놓을수가 있다.  이렇게 만들어진 웹사이트들은 모두 다 정적인건 아니다. 우리가 추가적으로 데이터를 서버에서 받아오거나 또는 동적으로 처리해야되는 로직이 있다면 자바스크립트 파일을 함께 가지고 있을 수 있기 때문에 동적인 요소도 충분히 추가할 수 있다.

 

 

7. Next.js

Gatsby 다음으로 리액트에서 많이 사용되는 것이 Next.js.

강력한 서버사이드 렌더링을 지원하는 라이브러리였는데, 요즘에는 SSG도 지원하고 CSR과 SSR을 잘 섞어서 조금 더 강력하고 유연하게 우리의 목적에 맞게 사용할 수 있도록 지원해주고 있다.

 

 

CSR, SSR, SSG 중 어떤 것이 최고다!라고 꼽기보다는 우리의 사이트는 정적인지, 동적인지, 서버에서 동적으로 데이터를 받아오는지, 얼마나 자주, 얼마나 많은 사용자가 있는지에 따라서 TTV와 TTI를 고려해서 조금 더 유연하게 섞어가면서 개발해나가면 좋다.

 

 

참고강의: https://www.youtube.com/watch?v=iZ9csAfU5Os&t=5s