교육 자료

웹 애플리케이션 이해

사람냄새나는 개발자 2022. 7. 18. 22:16
웹 애플리케이션 이해 01 계산기 프로그램을 웹 애플리케이션으로 만들기
  02 HTTP 프로토콜 이해
서블릿 프로그래밍 01 CGI 프로그램과 서블릿
  02 계산기 서블릿 만들기

 

계산기 프로그램을 웹 애플리케이션으로 만들기


실습

  • 첫 번째 단계
    • 사용자 요청을 메인 Thread가 처리하도록 한다.
  • 두 번째 단계
    • 사용자 요청이 들어올 때마다 Thread를 새로 생성해서 사용자 요청을 처리하도록 한다.
      • Thread는 생성될 때마다 독립적인 스택 메모리 공간을 할당받는데 메모리 할당 작업은 상당히 비싼 작업이다. 따라서, 사용자 요청이 있을 때마다 Thread를 생성한다면 성능이 떨어진다.
      • 동시 접속자 수가 많아질 경우 많은 Thread가 생성되는데 Thread가 많아지면 CPU 컨텍스트 스위칭(Context Switching) 횟수 및 CPU와 메모리 사용량이 증가하게 된다. 따라서, 최악의 경우 서버의 리소스(CPU 및 메모리 자원) 한계로 인해 서버가 다운될 가능성이 높다.
  • 세 번째 단계
    • Thread Pool을 적용해 안정적인 서비스가 가능하도록 한다.
  • 실습 코드

 

 

HTTP란


  • 서버와 클라이언트가 웹에서 데이터를 주고받기 위한 프로토콜(규약)
  • 거의 어떤 종류의 데이터든지 전송 가능 
  • 참고 
    • HTTP/1.1 , HTTP/2는 TCP 기반 위에서 동작 
      • 3-way handshake로 연결을 맺음
    • HTTP/3는 UDP 기반 위에서 동작

 

HTTP 요청/응답 메시지 구조 

 

HTTP 특징 

  • 클라이언트-서버 모델 따름 
    • 클라이언트가 서버에 요청을 보내면 서버는 클라이언트에게 응답을 보낸다.
  • 무상태 프로토콜(Stateless)
    • 서버가 클라이언트 상태를 유지하지 않음 
    • 각 요청을 독립적인 트랜잭션으로 취급
      • 해결책 : Keep-Alive 사용 
        • 단점은 없을까? No! Keep-Alive가 성능 하락의 주범이 되기도 한다. 왜냐하면, Keep-Alive 기능이 켜져 있는 상태에서 클라이언트 요청이 많아지게 되면 유지되는 커넥션도 자연스럽게 많아지게 되고 이로 인해 신규 사용자를 못 받아줄 수도 있기 때문 (웹서버 스레드 부족)

  • 비 연결성(Connectionless)
    • 서버가 클라이언트 요청에 대해 응답을 마치면 맺었던 연결을 끊어 버림 
      • 해결책 : 쿠키(클라이언트에 정보 저장), 세션(서버에 정보 저장), JWT 
  • 왜?
    • HTTP는 기본적으로 웹 상에서 불특정 다수와 통신이 가능하도록 설계가 됐다. 이런 상황에서 만약 서버가 다수의 클라이언트들의 상태 또는 연결을 계속 유지해야 한다면 리소스 낭비가 심해진다. 따라서, 상태 또는 연결을 유지하지 않는 대신 더 많은 연결을 할 수 있도록 설계가 됐다.

HTTP 요청 메소드

  • GET, POST, PUT, DELETE 등 

HTTP 응답 코드

  • 2xx(성공), 3xx(리다이렉션), 4xx(클라이언트 에러), 5xx(서버 에러) 등 

HTTP 헤더

  • Content-type, Accept, Cookie, Set-Cookie, Authorization 등 

 

 

CGI 프로그램과 서블릿


CGI (Common Gateway Interface)

  • 웹 서버와 애플리케이션 사이에 데이터를 주고받는 규약
  • CGI 규칙에 따라서 만들어진 프로그램을 CGI 프로그램이라고 함 
  • CGI프로그램 종류로는 컴파일 방식(C, C++ 등)과 인터프리터 방식(PHP, Python 등)이 있음
  • 웹 서버에 의해 실행됨

 

  • 인터프리터 방식 CGI 프로그램

  • 서블릿과 서블릿 컨테이너

Servlet (Server + Applet의 합성어)

  • 자바에서 웹 애플리케이션을 만드는 기술
  • 자바에서 동적인 웹 페이지를 구현하기 위한 표준 

 

Servlet Container

  • 서블릿의 생성부터 소멸까지의 라이프사이클을 관리하는 역할
  • 서블릿 컨테이너는 웹 서버와 소켓을 만들고 통신하는 과정을 대신 처리해준다. 개발자는 비즈니스 로직에만 집중하면 된다. 
  • 서블릿 객체를 싱글톤으로 관리 (인스턴스 하나만 생성하여 공유하는 방식) 

 

WAS vs 서블릿 컨테이너 

  • WAS는 서블릿 컨테이너를 포함하는 개념
  • WAS는 매 요청마다 스레드 풀에서 기존 스레드를 사용함
  • WAS의 주요 튜닝 포인트는 max thread 수
  • 대표적인 WAS로는 톰캣이 있다.

 

계산기 서블릿 만들기


실습 코드

Servlet 인터페이스

- 서블릿 컨테이너가 서블릿 인터페이스에 있는 메소드들을 호출함 

  • 서블릿 생명주기와 관련된 메소드
    • init(): 서블릿 컨테이너가 서블릿 생성 후 초기화 작업을 수행하기 위해 호출하는 메소드
    • service(): 클라이언트가 요청할 때마다 호출되는 메소드
    • destroy(): 서블릿 컨테이너가 종료될 때 호출하는 메소드 
  • 서블릿 기타 메소드
    •  getServletConfig()
      • 서블릿 초기 설정 정보를 담고 있는 객체를 반환 
      • 해당 객체를 통해 서블릿 이름과 서블릿 초기 매개변수 값 등을 얻을 수 있음
    • getServletInfo()
      • 서블릿을 작성한 사람, 서블릿 버전, 저작권과 같은 서블릿에 대한 정보를 반환

 

URL 인코딩 (= 퍼센트 인코딩)

 

 

 

참고 자료