반응형
SMALL

서블릿 기초를 다시 복습하고 싶어서 정리를 해보았다.
출처 : 유투브 뉴렉쳐 님의 2020 Servlet&JSP 프로그래밍 강의.(링크 클릭)

▼ 앞에 포스팅부터 보고 오십셔.

 웹 서버 프로그램 구조

[요약]

1. 클라이언트한테 요청을 받으면 서버가 DB에서 웹문서를 찾아본다. 있으면 그냥 바로 전달한다.(=정적인 페이지 ex.로그인 페이지 이동)
2. 원하는게 없다. 그러면 그걸 찾을 수 있는 서블릿 컨테이너 속 코드(서버 앱)를 찾는다. 
3. WAS가 자바 언어로 된 서블릿을 실행해서 동적인 페이지를 만든다.
4. 다시 클라이언트한테 응답한다.

 

클라이언트와 서버 : 요청자와 제공자


 

클라이언트와 서버


웹을 통해 통신하는 양 끝에는 클라이언트서버가 있다. 클라이언트는 요청자, 서버는 제공자(DB)이다. 클라이언트는 우리가 사용하는 웹 브라우저(Chrome, Edge, Safari) 등을 이용해서 정보를 요청한다. 클라이언트가 요청하면 서버는 DB를 뒤져서 원하는 요청사항에 대한 답을 제공해준다.

그런데 만약 이 시스템에 무언가 변경사항이 있다고 생각해보자.

클라이언트와 서버는 한 쌍이다. 이 두개가 동기화가 되어 있고, 변경사항은 양쪽 다 반영이 되어야 한다. 그러나 서버는 하나라서 한번만 변하면 되지만 클라이언트는 사용자의 수에 따라 여러명이므로 각각 업데이트 해야 한다. 

때문에 예전에는 소프트웨어 업데이트가 자동 업데이트가 아니라 재설치의 개념이었다. 이 뿐만 아니라 다른 프로그램의 영향도 받아서 서버가 업데이트 내용을 배포하기도 힘들고 클라이언트가 각 브라우저마다 업데이트 하기에도 힘들었었다. (그래서 예전에 발매된 게임은 직접 스토어에 가서 업데이트 버튼을 눌러 다운받지 않으면 안되었다. 그래서 예전버전 사용하던 사람들이 많고 관리가 힘드니 2탄이 나오는거임....)

그래서 웹(Web)이라는 것이 등장했다.

Web(웹)의 등장

www, 월드 와이드 웹(World Wide Web)이란 인터넷에 연결된 사용자들이 서로의 정보를 공유할 수 있는 공간을 의미한다. 웹은 인터넷 상에서 텍스트나 그림, 소리, 영상 등과 같은 멀티미디어 정보를 하이퍼텍스트(hypertext) 방식으로 연결하여 제공한다. 웹은 HTML(Hyper Text Markup Language)이라는 언어를 이용해서 문서 작성이 가능한데, 이를 HTTP라는 프로토콜을 사용하면 누구나 검색하고 접근할 수 있다. HTML로 작성한 하이퍼텍스트 문서를 웹페이지(Web page)라고 부르고, 웹페이지를 관련된 내용으로 묶으면 웹 사이트(Web site)가 되고, 사용자가 웹 페이지를 검색하기 위해 사용하는 프로그램을 웹 브라우저(Web browser)라고 부른다.

단어
인터넷(International Network) TCP/IP을 기반으로 전세계의 네트워크를 하나로 연결하여 각각 PC가 가지고 있는 자료나 정보를 주고 받을 수 있는 광역 네트워크
TCP / IP 60년대 후반 부터 장비와 장비간에 통신을 위해 미 국방성에서 개발하여 만들어진 프로토콜로, 거의 모든 컴퓨터가 기본으로 제공하여 인터넷 표준 프로토콜. 4개의 계층적 구조로 계층마다 독립적이다.
World Wide Web 인터넷에 연결된 사용자들이 서로의 정보를 공유할 수 있는 공간
하이퍼텍스트(hypertext) 일반 텍스트와 달리 문장이나 단어 등이 링크를 통해 서로 연결된 네트워크처럼 구성된 문서
HTML 하이퍼텍스트(hypertext) 기능을 가진 문서를 만드는 언어
HTTP(Hyper Text Transfer protocol)  HTML 문서와 같은 리소스들을 가져올 수 있도록 해주는 프로토콜
Https(Hyper Text Transfer protocol Secure Socket)
HTTP에서 암호화 기능 추가
프로토콜(Protocol) 사람들이 공용 언어로 대화하듯이, 컴퓨터끼리 서로 이해할 수 있는 언어. 시스템 간의 통신을 원할하게 하기 위한 통신 규약 및 약속
Web page HTML로 작성한 하이퍼텍스트 문서
Web browser 사용자가 웹 페이지를 검색하기 위해 사용하는 프로그램 (ex. 크롬, 엣지)

Web은 전자 우편이나 파일을 주고받기 위해서 공통 공간을 만드는 일종의 정보 관리 시스템에서 시작되었다. 따라서 웹 1.0미리 분류하고 정리된 자료들만 일방적으로 전달받을 수 있었다. 하지만 웹 2.0에서는 사용자도 직접 정보를 생산하고 참여하는 집단 지성의 공간이 되었다. 오늘날의 web의 모습이다.

그렇다면 Web은 어떤식으로 연결될까?

Web(웹)의 연결

전세계는 TCP/IP 기반으로 광역 네트워크인 인터넷에 접속할 수 있다. 보이지 않는 네트워크는 www라는 가상의 공간에 사람들이 접속할 수 있게 하였다. 사람들은 HTML로 만들어진 하이퍼텍스트 문서를 만들고 이를 공유한다. 그렇다면 그 문서들에게는 어떻게 접속할 수 있을까? URL로 불리는 네트워크 상에서 자원이 어디에 있는지 알려주는 웹 주소를 통해 우리는 특정 문서에 접속할 수 있다.

특정 웹 페이지에 접속하기 위한 URL의 구조

1. 통신 프로토콜(communication protocol)
네트워크 상의 서버로 부터 웹 문서 정보(html)와 이미지 등의 리소스를 받아올 통신 방식을 미리 정해 놓은 것으로 HTTP, HTTPS, FTP, FILE, MAILTO 등이 있다.

2. 호스트 (Host Name)
네트워크 주소를 받아 네트워크에 연결해서 인터넷을 이용하기 위해 네트워크에 연결된 장치 또는 서버들을 호스트(Host)라고 한다. 그들에게 부여되는 고유한 이름인 호스트 명은 IP 주소나 MAC 주소와 같은 기계적인 이름을 대신하여 일반인이 쉽게 읽고 이해할 수 있는 이름으로 만들어진다.

네트워크 공간에 있는 모든 장치 노드(Node)라고 한다. 호스트(Host)는 네트워크 이용을 위해 네트워크 주소가 할당된 노드(Node)이다.
클라이언트(Client)네트워크상에서 요청을 하는 호스트(Host)이다.
서버(Server)요청에 응답할 수 있는 호스트(Host)이다.
결국 네트워크상에서 대부분 요청과 응답의 형태로 데이터가 오갈 때, 그 주체들이 바로 호스트(Host)인 것이다.

3~5. 도메인(Domain)
IP 주소는 네트워크 주소로, 웹에서 찾아가기 위한 주소이다. (192.168.0.1 과 같이 생겼다) IP는 사람이 이해하고 기억하기 어렵기 때문에 이를 위해서 각 ip에 이름을 부여할 수 있게 했는데, 이것을 도메인이라고 한다.

http://www.tistory.com 라고 입력하면 컴퓨터에게 "tistory.com"이라는 도메인을 하이퍼텍스트 형태로 받아와서 브라우저에 표기해달라고 말하는 것과 같다.

대부분의 도메인 네임은 DNS 서버에서 검색하는데, IP 주소를 인간이 기억하기 편한 언어체계로 변환해서 저장된 도메인 이름을 검색한다.

6. 포트번호(Port number)
클라이언트와 서버, 즉 호스트(Host)들이 데이터를 주고 받을 때, 실제로 데이터를 주고받는 것은 호스트 내에 있는 프로세스(process)들이다. 데이터가 호스트에 도착하고 나서도, 어떤 프로세스한테 가야하는지 알기 위해 호스트 내부의 프로세스 주소도 필요하다. 포트(port)는 프로세스의 논리 주소로, 호스트 내부의 주소이다.

소캣(socket)은 뭐야?

더보기

소캣(socket) 프로세스가 네트워크를 통해 데이터를 전달할 때 반드시 열어야하는 창구이다. 데이터 보내는 통로라고 생각하면 된다. 빨대처럼 양쪽이 뚫려있어야 하기 때문에 이쪽에서도 저쪽에서도 소캣을 열어야 정보를 주고 받을 수 있다. 소캣(socket)은 프로토콜(규약),IP주소,포트(Port) 넘버로 정의된다.

우리는 OSI 7계층을 나눠 네트워크 통신을 7단계로 나눈다. 나누는 이유는 7단계 중 특정한 곳에 문제가 생기면 해당 단계만 고치면 되기 때문이다. (OSI 7계층 단계 자세히 보기)

하지만 계층을 나누는 것만으로는 한계가 있어서 각 프로토콜을 일일히 정의할 필요없이 출입구만 열어주면 통신할 수 있는 소캣이 등장하게 된 것이다. 일반적으로 TCP/IP 프로토콜을 사용한다. TCP/IP출입구가 열려있는 상태로 상태값에 따라 양방향으로 정보를 주고받지만 HTTP단방향으로 데이터 요청이 있어야만 응답이 있다는 차이점이 있다.

 

7~8. 디렉토리 (directory)와 파일(file)

위 주소에서 HTTP는 단방향으로 데이터 요청이 있어야만 응답이 있는 프로토콜이다. 웹에서 브라우저는 URL 주소를 통해 웹페이지를 요청하고, 그 요청에 대해 웹 서버가 응답해준다. 디렉토리는 해당 자원이 웹 서버 내부의 어디에 있는지를 나타내는 경로이다. 예를 들어 만약 브라우저가 주소를 www.codns.com 에서 /codns 을 붙이면(요청), 웹서버는 codns 경로로 가서 해당 경로에 위치한 codns.jsp를 찾아서 클라이언트에게 응답해준다.

정적(Static) 웹페이지와 동적(Dynamic) 웹페이지

정적(Static) 웹 페이지웹 서버에 미리 저장된 파일(HTML 파일, 이미지, JavaScript 파일 등)이 그대로 전달되는 웹 페이지이다. 서버는 사용자가 요청에 해당하는 저장된 웹 페이지를 보내며, 사용자는 서버에 저장된 데이터가 변경되지 않는 한 고정된 웹 페이지를 보게 된다.

위키백과와 같은 데이터 교환만 필요할 때에는 정적 웹페이지로도 충분했을 것이다. 하지만 오늘날 우리는 클라이언트에 따라 내용이 다른, 보다 다양하고 최신의 필요한 정보들을 제공받기 위해 동적(Dynamic) 웹페이지가 필요해지게 된다.

동적(Dynamic) 웹페이지웹 서버에 있는 데이터들을 스크립트에 의해 가공처리한 후 생성되어 전달되는 웹 페이지이다. 서버는 사용자의 요청(Request)을 해석하여 데이터를 가공한 후 생성되는 웹 페이지를 보내고, 사용자는 상황, 시간, 요청 등에 따라 달라지는 웹 페이지를 보게 된다. 즉, 서버가 동적으로 문서를 만들어서 보내준다.

동적 웹 사이트는 정적 웹 사이트와 달리 서버 내부에서 추가적인 작업이 필요하기 때문에 서버 내부에 해당 작업을 처리하기 위한 모듈이 필요하다. 

▼ 동적 웹페이지의 종류

더보기
  • Client-side rendering (CSR)
    자바스크립트에 데이터를 포함해서 보낸 후, 클라이언트 쪽에서 HTML을 완성하는 방법.
    서버는 단지 JSON 파일만 보내주고, HTML은 JS가 그림 첫 페이지 로딩이 오래걸림.
    하지만 이후 유저와의 인터랙션이 빠름.
    봇 크롤러들이 JS는 읽지 못해서 SEO 문제가 발생.
    쿠키말고는 사용자 정보를 담을수 없음.

  • Server-side rendering (SSR)
    서버 쪽에서 템플릿 HTML에 데이터를 끼워넣어 완성된 형태의 HTML을 보내주는 방법.
    요청시마다 새로고침이 일어나며 서버에 새로운 요청을 전달.
    첫 페이지 로딩이 빠름, 이후 새 요청마다 새로고침이 되어 매우 비효율, 사용자에 대한 정보를 서버측 세션에 저장

  • 복합적인 방법
    클라이언트 쪽에서 Ajax 요청을 보내서 서버에서 데이터를 받아와 HTML을 완성하는 방법

 

동적(Dynamic) 웹페이지는 어떻게 만들 수 있을까? => WAS가 만들어준다.

웹 서버 (Web Server)

클라이언트가 요청한 정적인 컨텐츠를 HTTP 프로토콜을 통해서 제공해주는 서버. (정적인 컨텐츠를 제공하는 역할)
클라이언트가 동적인 컨텐츠를 요청할 경우, 웹 서버에서는 처리할 수 없으므로, 컨테이너로 보내주는 역할을 한다.
ex) Apache, NginX, IIS

컨테이너 (Container)

동적인 데이터들을 처리하여 정적인 페이지로 생성해주는 소프트웨어 모듈
웹 컨테이너 (Web Container) 혹은 서블릿 컨테이너 (Servlet Container)라고 불린다.
(서블렛(Servlet)이란 동적 웹 페이지에 사용되는 자바 기반의 웹 애플리케이션 프로그래밍 기술)

WAS (Web Application Server)

웹 서버로부터 오는 동적인 요청을 처리하는 서버, 웹 서버와 컨테이너를 합쳐둔 서버 (ex.Tomcat)

정적인 컨텐츠들은 웹 서버에서 해결 가능하므로 WAS를 거칠 필요가 없다.
따라서, 보통 웹 서버는 정적 컨텐츠, WAS는 동적 컨텐츠를 담당한다.
그렇지만, WAS 만을 사용하지는 않고 따로 웹 서버와 WAS를 분리하여 사용해준다. (보안, 데이터 처리, 서버 부하 등의 이유로)

서블릿(Servlet)

그렇다면 서블릿은 무엇일까?

서블릿(Servlet)은 서버에서 동적인 웹페이지를 만들기 위해 DB에서 원하는 정보를 가져올 수 있는 server app이 JAVA 언어로 쓰여져 있는 "웹서버 응용 프로그램"이다. 그리고 서블릿이 뭉쳐진 저장소를 서블릿 컨테이너라고 부른다.

예를 들어 회원목록을 달라고 했을 때, 서버 앱에서는 "list"라는 이름의 자바 코드를 실행한다.
이 코드를 서블릿이라고 했을 때, 서블릿은 최초로 요청시에 객체가 생성되고, 재사용 되기도 하며, 서버가 중지되면 삭제된다.

예시 : Apache와 Tomcat

Apache정적인 데이터를 처리하는 웹서버이고, Tomcat은 WAS 중에 하나로 동적인 처리를 하는 서블릿 컨테이너이다.

자바 개발 시 필요한 도구들을 JDK(Java Development Kit)라고 한다.
JDK의 일부인 JRE(Java Runtime Environment)는 자바 가상머신(JVM)의 실행환경을 구현한 도구이다. 런타임 환경은 프로그램 실행을 위해 클래스 파일을 로드하고 메모리 및 기타 시스템 리소스에 대한 액세스를 확보한다. 이를 위한 라이브러리나 환경파일들이 JRE에 포함되어 있다. 그래서 우리가 자바 프로그래밍을 할 때 JDK를 JAVA_HOME라는 약속한 이름의 경로에 두는거고, JRE를 라이브러리에 추가하는 것이다.

Tomcat도 WAS 종류이기 때문에 런타임 서버로 추가 등록한다. 그래서 이클립스 등의 IDE에서 서버 런타임에 톰캣을 등록하는 것. 이 때 포트번호가 겹치면 데이터를 전달하는 주소지(우편번호)가 겹쳐져 안될 수 있으니 안겹치게 설정해주어야 한다.

반응형
LIST
반응형
SMALL

Servlet

클라이언트 요청을 처리하고, 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술. 즉, JAVA를 사용해서 웹을 만들기 위해 필요한 기술로, 자바 코드 안에 HTML 포함되어 있다. 클라이언트가 어떤 요청을 하면 그 결과를 다시 전송해주는 역할을 하는 JAVA 프로그램이다.

JSP

JavaServer Pages, HTML 코드에 JAVA 코드를 넣어 동적인 웹페이지를 생성하는 웹어플리케이션 도구. JSP가 실행되면 자바 서블릿(Servlet)으로 변환되며 웹 어플리케이션 서버(WAS)에서 동작되면서 필요한 기능을 수행하고 그렇게 생성된 데이터를 웹페이지와 함께 클라이언트로 응답한다.

서블릿 이전에 CGI가 있었다.

서블릿의 조상인 CGI(Common Gateway Interface)라는게 있다. CGI 이전의 웹서버는 단순히 사용자가 특정 경로를 입력하면 그 경로에 해당하는 리소스만 뿌려주었다. (주소 입력하면 정적인 페이지로 이동만 시켜줌) 그런데 CGI가 나오면서 사용자가 입력값을 인자로 넣은 프로그램을 실행시키면 그 결과를 웹으로 뿌려줄 수 있게 되었다. 바야흐로 동적인 페이지를 보여주기 위해 임의의 프로그램을 실행할 수 있는 기술의 탄생이다.

CGI 이전엔 경로->정적페이지 출력만 가능했는데,
CGI는 사용자에게 입력값을 받아 동적인 페이지를 보여줄 수 있게됨.

정적인 페이지는 예를들어 기업설명 페이지, 즉 사용자에 의해 변경될 일이 없으며 똑같 내용의 페이지를 말하고, 동적인 페이지는 SNS 페이지와 같이 사용자의 좋아요와 팔로우에 따라 알고리즘을 변경하여 사용자마다 다른 페이지를 보여주는 것을 말한다.

CGI 이전까지는 말 그대로 글자와 이미지 출력이 다였지만, CGI의 탄생으로 주소 하나에도 다양한 내용을 각자의 사용자에게 보여줄 수 있게 되었다.

CGI에서 서블릿으로

CGI는 웹서버에 요청이 들어오면 각각 처리한다. 일하는 인력 많고 처리를 하나씩 맡아서 한다.

CGI의 동작방식

CGI는 브라우저에서 웹서버에 요청이 갔을 때, 각각에 대한 처리 프로세스를 만들어낸다는 단점이 있었다. 그래서 대량의 트래픽을 처리하기에는 약간 무리가 있었다.

서블릿의 동작방식

서블릿도 CGI 규칙에 따라 데이터를 주고 받는 것은 같다. 하지만 서블릿은 각 요청에 대한 프로세스를 생성하는 것이 아니라, 서블릿 컨테이너로 보내서 처리하도록 했다.


서블릿 컨테이너는 요청이 들어오면 해당 요청을 처리할 일꾼 서블릿을 설정파일(가이드문서 같은거)을 읽어서 찾은 뒤, 어떤 서블릿이 필요한지 알았으면 해당 일꾼 서블릿을 찾는다. 또한 서블릿 인스턴스(클래스를 구체화한 제품)가 있다면 그 인스턴스를 가져와서 사용하고, 없으면 생성해서 그걸 이 일꾼 서블릿에게 가져다준다.


이 서블릿 인스턴스를 요청객체 HttpServletRequest와 응답 객체 HttpServletResponse에게 인자로 넘겨주면, 해당 일꾼 서블릿이 요청에 따른 로직을 처리하고, 처리 결과를 HttpServletResponse 객체에 담아 반환한다.(일꾼은 일을 끝냈음)


처리를 마치면 요청, 응답객체들은 사라지고 사용했던 서블릿 인스턴스만 남는다. 이 서블릿 인스턴스는 소멸하지 않고 있다가 다음에 같은 요청이 들어오면 서블릿 컨테이너가 다시 일꾼 서블릿에게 보내주면서 금방금방 일처리를 해준다.

 

서블릿 컨테이너는 서블릿의 생명주기를 관리하는 객체이다. 생성, 호출, 적절한 시점의 소멸을 담당한다.

 

그럼 한 요청을 처리하는 중에 또다른 요청이 들어오면 어떻게 될까? 그럼 멀티스레드로 요청이 처리되면서 일꾼 서블릿이 여러군데에서 호출되서 여러 스레드에서 사용된다. (이곳저곳 불려간다는 말임) 문제는 스레드 생성도 비용이 많이 들고, 다른 스레드로 전환하는 것도 부하가 걸리기 때문이다.

 

따라서 WAS는 이러한 문제를 처리하기 위해 프로세스 1개가 있고 그 내부에 스레드 풀이라는 스레드들이 생성될 수 있는 공간을 만들어 스레드로 처리했다.


스레드 풀은 스레드를 미리 생성해서 스레드가 필요할 때 꺼내쓰고 반납하는 저장소이다. 개수를 제한해서 일정 이상의 요청이 들어왔을 때는 대기하도록 만들어서 대량의 요청이 들어왔을 때도 조금 더 안정성이 증가했다.
그리고 사실 비슷한 경로에 요청을 한 클라이언트들의 비즈니스 로직은 대부분 중복되는 부분이므로, 스레드 사이에 있는 공유 자원 (Code, Data, Heap)을 통해 더욱 효율적인 처리가 가능했다.

 

 

▼ 스레드와 메모리에 관한 자세한 설명이 궁금하다면?

서블릿 개발 흐름

서블릿 라이프 사이클

서블릿 라이프 사이클

  1. 서블릿은 생성 이후에 init() 메소드를 통해 초기화된다.
  2. 클라이언트가 서비스(service())로 보낸 요청들을 처리한다.
  3. 서블릿은 사용 중지된 후, destroy()를 이용해 제거된다.

서블릿 컨테이너가 서블릿 클래스를 로딩하고, 인스턴스를 생성해 생성자와 함께 자바 서블릿 객체를 생성한다. 이 후 초기화와 사용자의 요청 비지니스 로직 처리(service), 완료 후 서블릿 상태 종료 및 소멸을 서블릿 컨테이너가 담당한다.

 

이 모든 과정을 컨테이너 내부에서 스레드 단위로 요청을 처리하는데, 이 과정을 개발자가 아닌 컨테이너가 제어하는 것을 IoC (Inversion of Control)라고 한다.

반응형
LIST
반응형
SMALL

+ Recent posts

반응형
LIST