📄 3계층형 시스템 웹 데이터 흐름
클라이언트PC ➜ 웹 서버 ➜ AP 서버 ➜ DB 서버 ➜ AP서버 ➜ 웹 서버 ➜ 클라이언트PC
이런 과정에서 클라이언트 요청한 값을 3계층이 해석하고 해석한 값을 처리한 값을 전달하면서 다시 클라이언트에게 결과값을 보여준다.
웹 서버에서는 클라이언트가 요청한 데이터를 해석한 후 웹 서버에 전송한다. 웹 서버에서 프로세스가 요청을 접수한다. 요청 내용을 분석해서 이게 동적인지 정적인지 내용을 판단하다. 만약 이 값이이 동적이라면 AP 서버에 요청을 보낸다. 클라이언트 PC와 웹서버 사이에서 이러한 과정이 일어난다.
요약하자면
- 웹 브라우저가 요청을 발행한다.
- 이름 해석을 한다.
- 웹서버가 요청을 접수한다.
- 웹 서버가 정적 콘텐츠인지 동적콘텐츠인지 판단한다.
- 필요한 경로로 데이터에 액세스한다.
✍🏻동적콘텐츠란?
높은 빈도로 변경되는 데이터를 말한다. 예를 들면 클라이언트에게 실시간으로 변하는 날씨, 변동하는 주식, 은행에서 현금을 인출했을 때 변하는 은행 잔고를 말한다. 갱신 빈도가 높은 데이터는 병목현상의 원인이 될 수 있다.
✍🏻이름 해석
웹 브라우저는 요청한 데이터가 어디 서버에 있는지 모르기 때문에 조사를 시작한다. 웹 브라우저는 ip주소를 모른다. ip주소와 문자열인 URL을 연결시키는 작업을 시작한다.
"동적 콘텐츠"에 대한 요청을 처리하는 것이 AP서버이다.
- 웹 서버로부터 요청이 도착한다.
- 스레드가 요청을 받으면 자신이 계산할 수 있는지, 아니면 DB접속이 필요한지 판단한다.
- DB 접속이 필요하면 연결 풀에 액세스한다.
- DB서버에 요청을 던진다.
웹 서버로 부터 요청이 온 데이터는 커널 통해 해석을 한다. 그리고 스레드가 요청을 받아 어떻게 처리할 지 판단한다.
AP서버가 자바, 파이썬(Django), Nodejs 등 다양한 백엔드 언어로 처리한다. 그 중 자바를 예로 설명하자면 자바는 AP서버에서 Java Virtual Machine(JVM)이라는 가상 머신이 동작하고 있다. JVM은 하나의 거대한 프로세스다. 프로세스에서 어떤 명령을 수행할지 접수받은 스레드가 요청값을 계산해서 결과를 반환한다. 쓰레드가 DB에 서버 요청을 전달할지 말지를 결정한다.
✍🏻 DB서버 이외의 옵션
자주 바뀌지 않는 정보를 매번 DB에 요청을 보내는 것은 효율적인 방식이 아니다. 규모가 작고 빈도 낮은 정보는 JVM 내부(프로세스)에 캐시로 저장 해두다가 필요할 때 반환하는게 효율적이다.
규모가 큰 정적인 데이터는 CDN(Content delivery network)을 이용한다.
DB서버는 SQL이라는 언어 형태로 이루워져 있다. 디스크나 메모리에서 필요한 데이터만 수집해 오는 것이 데이터베이스의 주요 역활이다.
✍🏻 주로 사용하는 SQL
NoSql : mongoDB
Sql : mysql, PostgerSql (웹 계열에서 인기 많음)
✍🏻 전체적인 흐름
- AP 서버로부터 요청이 도착한다.
- 프로세스가 요청을 접수하고 캐시가 존재하는지 확인한다.
- 캐시에 없으면 디스크에 엑세스한다.
- 디스크가 데이터를 반환한다.
- 데이터를 캐시 형태로 저장한다.
- 결과를 AP서버에 반환한다.
DB 서버에서 돌아온 데이터가 AP서버에 스레드로 결과를 반환한다.
✍🏻전체흐름
1. DB서버로부터 데이터가 도착한다.
2. 스레드가 데이터를 가지고 계산 등을 한 후에 파일 데이터를 생성한다.
3. 결과를 웹 서버로 반환한다.
AP 서버에서 돌아온 데이터를 받아서 웹 서버의 httpd 프로세스가 PC의 웹 브라우저로 반환한다.
✍🏻 전체 흐름
1. AP서버로부터 데이터가 도착한다.
2. 프로세스는 받은 데이터를 그대로 반환한다.
3. 결과가 웹 브라우저로 반환되고 화면에 표시된다.
✍🏻 흐름 정리
- 프로세스나 스레드가 요청을 받는다.
- 도착한 요청을 파악해서 필요에 따라 별도 서버로 요청을 보낸다.
- 도착한 요청에 대해 응답한다.
서버는 역활을 분담을 일을 처리한다. 실제로는 3계층형 보다는 더 많은 계층을 이용해서 서버를 분담하는게 대부분이다.