| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
- 게시판 리뷰 만들기
- MVC 패턴
- 게시판 만들기
- tomcat
- Spring
- array
- group study
- 클래스 class
- 클래스 상속
- 패스트캠퍼스
- 개발자취업부트캠프
- spring boot
- #javaStudy
- MVC
- Sts
- Java
- 내일배움카드
- github
- AWS
- 국비지원교육
- View
- Algorism study
- 메가바이트스쿨
- Interface
- side project
- crud
- Entity
- MegabyteSchool
- GIT
- #패스트캠퍼스 #국비지원교육 #메가바이트스쿨 #MegabyteSchool #개발자취업부트캠프 #내일배움카드
- Today
- Total
tuter77
Spring : 클라이언트와 서버 본문
● 클라이언트와 서버
▷복습
브라우저(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에 공부한 내용입니다.
'SpringStudy' 카테고리의 다른 글
| Spring : http 요청과 응답(2) (0) | 2023.01.29 |
|---|---|
| Spring : http 요청과 응답, 관심사의 분리(mvc 패턴) (0) | 2023.01.29 |
| Spring : 웹 브라우저에 바뀌는 주사위 구현. (0) | 2023.01.29 |
| Spring : 요일을 출력하는 프로그램 만들기. (0) | 2023.01.29 |
| Spring : STS를 활용하여 간단한 프로그램 만들기. (0) | 2023.01.29 |