-
웹 애플리케이션 이해교육 자료 2022. 7. 18. 22:16
웹 애플리케이션 이해 01 계산기 프로그램을 웹 애플리케이션으로 만들기 02 HTTP 프로토콜 이해 서블릿 프로그래밍 01 CGI 프로그램과 서블릿 02 계산기 서블릿 만들기 계산기 프로그램을 웹 애플리케이션으로 만들기
실습
- 첫 번째 단계
- 사용자 요청을 메인 Thread가 처리하도록 한다.
- 두 번째 단계
- 사용자 요청이 들어올 때마다 Thread를 새로 생성해서 사용자 요청을 처리하도록 한다.
- Thread는 생성될 때마다 독립적인 스택 메모리 공간을 할당받는데 메모리 할당 작업은 상당히 비싼 작업이다. 따라서, 사용자 요청이 있을 때마다 Thread를 생성한다면 성능이 떨어진다.
- 동시 접속자 수가 많아질 경우 많은 Thread가 생성되는데 Thread가 많아지면 CPU 컨텍스트 스위칭(Context Switching) 횟수 및 CPU와 메모리 사용량이 증가하게 된다. 따라서, 최악의 경우 서버의 리소스(CPU 및 메모리 자원) 한계로 인해 서버가 다운될 가능성이 높다.
- 사용자 요청이 들어올 때마다 Thread를 새로 생성해서 사용자 요청을 처리하도록 한다.
- 세 번째 단계
- Thread Pool을 적용해 안정적인 서비스가 가능하도록 한다.
- 실습 코드
HTTP란
- 서버와 클라이언트가 웹에서 데이터를 주고받기 위한 프로토콜(규약)
- 거의 어떤 종류의 데이터든지 전송 가능
- 참고
- HTTP/1.1 , HTTP/2는 TCP 기반 위에서 동작
- 3-way handshake로 연결을 맺음
- HTTP/3는 UDP 기반 위에서 동작
- HTTP/1.1 , HTTP/2는 TCP 기반 위에서 동작
HTTP 요청/응답 메시지 구조
HTTP 특징
- 클라이언트-서버 모델 따름
- 클라이언트가 서버에 요청을 보내면 서버는 클라이언트에게 응답을 보낸다.
- 무상태 프로토콜(Stateless)
- 서버가 클라이언트 상태를 유지하지 않음
- 각 요청을 독립적인 트랜잭션으로 취급
- 해결책 : Keep-Alive 사용
- 단점은 없을까? No! Keep-Alive가 성능 하락의 주범이 되기도 한다. 왜냐하면, 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
- 서블릿의 생성부터 소멸까지의 라이프사이클을 관리하는 역할
- 서블릿 컨테이너는 웹 서버와 소켓을 만들고 통신하는 과정을 대신 처리해준다. 개발자는 비즈니스 로직에만 집중하면 된다.
- 서블릿 객체를 싱글톤으로 관리 (인스턴스 하나만 생성하여 공유하는 방식)
- 상태를 유지(stateful)하게 설계하면 안 됨
- Thread safety 하지 않음
- 실습 코드
WAS vs 서블릿 컨테이너
- WAS는 서블릿 컨테이너를 포함하는 개념
- WAS는 매 요청마다 스레드 풀에서 기존 스레드를 사용함
- WAS의 주요 튜닝 포인트는 max thread 수
- 대표적인 WAS로는 톰캣이 있다.
계산기 서블릿 만들기
실습 코드
Servlet 인터페이스
- 서블릿 컨테이너가 서블릿 인터페이스에 있는 메소드들을 호출함
- 서블릿 생명주기와 관련된 메소드
- init(): 서블릿 컨테이너가 서블릿 생성 후 초기화 작업을 수행하기 위해 호출하는 메소드
- service(): 클라이언트가 요청할 때마다 호출되는 메소드
- destroy(): 서블릿 컨테이너가 종료될 때 호출하는 메소드
- 서블릿 기타 메소드
- getServletConfig()
- 서블릿 초기 설정 정보를 담고 있는 객체를 반환
- 해당 객체를 통해 서블릿 이름과 서블릿 초기 매개변수 값 등을 얻을 수 있음
- getServletInfo()
- 서블릿을 작성한 사람, 서블릿 버전, 저작권과 같은 서블릿에 대한 정보를 반환
- getServletConfig()
URL 인코딩 (= 퍼센트 인코딩)
- URL로 사용할 수 없는 문자(예약어, Non-ASCII 문자(한글) 등)를 사용할 수 있도록 인코딩하는 것
- 인코딩 된 문자는 triplet(세 개가 한 세트)로 인코딩 되며 각각을 % 다음에 두 개의 16진수로 표현함
- 예약 문자
참고 자료
- https://ko.wikipedia.org/wiki/%EA%B3%B5%EC%9A%A9_%EA%B2%8C%EC%9D%B4%ED%8A%B8%EC%9B%A8%EC%9D%B4_%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4
- http://www.ktword.co.kr/test/view/view.php?m_temp1=648
- https://victorydntmd.tistory.com/286
- https://blog.worldline.tech/2018/01/29/keepalive.html
- https://kamang-it.tistory.com/entry/Web%EC%84%9C%EB%B2%84%EC%99%80%EC%9D%98-%EC%97%B0%EA%B2%B0%EC%9D%84-%EA%B3%84%EC%86%8D-Keep-Alive
- https://gmlwjd9405.github.io/2018/10/27/webserver-vs-was.html
- https://dotnettutorials.net/lesson/generic-servlet/
- https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=j880825&logNo=221231640609
- https://velog.io/@lej7122/Chapter03-%EC%84%9C%EB%B8%94%EB%A6%BF-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D1
- https://gompangs.tistory.com/entry/Dispatcher-Servlet
'교육 자료' 카테고리의 다른 글
JDBC 프로그래밍 (0) 2022.08.11 도커 및 도커 컴포즈 소개 (0) 2022.08.05 멀티 스레드 환경에서 동시성 이슈 (0) 2022.07.25 객체지향 패러다임 (0) 2022.07.12 테스트 코드 실습 (0) 2022.07.11 - 첫 번째 단계