> For the complete documentation index, see [llms.txt](https://dodeon.gitbook.io/study/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://dodeon.gitbook.io/study/kimyounghan-spring-mvc/01-web-application/server.md).

# 서버

* 거의 모든 형태의 데이터를 전송할 수 있다.
  * HTML, TEXT
  * 이미지, 음성, 영상, 파일
  * JSON, XML
* 서버 간 데이터를 주고 받을 때에도 대부분 HTTP를 사용한다.

## 웹 서버

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

* HTTP 기반으로 동작한다.
* 정적 리소스를 제공한다.
  * HTML, CSS, JS, 이미지, 영상 등
* nginx, apache

## 웹 애플리케이션 서버(WAS)

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

* HTTP 기반으로 동작한다.
* 웹 서버 기능을 포함한다.
* 프로그램 코드를 실행해서 애플리케이션 로직을 수행한다.
  * 동적 HTML, HTTP API(JSON)
  * 서블릿, JSP, 스프링 MVC
* 톰캣 jetty, undertow

## 웹 서버와 웹 애플리케이션 서버의 차이

* 웹 서버는 정적 리소스, WAS는 애플리케이션 로직을 담당한다.
* 사실 둘의 용어와 경계는 모호하다.
  * 웹 서버도 프로그램을 실행하는 기능을 포함하기도 한다.
  * WAS가 웹 서버의 기능을 제공한다.
* 자바는 서블릿 컨테이너 기능을 제공하면 WAS가 된다.
  * 서블릿 없이 자바 코드를 실행하는 서버 프레임워크도 존재한다.
* WAS는 애플리케이션 코드를 실행하는 데에 더 특화되어있다고 생각하면 된다.

## 웹 시스템 구성

### WAS, DB

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

* 아주 단순하게는 WAS와 DB만으로도 시스템 구성이 가능하다.
* WAS를 이용해 정적 리소스와 애플리케이션 로직을 모두 제공할 수 있다.

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

* WAS 혼자 너무 많은 역할을 담당하기 때문에 서버 과부하가 생길 수 있다.
* 가장 비싼 애플리케이션 로직이 정적 리소스 때문에 수행이 어려울 수 있다.
  * 정적 리소스는 그냥 파일을 내려주면 된다.
  * 애플리케이션 로직은 DB도 뒤지고 할 일이 많다.
* WAS 장애는 오류 화면 노출도 불가능하다.
  * WAS는 결국 개발자가 개발하는 애플리케이션 로직이 들어가므로 장애가 쉽게 난다.
  * 서버가 완전히 내려가버리면 오류 화면조차도 보여줄 수가 없다.

### WEB, WAS, DB

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

* 정적 리소스는 웹 서버가 처리하게 한다.
* 웹 서버는 애플리케이션 로직 등 동적인 처리가 필요할 때 WAS에 요청을 위임한다.
* WAS는 중요한 애플리케이션 로직 처리를 전담한다.

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

* 효율적으로 리소스를 관리할 수 있다.
  * 정적 리소스가 많이 사용되면 웹 서버를 증설한다.
  * 애플리케이션 리소스가 많이 사용되면 WAS를 증설한다.

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

* 정적 리소스만 제공하는 웹 서버는 잘 죽지 않는다.
  * 단순히 파일만 읽어서 클라이언트에 제공하면 된다.
* 애플리케이션 로직이 동작하는 WAS 서버는 잘 죽는다.
* WAS, DB 장애가 발생하면 웹 서버가 오류 화면을 제공할 수 있다.
