'스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술' 수업을 듣고 정리한 내용입니다.
클라이언트와 서버간에 통신할 때 HTTP를 기반으로 통신한다.
서버 간에 데이터를 주고받을 때도 HTTP를 사용한다.
웹 서버(Web Server)
- HTTP 기반으로 동작
- 정적 리소스 제공, 기타 부가기능
- 정적(파일) HTML, CSS, JS, 이미지, 영상
- ex) NGINX, APACHE
웹 애플리케이션 서버(WAS)
- HTTP 기반으로 동작
- 웹 서버 기능 포함 + 정적 리소스 제공 가능
- 프로그램 코드를 실행해서 애플리케이션 로직 수행
- 동적 HTML, HTTP API(JSON)
- 서블릿, JSP, 스프링 MVC
- ex) 톰캣(Tomcat) Jetty, Undertow
웹 서버와 웹 애플리케이션 서버(WAS)의 차이
- 웹 서버는 정적 리소스(파일),
WAS
는 애플리케이션 로직- 자바는 서브릿 컨테이너 기능을 제공하면
WAS
WAS
는 애플리케이션 코드를 실행하는데 더 특화되어 있다.
WAS
, DB
만으로 시스템 구성 가능WAS
는 정적 리소스, 애플리케이션 로직 모두 제공 가능
WAS
에 요청을 위임한다.WAS
는 중요한 애플리케이션 로직 처리 전담한다.
Web
서버 증설WAS
증설
WAS
서버는 잘 죽는다.WAS
, DB
장애시 WEB
서버가 오류 화면 제공 가능하다.
서블릿 : 서버에서 웹 페이지 등을 동적으로 생성하거나 데이터 처리를 수행하기 위해 자바로 작성된 프로그램
ex) 웹 브라우저가 생성한 요청 HTTP 메시지
WAS
: 웹 애플리케이션 서버
(1) WAS
를 직접 구현한 경우
➡️ WAS
를 직접 구현해야 하는 경우, 의미있는 비즈니스 로직뿐만 아니라 여러 일들을 모두 구현해줘야 한다.
(2) 서블릿을 지원하는 WAS
사용
서블릿을 지원하는 WAS
를 사용하면, 비즈니스 로직만 처리해주면 된다.
(서블릿은 모든 기능들을 지원한다.)
WebServlet
애노테이션을 이용할 시 urlPatterns(/hello)
속성으로 해당 URL이 호출되면 서블릿 코드가 실행된다.HttpServletRequest
HttpServletResponse
localhost:8080/hello
로 요청시
WAS
는 Request
, Response
객체를 새로 만들어서 서블릿 객체 호출한다.Request
객체에서 HTTP 요청 정보를 편리하게 꺼내서 사용한다.Response
객체에 HTTP 응답 정보를 편리하게 입력한다.WAS
는 Response
객체에 담겨 있는 내용으로 HTTP 응답 정보를 생성한다.
서블릿 컨테이너 : 톰캣처럼 서블릿을 지원하는
WAS
JSP
도 서블릿으로 변환 되어서 사용된다.
(1) 클라이언트가 서버에 요청하면 WAS
가 응답한다.
(2) WAS
에서는 TCP/IP
연결된다.
(3) servlet
을 누군가가 호출해준다.
쓰레드
- 쓰레드 : 애플리케이션 코드를 하나하나 순차적으로 실행하는 것
- 자바 메인 메서드를 처음 실행하면
main
이라는 이름의 쓰레드가 실행된다.- 쓰레드가 없다면 자바 애플리케이션 실행이 불가능하다.
- 쓰레드는 한 번에 하나의 코드 라인만 수행한다.
- 동시 처리가 필요하다면 쓰레드를 추가로 생성해야 한다.
요청이오면 쓰레드를 할당한다.
할당된 쓰레드를 통해 서블릿을 실행한다.
이후 응답처리가 완료되면
서블릿은 휴식을 취하게 된다.
요청을 하였지만 처리하는데 있어 지연되었다.
이때, 요청2번이 들어온다.
아직 서블릿이 처리 지연 중이라, 요청2는 기다리게 된다.
이럴 경우 문제가 발생한다.
요청 마다 신규 쓰레드를 생성할 시 해결할 수 있다.
장점
단점
요청이 올시 쓰레드 풀에 요청들을 저장해놓는다.
사용하는 쓰레드는 그림에서와 같이 검정색 1, 2번 같이 사용한다.
쓰레드 풀에 저장되어 있는 개수가 2개 줄어들게 되고, 1번과 2번을 다 사용했을 시 사용된 쓰레드는 다시 쓰레드 풀에 돌아온다. (200 → 198 → 200)
쓰레드 풀에 제한한 개수로 가득찼을 때 새로 들어오는 쓰레드들은 대기를 한다.
(또는 거절을 할 수 있다.)
요청 마다 쓰레드 생성의 단점 보완
(1) 특징
- 필요한 쓰레드를 쓰레드 풀에 보관하고 관리한다.
- 쓰레드 풀에 생성 가능한 쓰레드의 최대치를 관리한다. 톰캣은 최대 200개 기본 설정 (변경 가능하다.)
(2) 사용
- 쓰레드가 필요하면, 이미 생성되어 있는 쓰레드를 쓰레드 풀에서 꺼내서 사용한다.
- 사용을 종료하면 쓰레드 풀에 해당 쓰레드를 반납한다.
- 최대 쓰레드가 모두 사용중이어서 쓰레드 풀에 쓰레드가 없다면?
- 기다리는 요청을 거절하거나 특정 숫자만큼만 대기하도록 설정할 수 있다.
(3) 장점
- 쓰레드가 미리 생성되어 있으므로, 쓰레드를 생성하고 종료하는 비용(CPU)이 절약되고, 응답 시간이 빠르다.
- 생성 가능한 쓰레드의 최대치가 있으므로 너무 많은 요청이 들어와도 기존 요청은 안전하게 처리할 수 있다.
✏️ 쓰레드 풀 실무 팁
WAS
의 주요 튜닝 포인트는 최대 쓰레드(max thread) 수이다.- 이 값을 너무 낮게 설정할 시?
- 동시 요청이 많으면, 서버 리소스는 여유롭지만, 클라이언트는 금방 응답 지연된다.
- 이 값을 너무 높게 설정할 시?
- 동시 요청이 많으면, CPU, 메모리 리소스 임계점 초과로 서버 다운된다.
- 장애 발생시?
- 클라우드면 일단 서버부터 늘리고, 이후에 튜닝한다.
- 클라우드가 아니면 열심히 튜닝한다.
✏️ 쓰레드 풀 - 쓰레드 풀의 적정 숫자
- 적정 숫자는 어떻게 찾을까?
- 애플리케이션 로직의 복잡도, CPU, 메모리, IO 리소스 상황에 따라 모두 다르다.
- 성능 테스트
- 최대한 실제 서비스와 유사하게 성능 테스트 시도
- 툴: 아파치 ab, 제이미터, nGrinder
🔔
WAS
의 멀티 쓰레드 지원
- 멀티 쓰레드에 대한 부분은
WAS
가 처리한다.- 개발자가 멀티 쓰레드 관련 코드를 신경쓰지 않아도 된다❗️
- 개발자는 마치 싱글 쓰레드 프로그래밍을 하듯이 편리하게 소스 코드를 개발할 수 있다.
- 멀티 쓰레드 환경이므로 싱글톤 객체(서블릿, 스프링 빈)는 주의해서 사용한다.
HTTP API - 다양항 시스템 연동
(1) 주로 JSON 형태로 데이터 통신
(2) UI 클라이언트 접점
(3) 서버 to 서버
🔔 정리
백엔드 개발자가 서비스를 제공할 때 고민해야할 3가지
(1) 정적 리소스를 어떻게 제공할 것인지?
(2) 동적으로 제공되는 HTML 페이지를 어떻게 제공할 것인지?
(3) HTTP API를 어떻게 제공할 것인지?
(1) SSR - 서버 사이드 렌더링
JSP
, 타임리프 → 백엔드 개발자(2) CSR - 클라이언트 사이드 렌더링
React
, Vue.js
→ 웹 프론트엔드 개발자(3) 참고
React
, Vue.js
를 사용하더라도, CSR + SSR 동시에 지원하는 웹 프레임워크도 있다.SSR
을 사용하더라도, 자바스크립트를 사용해서 화면 일부를 동적으로 변경 가능하다.
✏️ 백엔드 개발자 입장에서 UI 기술
(1) 백엔드 - 서버 사이드 렌더링 기술
JSP
, 타임리프- 화면이 정적이고, 복잡하지 않을 때 사용한다.
- 백엔드 개발자는 서버 사이드 렌더링 기술 학습 필수이다.
(2) 웹 프론트엔드 - 클라이언트 사이드 렌더링 기술
React
,Vue.js
- 복잡하고 동적인 UI 사용
- 웹 프론트엔드 개발자의 전문 분야
(3) 선택과 집중
- 백엔드 개발자의 웹 프론트엔드 기술 학습은 옵션이다.
- 백엔드 개발자는 서버, DB, 인프라 등등 수 많은 백엔드 기술을 공부해야 한다.
- 웹 프론트엔드도 깊이있게 잘 하려면 숙련에 오랜 시간이 필요하다.
@Controller
WAS
를 직접 설치하고, 소스는 War 파일을 만들어서 설치한 WAS
에 배포WAS
서버 포함 → 빌드 배포 단순화