tuter77

Spring : 클라이언트와 서버 본문

SpringStudy

Spring : 클라이언트와 서버

tuter77 2023. 1. 29. 20:25

● 클라이언트와 서버

 

▷복습

브라우저(url)를 이용해서 서버에 요청을 하면 톰캣이 객체를 생성해서 정보를 저장한다.

나눠서 객체에 담긴 정보들을 메서드의 매개변수로 제공한다.(ex. @RequestMapping -> main())

메서드의 매개변수들은 원하는대로 지정할 수 있고, 이는 스프링이 자동으로 처리를 해준다.(HttpServletRequest)

 

- HttpServletRequest의 메서드는 url의 형태로 볼때

getRequestURL() 안에 getSchema(), getServerName(), getServerPort(), getRequestURL[getContextPath(), getServletPath()]순으로 나열되고, ? 이후로는 추가적인 정보들이 나열된다. 이는 getQueryString() 으로 호출된다.

 

예시로보면 http(getSchema())://52.78.79.190(getServerName()):8080(getServerPort())/ch2(getContextPath())/requestinfo(getServletPath())?year=2021&month=10&day=1(getQueryString())

와 같이 나열된다.

 

getQueryString()은 getParameter("name") 를 이용한다.

이외에도 getParameterMap()은 위의 쿼리 스트링을 

key value
"year" "2021"
"month" "10"
"day" "1"

의 형태로 반환해준다.

 

혹시 쿼리 스트링의 name이 모두 같을 경우, getParameterValues("name")을 이용해서 배열로 받을 수 있다.

 

▷ 클라이언트와 서버

 

- 클라이언트 : 서비스를 요청하는 애플리케이션 또는 컴퓨터

- 서버 : 서비스를 제공하는 애플리케이션 또는 컴퓨터

 

- 서버의 종류 : 어떤 서비스를 제공하느냐에 따라 달라진다.

email server  > 이메일 제공.

file server > 파일 제공.

web server > web제공 > 브라우저를 통해 받을 수 있는 모든 서비스를 제공하는 것.

 

예를 들어 한 대의 pc에 위 3가지 서버가 존재할 경우, ip주소만 가지고는 요청을 어느 서버에 요청하는지 알 수 가없다.

때문에 port 번호를 써서 서버를 지정한다.

(웹서버는 기본이 80인데 생략이 가능하다 > 톰캣은 8080이라 생략불가)

 

이 요청을 처리하려면 서버가 각 포트와 연결(binding)되어 있어야 한다.

한 port에는 한 서버만 연결될 수있다. 

서버가 실행되어있어야 요청을 받을 수 있는데, 이 포트에 바인딩되어 요청을 기다리는 상태를  Litening하고 있다라고 말한다.

port 0 ~ 1023 까지는 예약되어있어 사용할 수 없다.

그 위의 약 6만개 포트는 새로 바인딩할 수 있다.

 

 WAS (Web Application Server)

 

웹 애플리케이션을 서비스하는 서버를 일컫는다.

즉, 프로그램을 서버에 설치해놓고, 클라이언트가 프로그램을 사용할 수 있게 해주는것이다.

프로그램을 클라이언트에 설치할 수도 있지만 서버에 설치해놓고 제공하는 것이다.

때문에 원격 프로그램을 호출하는 것이다.

이 덕에 클라이언트는 실행 결과만 받을 수 있다.

 

-update 용이성.

과거에는 프로그램을 각 컴퓨터에 설치해서 사용했는데, 이는 update가 문제가 된다.

때문에 WAS를 통해 업데이트 문제를 해결하게 되었다.

 

▷ Tomcat의 내부구조

- 브라우저의 요청이 8080 포트를 통해 서버에 전달된다.

이 요청은 Thread Pool에 미리 생성된 Thread 중 하나가 요청을 처리한다.

 

톰캣 서버안의 서비스가 있다.

 

이 서비스 안엔 Connector가 있는데, http.1, http2, ajp라는 Protocol을 갖고 있다.요청을 받았을때 어떤 프로토콜의 종류를 요청했느냐에 따라 커넥터의 종류도 달라진다.

 

해당 커넥터는 Engine(Catalina)로 요청을 전달하는데, 이 안의 n개(일반적으로 1개)의 Host들 중 하나에 전달한다.

 

Host 안에는 1개 이상의 n개의 Context가 있는데, 이 Context는 하나의 Web App(프로그램)이다. 

(앞서 실습한 예제의 경우로는 ch2로 볼 수 있다. 일반적으로 스프링 프로젝트들이다.)

 

해당 컨텍스트 안에는 여러개의 Servlet이 있다.

Servlet은 작은 서버 프로그램이라는 뜻으로, 서버에서 실행되는 프로그램들을 일컫는다.

Controller와 거의 같은 개념이다.

 

이 servlet이 작업을 수행하고 그 결과를 클라이언트에 전달하게 된다.

(* 위 내용은 tomcat 사이트의  tomcat 9.0 doc/architecture/overview.html 에 들어가면 확인할 수 있다.)

 

그림으로 보면 아래와 같다.

https://sowon-dev.github.io/2022/03/07/220307Server-tomcat/

 

 

 - STS에서 

 

좌측의 동그라미가 찍힌 번호를 우클릭하면 해당 라인을 ToggleBreakPoint로 지정할 수 있다. 

ToggleBreakPoint는 디버깅을 할 경우에 해당 라인에서 작업을 중단하는 위치를 찍는 것을 말한다.

이 ToggleBreakPoint를 지정하고 Debug on Server를 실행하면 아래와 같은 디버깅 화면이 출력된다. 

 

아래에서부터 stack이 쌓이는데,  run되면 그 위에 thread pool이 보인다.

thread pool 안의 여러 thread 중 하나가 해당 작업을 처리하고 이어 http11프로세서가 받아 전달한다.

connector > engine > Host > Context로 이동한 것을 볼수있다.

이 후 Filter를 통해 Servlet 전(pre)처리를 하고, 이후 Servlet이 요청을 받는다. 

그리고 그 요청은 Twodice라는 Controller로 전달되어 main()메서드를 호출한다.

 

아래에 보면 http 1.1 프로세서가 Request 와 Response 객체를 생성한 것도 볼 수 있는데, Socket 으로 객체를 생성하여 각  Request 와 Response 객체에 담아서 전달한다.

 

위 내용은 2023.01.06에 공부한 내용입니다.

링크 : https://dudwls3278.tistory.com/37