I. 모든 것이 HTTP
다음은 모두 HTTP 기반으로 동작합니다.
1)웹 서버
- http 프로토콜로 주고 받을 수 있는 것을 웹 서버라고 하며 http 기반으로 동작합니다
2) 웹 애플리케이션 서버
- 사용자에 따라서 다른 화면들을 보여줄 수 있습니다
- 동적 html, http api(rest api) 등을 제공할 수 있습니다
- 서블릿, jsp, 스프링 mvc 모두 실행 가능합니다.
3) 이 둘의 차이
- 웹 서버 - 정적 리소스 파일 VS was는 웹 애플리케이션 로직이라고 보면 됩니다.
- 사실 이 둘의 경계는 모호하지만, 자바는 서블릿 컨테이너 기능을 제공하면
was
라고 하며, was
는 애플리케이션 코드를 실행하는데 더 특화되어있다고 구분하면 됩니다.
4) 웹 시스템 구성 - was, db
최소한으로 보면 이 둘로 구분할 수 있습니다.
- 하지만
was
가 너무 많은 일은 하나로 수행하게 되면 서버 과부화가 될 수 있습니다.
- html/css/js 같은 건 서빙하면 되어서 단순하지만, 애플리케이션 로직은 이들보다 매우 비쌉니다.
- 파일을 불러다 보여주면 되지만 애플리케이션 로직은 비즈니스 로직이 들어가 있어서 가장 비쌉니다.
- 따라서, 정적 리소스 때문에 애플리케이션 로직이 수행이 어려울 수도 있습니다.
was
장애시 오류 화면도 노출이 불가능하게 됩니다.
5) 그래서 웹 시스템 구성하는 방법?
웹 시스템 구성 - web, was, DB
장점
-
앞에 web server
를 두고 정적 리소스를 처리 → 뒤에서 was
는 애플리케이션 로직만 담당하게 되어 중요 처리를 분담하게 됩니다.
-
효율적인 리소스 관리가 가능해집니다.
- 정적 리소스가 많아지면 web 서버 증설하면 되고 반대로 애플리케이션 로직이 많아지면
was
를 증설하면 되기 때문입니다.
-
정적 리소스 제공하는 웹 서버는 잘 죽지 않지만,, was
서버는 잘 죽습니다.
was
또는 db
가 제대로 응답을 못하면 web 서버에서 오류화면을 제공할 수 있습니다.
- 데이터만 구축하게 될 경우에는
was
서버만 구축하면 됩니다.
II. 서블릿
- METHOD = ‘POST’로 전송해 저장한다고 해봅시다.
- “서블릿” 은 비즈니스 로직 실행을 제외한 모든 기능을 모두 수행합니다.
- HTTP 요청 메시지 파싱
- …
- 원래 서버에서 처리해야 할 업무들을 모두 비즈니스 로직 제외한 내용들을 수행합니다.
2) 서블릿
특징
-
HTTP 요청 정보를 편리하게 사용할 수 있는 HttpServletRequest
가 있습니다.
-
HTTP 응답 정보를 편리하게 제공하는 HttpServletResponse
가 있습니다.
-
서블릿 컨테이너 : 서블릿 객체를 생성, 호출하며, WAS
가 내려갈 때 서블릿 객체도 같이 내려줍니다.
-
톰캣처럼 서블릿 지원하는 WAS
를 서블릿 컨테이너
라고 합니다.
-
서블릿 객체는 싱글톤으로 관리합니다. (모두 공유해서 사용)
- 최초 로딩 시점에 서블릿 객체를 미리 만들어두고 재활용합니다.
- 모든 고객 요청은 동일 서블릿 객체 인스턴스에 접근하여 로직을 실행하게 됩니다.
- 공유 변수에 주의해야합니다. 싱글톤 객체는 멤버변수 사용할 때 주의해야 합니다.
- 서블릿 컨테이너 종료할 때 서블릿 객체도 같이 종료됩니다.
-
JSP도 서블릿으로 변환되어 사용됩니다.
-
동시 요청 위한 멀티 쓰레드 처리를 지원합니다.
III. 동시요청 - 멀티 쓰레드
서블릿 객체는 누가 호출하는가?
쓰레드
가 호출합니다.
- 애플리케이션 코드를 하나하나 내부에서 순차적으로 실행하는 것을 말합니다.
- EX. 메인 메서드를 실행하면 MAIN 이름의 스레드가 실행되는 것입니다.
- 스레드가 없으면 자바 애플리케이션 실행이 아예 불가능합니다.
- 스레드는 한번에 하나의 코드 라인만 수행합니다.
- 따라서, 동시처리가 필요하면 하나 이상이 필요합니다.
- 요청1에서 스레드를 사용하고 있으니(처리가 지연되는 중), 요청2는 계속해서 대기해야 합니다.
→ 요청마다 스레드를 생성해야 합니다.
요청마다 스레드를 생성하는 것의 장단점
장점
- 동시 요청 처리가 가능하다.
- 하나의 쓰레드가 지연되어도, 나머지 스레드는 정상 동작합니다.
단점
-
스레드는 생성비용이 매우 비쌉니다.
-
스레드는 컨텍스트 스위칭 비용이 발생합니다.
- cpu의 코어가 만약 하나라면, 코어 하나가 하나씩 수행, 전환할때 비용이 발생하는데 이를 ‘컨텍스트 스위칭 비용’ 이라고 합니다.
-
스레드 생성 제한이 없습니다.
- 고객 요청이 너무 많이 오면, 메모리 임계점을 넘게되어 서버가 죽을 수도 있습니다. 못버티고 서버가 다운됩니다.
→ 내부에 스레드 풀이 있습니다.
- 스레드 풀에서 갖다 쓰고 사용이 다 되면 스레드 풀에 반납을 합니다. 이런 식으로 스레드를 빌려쓰고 가져다 놓는 방식을 수행합니다.
- 스레드가 200개가 한계라고 한다면, 스레드가 없을 경우, 스레드를 대기하고, 거절합니다.
3) 쓰레드 풀 (요청마다 생성되는 스레드의 단점 보완)
특징
- 필요 스레드를 스레드 풀에 보관하고 관리합니다.
- 톰캣은 최대 200개 기본으로 설정합니다.
사용
- 스레드가 필요하면 스레드 풀에서 가져다 사용하게 됩니다.
- 사용 종료시 해당 스레드를 스레드 풀에 반납합니다.
- 만약 스레드 풀에 스레드가 없다면 특정 숫자만큼 대기하도록 설정하게 됩니다.
4) 쓰레드 풀 - 실무팁
was
의 주요 튜닝 포인트는 최대 쓰레드 수입니다.
- 너무 낮게 설정하게 되면,,
- 만약, 10개를 스레드 풀에 세팅을 한다고 하면, 동시 요청이 많게 되면 클라이언트는 응답 지연이 되게 됩니다.
- 너무 높게 설정하게 되면
- 동시 요청이 많으면 임계점 초과되어 서버가 다운될 수 있습니다.
5) 쓰레드 풀 - 적정 숫자
- 상황에 따라 모두 다르기 때문에
성능 테스트
를 해봐야합니다.
- 가급적이면 실제 서비스와 유사하게 성능 테스트를 시도하는 것도 좋습니다.
- 툴 : 아파치 ab, 제이미터, nGrinder
6) WAS 의 멀티 쓰레드 지원(핵심)
- WAS가 멀티스레드를 지원한다는 것입니다. 개발자가 스레드 관련 코드를 신경쓰지 않아도 됩니다.
- 개발자는 비즈니스 로직만 작성하면 됩니다. 마치 싱글 쓰레드 프로그래밍하듯 편리하게 소스코드를 개발하면 됩니다.
- 대신, 어찌돼었든 멀티 쓰레드 환경이므로, 싱글톤(서블릿, 스프링 빈)은 주의해서 사용해야 합니다.
- 멤버변수(공유변수)는 주의하기만 하면 잘 애플리케이션 개발할 수 있습니다.
IV. HTML, HTTP API, CSR, SSR
백엔드 개발자가 다음의 세 가지를 고민해야 합니다.(정적 리소스, html, http api)
1) 정적 리소스
2) HTML 페이지(동적)
- was가 db를 통해 주문정보를 조회 후 동적으로 html를 생성합니다.(jsp, 타임리프를 통해) 이후 웹 브라우저에 올려줍니다.
3) HTTP API
4) 서버사이드 레더링 SSR
- 서버에서 동적 html까지 모두 생성해서 웹브라우저에서 보여주는 것입니다. 웹 브라우저는 보여주는 역할만 합니다.
- 서버에서 html까지 모두 생성해 렌더링하는 것을 말합니다.
5) 클라이언트 사이드 렌더링 CSR
- html 결과를 자바스크립트로 웹브라우저에서 동적으로 생성해서 적용하는 것을 말합니다.
- DOM 구조에 HTML 넣도록 하여 HTML를 건드는 것으로, 클라이언트쪽에서 HTML를 만진다고 하여 ‘클라이언트 사이드 렌더링’이라고 합니다.
- 필요 부분만 변경할 수 있습니다.
→ HTML 내용이 없이 응답(자바스크립트 링크를 내려준다)
→ 자바스크립트 링크를 요청합니다.(클라이언트 로직 + HTML 렌더링 코드
가 포함되어 있습니다.)
→ HTTP API로 데이터를 요청합니다.
6) 정리(백엔드 개발자 입장에서 UI 기술 어디까지 알아야 하는가)
백엔드-SSR
- 주로 정적 화면에 사용하며, HTML 최종 결과를 서버에서 만들어 웹브라우저에 전달합니다.
- JSP보다는, 타임리프를 공부하는 것을 권장합니다.
- 화면이 정적이고 복잡하지 않을 때 사용합니다.
- 백엔드 개발자는 서버 사이드 렌더링 기술 학습이 필수적입니다.
프론트엔드-CSR
- HTML 결과를 자바스크립트를 사용해 웹 브라우저에서 동적 생성하여 적용합니다.
- 필요 부분만 변경할 수 있고, 이 기술은 웹 프론트엔드 기술자들이 사용합니다.
- React, Vue.js를 사용하며 프론트엔드 개발자의 전문 분야입니다.
선택과 집중
- 웹 프론트엔드 기술 학습은 옵션입니다.
- 백엔드 개발은 서버, DB, 인프라 등등 배워야 할 기술이 많기 때문입니다.
V. 자바 백엔드 웹 기술 역사
- 서블릿 …html 생성의 어려움 발견
- JSP … HTML 생성은 편하지만 비즈니스 로직까지 너무 많은 역할을 담당하게 됩니다.
- 서블릿, JSP 조합 MVC 패턴을 사용합니다..모델, 뷰, 컨트롤러로 나누어 개발합니다.
→ 비즈니스로직 부분(서블릿, 자바), 화면 렌더링 부분(JSP)을 나누게 됩니다.
이후 애노테이션 기반 스프링 MVC가 등장하게 됩니다.
- 스프링 부트 등장
- 스프링 부트에는 서버를 내장하고 있고, 빌드 결과에 was 서버를 포함시켜 빌드 배포를 단순화시킵니다.
1) 최신기술(스프링 웹 플럭스)
- 최소 스레드로 최대 성능을 냅니다. 이는 컨텍스트 스위칭 비용을 효율화시킵니다.
- 함수형 스타일로, 동시처리 코드를 효율화시킵니다.
- 다만, 스프링 웹 플럭스는 기술적 난이도도 높으며 실무에서 많이 사용하지 않습니다.
2) 자바 뷰 템플릿 역사
jsp → 속도가 느리고 기능이 부족합니다.
타임리프 →
내추럴 템플릿(html모양을 유지하면서 뷰 템플릿 적용이 가능합니다.) 되게 깔끔합니다.
최선의 선택이라고 볼 수 있습니다.
스프링 mvc와 강력하게 기능 통합이 가능합니다.