# HTML, HTTP API, CSR, SSR

## 정적 리소스

정적 리소스를 제공할 때는 고정된 HTML, CSS, JS, 이미지, 영상 등을 제공한다.

![](https://389280719-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LxjHkZu4T9MzJ5fEMNe%2Fsync%2F1e3a6d866d9501403bdce1f4ce4f2d48a0fe6617.png?generation=1622981115562894\&alt=media)

브라우저에서 리소스를 요청하면 서버에서 보내준다.

## HTML 페이지

동적으로 HTML을 생성해서 전달하기도 한다.

![](https://389280719-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LxjHkZu4T9MzJ5fEMNe%2Fsync%2Fa7f4e9d3a8c9537d05316699fde8baef79f05443.png?generation=1622981118534828\&alt=media)

애플리케이션 로직을 처리하는 WAS가 DB로 주문 정보를 조회한 후 JSP나 타임리프 같은 것을 통해 동적으로 HTML을 생성한다. 브라우저는 이 HTML을 해석해서 표현한다.

## HTTP API

HTML을 단순히 전달하는 게 아니라 데이터를 전달한다.

![](https://389280719-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LxjHkZu4T9MzJ5fEMNe%2Fsync%2F95c44988b787f0859d558261b11210257e30d00d.png?generation=1622981114578575\&alt=media)

주문 정보를 조회해서 json 형식의 데이터를 내려준다. 웹 브라우저는 json을 해석하지 못하기 때문에 json 포맷 그대로 출력한다. 따라서 API 방식은 화면에 뿌려주는 용도가 아니라 다양한 시스템에서 사용할 때 활용된다.

![](https://389280719-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LxjHkZu4T9MzJ5fEMNe%2Fsync%2Ff7008c26daccc1b81f6bf03f3f2e5247c6228bf1.png?generation=1622981117661391\&alt=media)

데이터만 주고 받고 UI 화면이 필요하면 클라이언트가 별도로 처리한다. 앱/웹/서버 to 서버에서 사용된다.

요청 하면 그냥 상품에 대한 데이터만 내려준다. 이렇게 데이터만 주고 받는 것을 HTTP API라고 한다.

### 특징

* 주로 json 형태로 데이터 통신한다.
* UI 클라이언트와의 접점이 된다.
  * 앱 클라이언트
  * 웹 브라우저에서 자바스크립트를 통한 HTTP API 호출
  * React, Vue 같은 웹 클라이언트
* 서버 to 서버

서버 개발자는 정적 리소스, HTML 페이지, HTTP API 이렇게 세 가지를 어떻게 뿌려줄지 고민하는 사람이다.

## SSR - 서버 사이드 렌더링

* HTML 최종 결과를 서버에서 만들어 웹 브라우저에 전달한다.
* 주로 정적인 화면에 사용한다.
* JSP, 타임리프

![](https://389280719-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LxjHkZu4T9MzJ5fEMNe%2Fsync%2F089457327ce5758dfdba3442fa0cbc14792e483d.png?generation=1622981116647576\&alt=media)

요청이 들어오면 서버가 최종적으로 HTML을 렌더링해서 전달한다. HTML 만드는 과정을 서버에서 다 끝내고 클라이언트는 받은 것을 보여주기만 한다.

## CSR - 클라이언트 사이드 렌더링

* 자바 스크립트를 사용해 HTML 결과를 브라우저에서 동적으로 생성해서 사용한다.
* 주로 동적인 화면에 사용한다.
* 웹 환경을 마치 앱처럼 필요한 부분부분만 변경할 수 있다.
  * 클릭할 때마다 url이 바뀌거나 하지 않는다.
  * 구글 지도, Gmail, 구글 캘린더
* React, Vue

SSR을 사용하더라도 자바 스크립트를 사용해 화면 일부를 동적으로 변경할 수 있다. React, Vue로 CSR + SSR을 동시에 지원하는 웹 프레임워크도 있다.

![](https://389280719-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LxjHkZu4T9MzJ5fEMNe%2Fsync%2Fe0bde82fd1f25badfc6a900869a94687b3f16f1b.png?generation=1622981119693243\&alt=media)

1. 웹 브라우저에서 서버에 HTML을 요청한다.
   * HTML을 서버가 응답하지만 내용은 없다.
   * 대신 자바스크립트를 하나 내려준다.
2. 웹 브라우저는 이제 이 자바 스크립트에 요청을 한다.
3. 자바 스크립트에 있는 로직이 HTTP API으로 데이터를 요청하고 서버가 데이터를 반환한다.
4. 해당 데이터를 HTML과 렌더링해 예쁘게 보여준다.

## 백엔드 개발자 입장에서의 UI 기술

### 백엔드

* JSP, 타임리프
  * 화면이 정적이고 복잡하지 않을 때 사용한다.
  * JSP는 사장됐고 스프링에서 미는 타임리프를 사용하자.
* 백엔드 개발자는 서버 사이드 렌더링 기술 학습이 필수다.
  * 어드민같은 것은 간단하게 만들어낼 수 있다.

### 프론트엔드

* React, Vue
  * 복잡하고 동적인 UI가 필요할 때 사용한다.
* 웹 프론트엔드 개발자의 전문 분야다.

백엔드 개발자의 프론트 기술 학습은 옵션이다. 백엔드는 서버, DB, 인프라 등 수 많은 기술을 공부해야 한다. 프론트까지 깊이있게 하려면 오랜 시간이 필요하다.
