Programming/Spring

[스프링의 정석] 클라이언트와 서버

Supreme_YS 2021. 10. 27. 17:37

1. HttpServletRequest

- 웹 사이트 상에서 URL을 입력하고 요청을 하면, 톰캣이 이를 받아서 객체를 생성한 후 받은 정보를 나눠서 담는다. 이후 HttpServletRequest의 매개변수로 제공하며, 사용 가능하다.

 

말이 조금 어려운데, 웹 주소창에 어떤 정보를 요청하면 톰캣이라는 중계서버가 알아서 만들고 그 정보의 특징에 맞게 정리정돈도 해준다는 뜻이다. 잘 정리정돈 되어있으니 적절한 메서드를 활용하면 사용하기도 수월하다.

 

2. HttpServletRequest 메서드

- getScheme(), getServerName(), getServerPort()..등등

- 이러한 메서드는 정리정돈된 칸이라고 보면 된다. 

HttpServletRequest의 대표적인 메서드 출처. 강의

- 그 중에 쿼리 스트링 부분은 getParameter 메서드를 사용하면 되는데 name=value 꼴로 name을 이용해 value값을 얻을 수 있다.

?year=2021&month=10&day=25

String year = request.getParameter("year"); // 2021을 얻을 수 있음
String month = request.getParameter("month"); // 10을 얻을 수 있음
String day = request.getParameter("day"); // 25를 얻을 수 있음

- 다양한 메서드들은 나중에 찾아보고 하면 됨.


* 클라이언트 : 서비스를 요청하는 애플리케이션

* 서버 : 서비스를 제공하는 애플리케이션


* 서버의 종류 - 어떤 서비스를 제공하느냐에 따라 다름

- 이메일 서버, 파일 서버, 웹 서버 


* 서버의 포트 - IP 주소만으로는 서버의 종류를 구분할 수 없다.

- 따라서, 포트 번호를 통해 어떤 종류의 서버에 접근할 것인지 구분할 수 있다.

- 25 : 이메일서버 , 22 : 파일서버, 80 : 웹 서버 (생략가능)

- 하나의 포트에는 하나의 서버만 연결할 수 있다. 

- 특정 포트와 서버는 binding하고, 요청을 listening하는 상태가 되어야 클라이언트가 요청할 수 있다.

- 0 ~ 1023 포트는 예약 포트라서 사용할 수 없고, 1024 ~ 65535까지 포트를 사용할 수 있다.


* WAS ( 웹 어플리케이션 서버 ) 란 웹 어플리케이션을 서비스하는 서버

- 서버에 프로그램(어플리케이션)을 설치하고 클라이언트가 사용할 수 있게 하는 서버

- 업데이트의 용이성, 예전에는 프로그램을 로컬에 일일이 깔았지만 프로그램을 서버에 설치를 하면 서버 프로그램만 업데이트를 하면 되니 업데이트에 용이하다.


* 톰캣의 내부 구조

- URL 요청 -> Thread Pool 중에 하나가 요청을 처리한다. 첫번째, 그리고 가장 상위에 있는 Server는 전체 Catalina Servlet Engine을 의미하고 Tomcat인스턴스의 최상위 요소로 사용이 된다. 말 그대로 서버로 생각하면 된다.

 

Server

- Service는 하나 이상의 Connector를 가질 수 있고, 선언된 Connector들은 하나의 Engine을 서로 공유한다. 하나의 Server에 여러개의 Service 가 존재할 수 있다.

 

Connector

- Client로부터의 요청 및 응답을 처리하기 위한 요소를 정의한다. 설치된 Tomcat내의 conf디렉토리안에 있는 server.xml을 보면 “Catalina”라는 Service 내에 두개의 Connector가 정의가 된것 을 확인 할 수 있다. 첫번째 Connecotor는 HTTP요청, 즉 HTTP기반의 client의 요청을 처리하기 위한 것이고(기본 8080포트 사용), 두번째는 Web Server인 Apache와 AJP를 기반으로 연동하기 위한 Connector이다.

 

Engine

- Service당 하나의 Engine을 가질 수 있다. 그리고 선언된 Connector들을 통해 들어 오는 모든 요청을 처리한다. 그리고 AJP를 통한 load-balancing을 사용할 경우 Engine에 jvmRoute 속성을 사용해야한다.

 

Host

- 각 Engine에 포함될 가상의 호스트를 정의하기 위한 요소이다. 하나 이상의 weba application을 포함할 수 있다. 그리고 하위의 web application들은 각각의 Context를 가진다.

 

Context = Spring Project

- 상위의 Host내에서 실행되는 개별 web application을 나타내며 Host내에 선언될 수 있는 Context의 갯수에는 제한이 없다.

 

Servlet 

- 스프링 프로젝트 안에 있는 여러 프로그램들

디버그 모드로 실행 후 확인한 호출 스택

<Thread -> Thread Pool -> Http11 Connector -> Http11 Processor -> Engine -> Host -> Context>


* 톰캣 설정 파일 - server.xml, web.xml

톰캣설치경로/conf/server.xml : 톰캣 서버 설정 파일

톰캣설치경로/conf/web.xml : 톰캣의 모든 web app의 공통 설정

웹앱이름/WEB-INF/web.xml : web app의 개별 설정 

 

* 서블릿 등록 -> @Controller

* URL 연경 -> @RequestMapping

이것처럼 web.xml 기반에서 @ 어노테이션 기반으로 변화하는 추세, 위 두개의 어노테이션은 스프링에서 사용하고 서블릿에서는 @WebServlet을 사용한다.