서버와 클라이언트

지난 시간 인터넷과 웹의 관계를 통해 웹이 무엇인지 조금이나마 알아보았다. 웹의 동작방식은 클라이언트/서버 모델이라고 배웠었다. 그런데 클라이언트/서버 모델?? 그게 뭐지, 다른 모델도 있나? 찾아보다가 어디서 튀어나온 개념인지 알게되면서 점차 이해하게 되었다. 그럼 클라이언트 서버 모델의 시작부터 알아보자.

클라이언트 서버 모델은 서비스 요청자인 클라이언트와 서비스 자원의 제공자인 서버 간에 작업을 분리해주는 분산 애플리케이션 구조이자 네트워크 아키텍처를 나타낸다.(위키백과)

클라이언트 서버 모델의 시작 그리고 현재

초창기 컴퓨팅 환경은 중앙 집중적인 메인프레임 컴퓨터를 근간으로 하는 시스템이었다. 메인프레임(서버)에서 자료를 처리하고 터미널(클라이언트)에서 화면을 처리하는 시스템이다.
하지만 마이크로프로세서가 발달함에 따라 대형 메인 프레임에 준하는 PC가 등장하고 웹 시스템이 나오면서 서비스를 제공(응답)하면 서버이고 서비스를 요청하면 클라이언트라는 상대적인 개념으로 변화했다.

그래도 이해가 좀...

쉽게 설명하자면, CPU유무에 따라 처리가 가능한 컴퓨터(터미널)를 클라이언트라고 했고, 처리 불가능한 컴퓨터(메인프레임)를 서버라고 했었다. 하지만 이제는 CPU가 모두 달려있어서 모두다 처리가 가능한데 그럼 다 서버네? 맞다. 최근에는 그 의미가 조금 변화했다. 컴퓨터가 처리할 수 있냐없냐가 아닌 서비스를 제공하는 지(서버 역할), 서비스를 제공받는 지(클라이언트 역할)에 따라 서버와 클라이언트라 불린다.



클라이언트/서버 모델 (= CS)가 무엇인지 큰그림은 그려졌다.
웹브라우저 주소창에 www.naver.com을 입력하고 엔터를 치게되면 네이버 메인화면이 출력된다. 어떻게 그럴까? 이제부터 주소를 입력하고 나서 서버에서 일어나는 일들을 알아보자.













 WAS의 내부구조

① 웹서버로 부터 요청이 들어오면 제일먼저 컨테이너가 이를 알맞게 처리한다.

② 컨테이너는 배포서술자(web.xml)를 참조하여 해당 서블릿에 대한 스레드를 생성하고 요청(httpServletRequest) 및 응답(httpServeletResponse) 객체를 생성하여 전달한다.

③ 다음으로 컨테이너는 서블릿을 호출(service())한다.

④ 호출된 서블릿의 작업을 담당하게 된 스레드(미리 생성된 스레드)는 요청에 따라 doPost() 또는 doGet()을 호출한다.

⑤ 호출된 doPost() 또는 doGet() 메소드는 생성된 동적페이지를 Response객체에 실어서 컨테이너에 전달한다.

⑥ 컨테이너는 전달받은 Response객체를 HTTPResponse형태로 전환하여 웹서버에 전달하고 생성되었던 스레드를 종료하고 요청(httpServletRequest) 및 응답(httpServeletResponse) 객체를 소멸시킨다.

WAS별로 다양한 종류의 컨테이너를 내장하고 있으며 이들중 서블릿에 관련된 기능을 모아놓은 것을 서블릿 컨테이너라 부른다. 이외에도 여러 종류의 컨테이너가 있으며(Servlet 컨테이너, JSP 컨테이너, EJB 컨테이너 등)  다양한 컴포넌트 들을 내장하고 있다.

서블릿 컨테이너는 [그림:WAS의 내부 구조]에서와 같이 servlet를 실행하고 관리하는 역할을 하는데 개발자가 신경써야 할 복잡한 부분을 대신 처리하여 주기 때문에 편리하다. 한가지 예로 자바애플리케이션 개발시 필요한 main()메소드가 존재하지 않는 것이 이때문이다. 다음은 서블릿 컨테이너의 주된 역할이다.
- 생명 주기 관리 : 서블릿을 로드해 초기화(init 메소드) 한다. 또 클라이언트의 요청으로 서블릿 메소드를 호출하며, 서블릿 컨테이너가 종료되면 서블릿을 종료시키고(destroy 메소드 호출) 메모리를 정리한다.
- 통신 지원 : 웹서버로부터 받은 요청을 분석해 서블릿을 실행시키고 서블릿에서는 웹서버의 정보를 확인할 수 있도록 하는 기능을 제공한다.
- 멀티스레딩 지원 : 클라이언트의 요청에 따라 서블릿을 생성하고, 이미 생성된 서블릿에 대한 요청은 스레드를 생성해 실행한다.

컴포넌트란 특정 기능이나 관련된 기능이 재사용 가능한 형태로 만들어진 프로그램 빌딩 블록으로 소프트웨어 개발을 레고 블록 쌓듯이 진행할 수 있도록 하는 기술을 말한다.













댓글

이 블로그의 인기 게시물

AWS RDS DB 인스턴스에 연결하기 (Oracle Database Instance)

tomcat server.xml ( 톰캣 서버 설정 )

Git resolving merge conflicts as Mark resolved (mark resolved 옵션으로 해결)