본문 바로가기
java/spring

spring - servlet

by rewind 2024. 7. 3.

 

 

HttpServletRequest

브라우저 요청 -> 톰캣 내부에서 HttpServletRequest 객체를 만들고 결과를 메서드로 반환한다

request 객체를 통해 요청정보에 대한 결과를 받음

ex) http://192.168.0.1:8080/test/requestTest?request="req"&response="rep"

여기서 각 부분을 나눠보면
Scheme : http://
ServerName : 192.168.0.1
ServerPort : 8080
ContextPath : /test
ServletPath : /requestTest
QueryString : request="req"&response="rep"

 

Request URI = /test/requestTest (ContextPath + ServletPath)

Request URL = http://192.168.0.1:8080/test/requestTest(Scheme + ServerName + ServerPort + RequestURI)

 

Scheme

통신 형식을 가리키는 말로 URL에서 리소스에 접근하는 방식을 정의하는 것.

HTTP, HTTPS, WS, WSS, FTP, SMTP 등등 여러가지가 있다. HTTP(HTTPS)는 Hyper Text Transfer Protocol의 약자로 웹 브라우저 웹서버가 통신을 할때 사용하는 방식 중 하나이고 여기서 HyperText는 HTML문서라고 생각하면 된다. HTTPS는 HTTP의 보안문제로 인해 HTTPS에 TLS 프로토콜을 적용하여 암호화한 통신 방식이다. 참고로 TLS는 보안 적용을 하기위한 프로토콜이고 FTP, SMTP 등 여러 곳에 활용 가능하다. WSS도 WS에 TLS를 적용한 것이고 WS는 웹소켓 프로토콜이다

 

ServerName

리소스가 호스팅된 서버의 도메인이나 아이피 주소를 말한다. 간단하게 해당 컴퓨터를 식별하기 위한 고유주소! 밑에 포트랑 같이 보면 좋음.

 

ServerPort

서버가 사용하는(연결된)포트 번호이다. 포트를 간단히 설명하자면 먼저 컴퓨터 내에서 제공하는 앱에서 여러가지 서비스를 제공할 수 있는데 한 컴퓨터에서 한가지 작업만이 제공되는 것이 아니기 때문에 아이피만 가지고는 서버를 구분할 수 없다. 그래서 아이피주소 뒤에 포트번호로 해당 아이피에서 어떤 작업을 하는지 구분해주는것이라고 보면 된다

 

비유하자면

아이피주소 : 건물주소, 포트번호 → 해당건물내의 호실

아이피주소 : 대표번호, 포트번호  내선번호

 

포트의 총 개수는 2^16개로 65536개를 사용할 수 있으며 0을 포함 실제로 0~65535의 포트번호를 가진다

일반적으로 well-known 포트라고 해서 0~1023까지의 포트는 잘 알려진 포트로 이미 역할이 정해져있기 때문에 변경은 가능 하지만 사용하지 않는다. 웹서버는 기본적으로 80번 포트를 사용하여 포트를 지정하지 않을시 디폴트 값으로 80을 붙여준다. 서버가 먼저 포트번호와 연결(바인딩) 되어있어야 한다 -> 리스닝이라고 부른다(대기중)

 

ContextPath

웹 앱에서의 루트경로를 가리킨다. 실제 서버 배포시 할당되는 경로이고 프로젝트 루트 디렉토리와는 전혀 다르다.

수업때 사용하던 프로젝트 루트 디렉토리를 이런식으로 지정해서 처음에는 이게 같은 건줄 알았다

 

ServletPath

웹 앱에서 서블릿 또는 특정 jsp의 페이지 경로를 나타낸다

간단히 말해서 서블릿 사용시 @WebServlet 애너테이션을 추가하는데 여기에 지정된 서블릿 경로이고 해당 요청을 처리하기 위한 서블릿/메소드의 경로를 말한다.

언젠가? 자세히 작성하겠지만 @WebServlet = @Controller + @RequestMapping인데

서블릿에서는 클래스 단위로만 서블릿 애너테이션을 적용할 수 있기 때문에 클래스 수가 무지막지하게 많아진다. 스프링에서는 이게 발전되서 메서드 단위로도 적용 가능하여 좀 더 사용하기 쉬워진다.

 

QueryString

key-value쌍으로 이루어진 데이터이며 URL의 끝에 ?뒤에 붙여서 이 값들을 전달 해 줄수 있다. 여러 값을 넘길때는 &를 붙여서 여러 값을 넘길 수도 있다

ex) http://111.222.111.000:8080/study/test?id="test01"&pwd="1234"

 

요청 파라미터를 다루는 방법은 여러가지가 있는데 보통은 아래와 같이 사용한다

String name = request.getParameter("name");
-> 파라미터 key 지정 : 요청파라미터 key가 name인 값을 가져온다

Enumeration enum = request.getParameterNames();
-> Iterator : 모든 요청 파라미터의 값을 가져와서 Iterator로 순회한다

Map paramMap = request.getParameterMap();
-> key-value값으로 저장
해당 요청 파라미터를 Map객체로 반환하고 Map객체는 요청 파라미터의 이름과 값을 key-value로 저장한다

 

웹서버란 말 그대로 웹 애플리케이션(웹에서 돌아가는 프로그램)을 서비스하는 서버를 얘기하는데 웹앱플리케이션을 서비스 한다는 것은 서버에 프로그램을 설치해두고 클라이언트는 설치하지않고 서버를 통해 사용한다는 의미이다. 이 웹 서버를 구성하는 요소들을 실행하고 관리하는 환경을 웹컨테이너 라고 하는데 대표적으로 Apach Tomcat, Jetty가 있다.

 

좀 더 디테일 하게 보자면 웹서버는 정적인 요소들에 대한 처리만 가능 하기 때문에 복잡한 비즈니스 로직, DB 연동 등의 동적인 로직들은 별도의 처리가 필요하고, 이 역할을 해주는 것이 웹애플리케이션이며 이것을 실행/관리 하는 환경을 웹 컨테이너라고 한다.

 

톰캣의 구조를 간단히 보자면 기본적으로 브라우저에서 서버로 요청이 오면 톰캣 기본설정 포트인 8080포트에서 해당 사용자의 요청을 처리할 쓰레드 풀이 대기중이다. 이 톰캣 내부에는 요청을 처리할 서비스가 여러개 존재 하며 이 서비스를 연결해 주는 커넥터가 프로토콜 마다 존재하고(HTTP1.1, HTTP2, AJP 등등..) 서비스 내부에는 서비스를 처리할 엔진이 존재하는데 일반적으로는 한개지만 여러개 존재할 수도 있다. 엔진 내부엔 호스트가 존재하고 호스트 내에 다수의 Context가 존재한다. Context내에 Servlet이있는데 Servlet은 Server와 let(작다)를 합친 말로 작은 서버 프로그램이라고 생각하면 된다. 컨트롤러와 비슷한 역할을 수행한다고 보면 되고 스프링에서는 DispatcherServlet을 통해 컨트롤러를 호출한다.

 

기본적으로 톰캣의 설정파일은  server.xml, web.xml 이고
여기서 /conf/의 하위경로에 있는 server.xml은 톰캣 서버 설정파일, web.xml은 모든 web app의 공통설정인데

해당 웹 앱 내 /WEB-INF/web.xml 경로에서 프로젝트마다 다시 개별 설정을 해줄수도있다

구동 순서는 공통설정 -> 개별설정이며 가까운 쪽이 실행시 우선적용 순위를 가진다(공통설정 후 개별설정시 개별설정이 적용됨)

 

웹 앱을 실행 하기 위해서는 일반적으로

1. 프로그램 등록(서블릿 등록, @Controller)

2. 해당 요청 실행(URL연결, @RequestMapping)

과정이 있어야 하는데 이를 위해 기존에는 web.xml에 작성했기 때문에 필수였지만 현재는 애너테이션으로 사용함에 따라 선택사항이며 점점 줄어들고 있다