-
웹 서버란?Spring Framework 2020. 7. 4. 17:50반응형
1. 웹이 동작하는 방법
굉장히 귀여운 그림이 위에 있죠? 왠 졸라맨 같은 사람이 클릭을 하니, 사용하는 브라우저에서 Web Server로 HTTP Request(요청) 전송을 합니다. 이때 Web Server는 해당하는 HTTP Response(응답)를 다시 보내주는데요. 쉽게 이야기해서 브라우저와 대화를 하는 것입니다. 브라우저가 뭔가 요청했으니, Web Server는 대답을 하는 것입니다.
여기서 HTTP는 인터넷 환경에서 데이터를 주고받을 수 있는 통신 규약인데요. 이러한 통신 규약을 바탕으로 요청(Request), 응답(Response)을 통일된 형식으로 보내게 됩니다. 즉 여러분들이 인터넷에서 클릭을 하고 어떠한 동작을 한다는 것은, 서버에 정보를 요청하는 행위입니다. 그리고 서버는 여러분들이 보낸 요청에, 답장을 보내 줍니다. 클릭을 했으니 정보를 보여줘야겠죠?
그렇다면 Response를 통해서 어떤 응답을 보내주는 것일까요?
1. 1. 정적 / 동적 페이지
사용자가 브라우저의 웹 페이지에서 요청을 했기 때문에, 응답도 웹 페이지 형식이 될 것입니다. 즉 사용자 요청에 해당하는 알맞은 페이지 형태로 데이터를 보내줄 것인데요. 우리가 웹 개발을 할 때 view 페이지를 만드는 이유입니다.
이때 2가지 페이지 형태가 있습니다. Static(정적), Dynamic(동적) 페이지가 있는데요. Static 페이지는 이미 만들어져서 서버에 저장되어 있는 파일들입니다. 즉 요청을 하면 어떤 작업이 필요하지 않고, 그냥 가지고만 오면 되는데요. 하지만 Dynamic 페이지는 항상 달라지며 무엇인가 새로 추가되기도 합니다. 예를 들어 "컴퓨터 모니터" 구매를 위해 열심히 검색하던 사람이 쿠팡에 들어갔을 때 Static은 그냥 쿠팡의 같은 메인 페이지만 보여줄 것입니다. 하지만 Dynamic 페이지가 적용되어 있다면, 컴퓨터 모니터를 열심히 검색한 데이터를 기반으로 컴퓨터 관련된 추천이 포함된 페이지를 보여줄 수 있습니다. 즉 사용자에 맞게 페이지가 움직이고 변화한다는 의미입니다.
이때의 Static 페이지는 HTML, CSS로 작성된 파일들입니다. 이름만 들어도 아무런 변화가 없을 것 같은, 심심한 느낌이 오시죠?
하지만 Dynamic 페이지가 필요한 경우에는 Web Server 안의 Web Container(서블릿 컨테이너)로 가게 됩니다. 여기서 Container는 흔히 볼 수 있는 회색 컨테이너라고 생각하시면 됩니다. 사실 영어권에서는 플라스틱 밀폐용기도 Container라고 부르는데요. 둘 다 무엇인가 여러 가지를 한 공간에 담고 있는 느낌을 생각할 수 있습니다.
이러한 Web Container안에는 Java Servlet이 구성되어 있고, Container가 Servlet이 Server와 일을 하게 도와주는 일을 하는데요. Servlet의 생명주기를 관리하고, Request에 해당하는 어떤 서블릿을 사용할지 Mapping 해두고 불러오는 역할을 합니다. Servlet과 Mapping의 방법은 뒤에서 설명하겠습니다. 지금은 이 Servlet이 Dynamic 페이지를 만든다는 것을 아시면 됩니다.
그리고 Web Container 종류에는 많이 들어본 Apache Tomcat, Glass Fish, JBoss 등이 있습니다. 사실 약간의 거짓말이 들어가 있는데요ㅎㅎ고백은 뒤에서 하겠습니다. 조금만 기다려주세요.
1. 2. 지금까지의 과정을 요약해보겠습니다
- HTTP Request(요청) 보냄
- Static(정적) 페이지가 필요한 경우, Runtime시 이미 생성되어 저장된 HTML 페이지 전송
- Dynamic(동적) 페이지가 필요한 경우, Container로 Request 보냄
- Container는 적합한 Servlet에게 Request 요청
- Servlet이 작업 후 HTML 페이지로 변환해서 Server로 보냄
- Server가 HTTP Response(응답)
2. Servlet이란?
그렇다면 Servlet은 도대체 무엇이길래 동적인 작업을 위해서 Container, Server와 일을 할까요?
기본적으로 Servlet은 Java로 만들어진 Class 파일입니다. 앞서 설명했듯이 정적인 페이지는 이미 만들어져 있지만, 동적인 페이지는 어떠한 연산을 통해서 새롭게 만들거나 추가해야 합니다. 이러한 것들을 Dynamic content(동적 콘텐츠)라고 하고, 이를 만들기 위해서 Java, Python 같은 Server side scripting 언어를 사용합니다.
HTML 페이지로는 웹의 View 페이지를 정적으로 구성하는 역할밖에 할 수 없습니다. 어떤 새로운 연산이나 사용자와 상호작용 하는 기능은 할 수 없는데요. 그렇기 때문에 개발자들은 HTML은 프로그래밍 언어가 아니라는 농담을 하곤 합니다. 하지만 현대의 웹은 다양한 기능이 필요합니다. 네이버를 접속하더라도 사용자에 맞는 광고가 나오고, 저장해둔 설정에 의해 보고 싶은 신문사만 볼 수도 있습니다. 이러한 논리적인 과정을 위해서는 Server side scripting 언어가 필요합니다. 그리고 Servlet은 Java의 클래스로서, Java 언어로 사용자와 상호작용 할 수 있는 기능을 제공할 수 있습니다. 그렇기 때문에 우리가 Servlet을 사용합니다.
그런데 궁금합니다. 수 십 개의 Servlet 중에 원하는 Servlet이 어디에 있는지, 어떻게 알 수 있을까요? 이를 위해서 일종의 위치를 알려주는 설명서가 있습니다. "web.xml"이라는 파일인데요.
위의 코드를 보겠습니다. 해당 서블릿의 이름과 클래스가 어디에 있는지 알려줍니다. 또한 어떤 URL을 포함해야 접속할 수 있는지도 알려주고 있습니다.
사실 요즈음은 web.xml 파일을 잘 사용하지 않고, 대신에 Annotation을 사용합니다. 스프링 프레임워크를 공부해보신 분들은 이라면 익숙할 것입니다. 왜냐하면 web.xml에서 정의를 서블릿 하나하나 다 정의를 하려면, 코드가 너무 길어지고 복잡해지고, 귀찮아집니다.
서블릿이 작동하는 더 자세한 과정은 아래의 글을 참고해주세요
3. Tomcat이란?
제가 한 거짓말을 앞서 Tomcat은 Web Container라고 했습니다. 죄송합니다. 사실은 Static(정적) 작업을 하는 Web Server와 Dynamic(동적) 작업을 하는 Web Container를 한 번에 묶은 것입니다.
즉 Tomcat이 편하게 혼자서 Server와 Container를 가지고 있으며, Static과 Dynamic 작업 모두 담당합니다. 그리고 이러한 Web Container, Web Server 2가지를 합쳐서, WAS(Web Application Server)라고 부릅니다.
더 정확히는 Apache는 웹 서버로서 정적인 데이터를 다루고, Tomcat은 웹 컨테이너로서 동적인 데이터를 다룹니다. 그래서 우리는 'Apache Tomcat'이라고 부릅니다.
위에서 언급했듯이, Tomcat (웹 컨테이너)만 있어도 정적, 동적 데이터 모두 다룰 수 있습니다. 하지만 왜 서버와 컨테이너로 나누었을까요? 이는 역할의 분담을 위해서 입니다. 간단한 정적인 데이터는 서버에서 빠르게 처리를 하고, 복잡한 로직이 필요한 동적인 데이터는 컨테이너에서 담당하게 됩니다.
사실 많은 사람들이 Container, Server, WAS를 혼동해서 다양하게 부릅니다. 엿장수처럼 부르는 게 이름이 되기도 하는데요. 사실 어떻게 부르던지 딱히 문제가 되지 않지만, 언젠가는 모든 사람들이 동일한 이름을 부르는 날이 오면 좋겠습니다.
추가적으로 Tomcat은 HTTP 8080 Port를 사용합니다. 아마도 Tomcat을 설치하고 가장 처음 확인하는 것이 HTTP 8080에 잘 연결되는지 확인하는 것일 겁니다. 이는 어떤 소프트웨어가 데이터를 보내는 전용 통로라고 생각하면 됩니다.
4. 수정사항
2020년 9월 15일
서블릿 추가 내용 링크
2020년 9월 16일
내용 추가 및 수정
2021년 6월 14일
톰캣 파트 추가
5. 참고자료
en.wikipedia.org/wiki/Apache_Tomcat
en.wikipedia.org/wiki/Java_servlet
beginnersbook.com/2013/05/working-of-servlets/
반응형'Spring Framework' 카테고리의 다른 글
앵귤러, 스프링부트를 이용한 Oauth2 회원가입 문제 (0) 2021.06.23 하이버네이트의 네이밍 전략 (0) 2021.04.29 [Spring Framework]스프링 커맨드 객체 (0) 2021.01.01 서블릿이란? (0) 2020.09.15 [Spring Framework] IoC container / Scope (0) 2020.07.27