정적 페이지와 동적 페이지
정적 페이지 | 동적 페이지 |
---|---|
(HTML, CSS, 이미지, JS) 저장된 그대로 사용자에게 전달되는 웹 페이지, 모든 상황에서 모든 사용자에게 동일한 정보를 표시 | 서버에 있는 데이터들을 스크립트에 의해 가공처리 후 생성되어 전달되는 웹 페이지, 시간/상황/요청 등에 따라 다른 정보 표시 |
작성자가 소수이고 콘텐츠 변화가 드문 사이트에 적합 |
예를 들어, 다양한 사용자의 사이트에서 정적 페이지로 서비스를 만든다면 사용자 마다 폴더를 갖고 그 안에 html이나 md 파일을 저장해서 해당하는 파일을 전달할 것 같다. (말도 안되는 일..!)
웹 서비스에서는 동적 컨텐츠와 정적 컨텐츠가 모두 필요하다!
├── 김하하
│ ├── 알고리즘
│ ├── 웹
│ └── 그냥
├── 김크크
│ ├── 취업준비
│ ├── 알고리즘
│ ├── 웹
│ └── 일상
└── 김땡땡
우리가 만들었던 서비스의 구조
1) http 요청을 보낸다.
2) 웹서버에서 해당 요청을 먼저 받고, WAS로 전달해준다.
3) 우리가 설계한대로 비지니스 로직을 수행한다.
4) 응답을 웹 서버에 먼저 보낸다.
5) 웹 서버가 클라이언트로 응답을 전달한다.
- 아파치 톰캣
- 아파치 = 정적인 데이터를 처리하는 웹 서버
- 톰캣 = 동적 웹을 만들기 위한 서블릿 컨테이너
그래서 Web Application Server와 Web Server가 뭔데?!
- 웹서버
웹 브라우저와 같은 클라이언트로부터 HTTP 요청을 받아들이고, HTML 문서와 같은 웹 페이지를 반환하는 컴퓨터 프로그램
웹 서버 |
---|
- 캐시되어있는 정적 콘텐츠를 WAS를 거치지 않고 바로 제공 - 동적인 컨텐츠를 위한 요청 전달 (클라이언트 -> 웹서버 -> WAS or WAS -> 웹서버 -> 클라이언트) |
Apache, Nginx ... |
- WAS
웹서버 + 웹 컨테이너(Servlet을 실행시킬 수 있는 SW)
DB 조회나 다양한 로직 처리를 요구하는 동적인 컨텐츠를 제공하기 위해 만들어진 Application Server
WAS |
---|
- 프로그램 실행 환경과 DB 접속 기능 제공 - 업무를 처리하는 비즈니스 로직 수행 - 여러 개의 트랜잭션(논리적인 작업 단위) 관리(?😳) |
Tomcat, Jeus ... |
웹 서버를 왜 굳이 분리해서 쓰는걸까?
- 기능 분리로 인한 서버 부하 방지
WAS가 정적 컨텐츠와 동적 컨텐츠를 위한 작업(DB, 비지니스 로직..) 모두 감당하면 부담이 커짐
-> 동적 컨텐츠 지연되면 속도가 느려지고 페이지 노출 시간이 오래 걸리게 됨
-> WAS는 동적 처리에 최적화 되어 있는 서비스 간단히 말하면 !!분산처리!! 를 위한 것이다.
- 보안
- 직접 WAS까지 요청이 가지 않고 중간에 웹 서버를 거쳐 전달되기 때문에 실제 서버의 주소를 알 수 없다.
- Web Application에 설정한 다양한 중요 파일, 리소스들이 외부에 노출되지 않도록 보호할 수 있다.
- 여러 WAS 연결 == 로드밸런싱
많은 사용자의 요청을 여러 서버에서 처리할 수 있도록 하기 위해서 규모가 커지면 여러 대의 WAS가 필요해진다.
WAS 각각 요청을 들어오도록 하지 않고 앞에 웹 서버를 두고 요청을 적절히 분배한다.
- 여러 Web Application 서비스
서로 다른 서버들을 하나의 웹 서버에 연결해서 서비스 할 수 있다. (java, php ...등)
프로젝트에서 어떻게 사용하면 좋을까?
- 정적 리소스 전달할 때
정적 컨텐츠, 반복 요청되는 데이터 호출, 일정 기간 동안 동일한 내용으로 유지되는 동적 컨텐츠를 일시적으로 캐싱하여 WAS가 처리할 일을 줄여주고,
빈번한 DB 호출도 줄여 서비의 성능 유지
웹 캐시 = 서버 지연을 줄이기 위해 웹 페이지, 이미지, 기타 유형의 웹 멀티미디어 등의 웹 문서들을 임시 저장하기 위한 정보기술
- 로드밸런싱 할 때
말 그대로 작업을 나누는 것을 의미함.
서비스를 출시 했는데, 사용자가 점점 늘어 서버의 수가 늘어났다고 가정한다.
위와 같은 구조로 설계하여 여러 대의 서버로 트래픽을 균등하게 분산해주는 로드 밸런싱을 이용해야 한다.
근데 우린 사실 웹 서버를 써 봤다!! 이제는 알고 쓰자!
정적 리소스를 전달할 때 다음과 같은 명령어를 입력했던 기억이 있다.
그냥 바로 ec2 서버에서 전달해줘도 될텐데 왜 굳이 nginx를 컨테이너로 실행해서 전달 하도록 했을까?
바로 정적 컨텐츠 전달 에 주 목적이 있을 것이다.
docker run —name nginx -d -p 80:80 -v /home/ec2-user/dist/:/usr/share/nginx/html nginx
이제 우리는 Nginx를 써봤고, 앞으로 사용할 것이기 때문에 이를 기반으로 면접을 준비하자.
공부하면 좋을 키워드
- 로드밸런싱
- 프록시 서버 (포워드 프록시와 리버스 프록시)
출처
https://doorisopen.github.io/developers-library/Interview/2020-01-30-interview-server-dev-interview-list
https://gmlwjd9405.github.io/2018/10/27/webserver-vs-was.html 👏
https://itgit.co.kr/static_dynamic_content/