웹 애플리케이션 이해

·2021년 5월 17일
0

웹 서버, 웹 애플리케이션 서버

  • 웹은 HTTP 기반이다

HTTP는?

  • HTTP 메시지에 모든것을 전송해서 보낸다
  • HTML, TEXT, IMAGE, 음성, 영상, 파일, JSON, XML ..
  • 거의 모든 형태의 데이터 전송이 가능하다
  • 서버간에 데이터를 주고 받을 때도 HTTP를 사용한다.

웹서버

  • HTTP 기반으로 동작하는 서버
  • 정적 리소스 제공, 기타 부가기능
    • HTML, CSS, JS, 이미지, 영상
  • ex) NGINX, APACHE

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

  • HTTP 기반으로 동적하는 서버
  • 웹 서버의 기능을 포함한다 (정적 리소스 제공)
  • 프로그램 코드를 실행해서 애플리케이션 로직을 수행한다
    • _동적 HTML, HTTP API (JSON)
    • 서블릿, JSP, 스프링 MVC
  • ex) 톰캣, Jetty, Undertow (주로 톰캣을 사용)

웹서버, 웹 애프리케이션 서버

웹서버와 WAS의 차이

  • 웹 서버는 정적 리소스(파일), 을 제공하고 was는 애플리케이션 로직을 제공한다
  • 요즘은 경계가 모호한 편
    • 웹 서버도 프로그램을 실행하는 기능을 포함하고 was도 웹 서버의 기능을 제공함
  • JAVA는 서블릿 컨테이너기능을 제공하면 WAS다
    *사실 서블릿 없이 자바 코드를 실행하는 서버 프레임 워크도 있긴 하다
  • WAS는 애플리케이션 코드를 실행하는데 더 특화되어있다.

웹 시스템 구성

  • WAS와 DB만으로도 시스템 구성이 가능하다.
    • WAS는 정적 리소스, 애플리케이션 로직 모두 제공하기 때문
  • 하지만 WAS가 너무 많은 역할을 담당해서 서버가 과부하될 수 있다
  • WAS 장애시 오류 화면도 노출이 불가능하다
    이용량 폭주가 많아 잠시 후 시도해 주세요.. 이런 메시지조차 알려주지 못하게 된다
  • 비싼 애플리케이션 로직이 정적 리소스 때문에 수행이 어려울 수 있다

해결방안

  • 정적 리소스는 웹 서버가 처리
  • 동적 처리가 필요하면 웹서버가 WAS에 요청을 위임한다
  • WAS는 중요한 애플리케이션 로직 처리만 전담한다
  • 이렇게 만들면 효율적으로 리소스를 관리할 수 있게 된다
    *정적 리소스가 많이 사용되면 WEB 서버를 증설하고 애플리케이션 리소스가 많이 사용되면 WAS를 증설하는등..
  • WAS나 DB 장애시 WEB서버에서 오류화면을 제공할 수 있게 된다
    • 정적 리소스만 제공하는 웹 서버는 잘 죽지 않는다
    • 애플리케이션 로직이 동작하는 WAS서버는 잘 죽는다.
    • WEB 서버에서 WAS에 요청을 보냈을 때 응답이 없다면 오류화면을 띄워줄 수 있게된다.

서블릿

자바의 WAS는 서블릿 기반이다. 왜 서블릿이 등장하게 되었을까

HTML 데이터 전송

  • 데이터를 주고받을때 HTML을 사용한다.
  • 이런 식으로 usernameage 를 입력해서 전송하려면 HTTP 규격에 맞는 메시지를 전송해서 서버에 보내야 한다.
  • 서버는 저 메시지 하나를 받고 응답을 보내기 위해 많은 작업을 해야한다.
    *TCP/IP 연결대기.. 파싱.. 비즈니스 로직 실행 후 응답메시지 작성.. 소켓 종료..
  • 비즈니스 로직에만 집중하기 위해 서블릿이 등장하게 되었다.

서블릿의 특징

@WebServlet(name = "helloServlet", urlPatterns = "/hello") 
public class HelloServlet extends HttpServlet { 
	@Override 
    protected void service(HttpServletRequest request, HttpServletResponse response){ 
 		//애플리케이션 로직
 	} 
}
  • urlPatterns(/hello) 의 URL이 호출되면 서블릿 코드가 실행된다
  • HttpServletRequest : HTTP 요청 정보를 편리하게 사용할 수 있다
  • HttpServletResponse : HTTP 응답 정보를 편리하게 제공할 수 있다.
  • 서블릿을 이용해서 개발자는 HTTP 스펙을 편리하게 사용할 수 있게 된다.

WAS(서블릿)의 흐름


1. HTTP 요청이 들어오면 Request, Response 객체를 새로 만들어서 서블릿 객체를호출한다.
2. Request 객체에서 HTTP 요청 정보를 꺼내서 작업
3. Response 객체에 응답 정보를 입력한다.
4. WAW는 Response 객체에 담겨져 있는 내용으로 응답정보를 생성한다.

서블릿 정리

  • 톰캣처럼 servlet을 지원하는 WAS를 서블릿 컨테이너라고 한다.
  • 서블릿 컨테이너는 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기를 관리해준다.
  • 서블릿 객체는 싱글톤 으로 관리한다
    • 고객의 요청이 들어올때마다 계속 객체를 생성하는 것은 비효율적이기 때문이다.
    • 그래서 최초 로딩 시점에 서블릿 객체를 미리 만들어두고 재활용한다.
    • 모든 고객요청은 동일한 서블릿 객체 인스턴스에 접근하게 된다.
    • 싱글톤에 멀티쓰레드기 때문에 공유변수를 사용할시 주의애야 한다.
    • 서블릿 객체는 컨테이너 종료시 함께 종료된다
  • JSP도 서블릿으로 변환되어서 사용된다.
  • 서블릿은 동시 요청을 위한 멀티 쓰레드 처리를 지원한다

동시요청 - 멀티 쓰레드

서블릿 객체를 호출해주는 쓰레드에 대해서 알아보자

쓰레드란?

  • 애플리케이션 코드를 하나하나 순차적으로 실행해주는게 쓰레드다
  • 자바 메인메서드 main 얘도 main쓰레드다
  • 쓰레드가 없으면 자바 애플리케이션 실행이 불가능하다.
  • 쓰레드는 한번에 하나의 코드 라인만 수행한다.
  • 만약에 동시에 처리하고 싶으면 쓰레드를 추가로 생성해야 한다 (멀티쓰레드)

서블릿이 단일쓰레드라면


1. 요청이 들어온다
2. 쉬고있던 쓰레드와 연결된다
3. 쓰레드는 서블릿을 호출한다

4. 서블릿에서 작업후 응답을 보낸다.

5. 쓰레드 휴식

이 때 요청이 두개가 들어온다면?

  • 요청 1을 작업하던 중 요청 2가 들어오게 된다면 요청 2는 작업이 끝날 때까지 기다려야한다.
  • 만약 요청1에서 처리가 지연된다면 둘다 응답이 오지 못하는 경우가 생긴다
  • 그렇기 때문에 서블릿은 요청마다 쓰레드를 생성하는 멀티쓰레드를 이용한다

멀티쓰레드의 장단점

장점

  • 동시 요청을 처리할 수 있다
  • 리소스(CPU, 메모리)가 허용될 때까지 처리가 가능하다
  • 하나의 쓰레드가 지연되어도 나머지 쓰레드는 정상동작한다.

단점

  • 쓰레드 생성비용이 비싸다
    • 고객의 요청이 들어올 때마다 쓰레드를 생성하면 응답속도가 늦어진다.
  • 쓰레드는 컨텍스트 스위칭 비용이 발생한다
    • 동시에 같이 진행하는것처럼 보여도 쓰레드1 쓰레드2를 번갈아가면서 하는거다
      적게는 티가 안나지만 쓰레드가 많아지면 비용이 커질 수밖에 없다
  • 쓰레드 생성에 제한이 없다
    • 고객 요청이 너무 많이 오면, CPU, 메모리 임계점을 넘어서 서버가 죽을 수 있다
      논리적으로 스케일 아웃의 한계는 없지만 현실적으로는 네트워크 대역폭 등의 한계가 있는데 이를 임계점이라 한다

쓰레드 풀

  • 쓰레드 생성에 제한을 두게 하자

    특징
  • 필요한 쓰레드를 쓰레드 풀에 보관하고 관리한다
  • 쓰레드 풀에 생성 가능한 쓰레드의 최대치를 관리한다. (톰캣은 최대 200개가 기본설정이고 변경이 가능하다)
    사용
  • 쓰레드가 필요하면 이미 생성되어 있는 쓰레드를 쓰레드 풀에서 꺼내서 사용한다
  • 사용을 종료하면 쓰레드 풀에 해당 쓰레드를 반납
  • 최대 쓰레드가 모두 사용중이어서 쓰레드 풀에 쓰레드가 없다면
    • 기다리는 요청을 거절하거나 특정 숫자만큼 대기시킬 수 있다.
      장점
  • 쓰레드가 미리 생성되어 있으므로 쓰레드를 생성하고 종료하는 비용(CPU)이 절약되고 응답시간이 빠르다
  • 생성가능한 쓰레드의 최대치가 있으므로 너무 많은 요청이 들어와도 기존 요청은 안전하게 처리할 수 있다.

실무에서는 어떻게 사용할까

  • WAS의 주요 튜닝포인트는 최대 쓰레드 수(max thread)
  • max thread가 너무 낮다면?
    • 동시 요청이 많을때 서버 리소스는 여유롭지만 클라이언트는 금방 응답지연이 된다
  • max thread가 너무 높으면?
    • 동시 오청이 많을 때 CPU, 메모리 리소스 임계점 초과로 서버가 다운된다
  • 장애 발생시?
    • 클라우드의 경우엔 일단 서버를 늘리고 이후에 튜닝한다
    • 클라우드가 아니면 평소에 열심히 튜닝해보자
  • 쓰레드 풀의 적정숫자
    • 애플리케이션의 복잡도, CPU, 메모리, IO 리소스.. 상황에 따라 천차만별
    • 성능테스트를 해보자
      • 최대한 실제 서비스와 유사하게 성능테스트를 시도하기
      • TOOL : 아파치 ab, 제이미터, nGrinder ..

정리

  • 멀티 쓰레드에 대한 부분은 WAS가 처리한다
  • 개발자가 멀티 쓰레드 관련 코드를 신경쓰지 않아도 된다
  • 개발자는 싱글쓰레드 프로그래밍을 하듯 편리하게 소스코드를 개발하면 된다
  • 멀티쓰레드 환경이므로 싱글톤 객체 (서블릿, 스프린 빈)은 주의해서 사용해야한다
profile
💻📝🤯

0개의 댓글