Springboot 동작 원리
내장 톰켓을 가진다.
먼저 소켓에 대해 알아야 한다. 소켓이란 ?
운영체제가 가지고 있는 것으로 A와 B가 통신하고 싶을 때 이 운영체제가 제공해주는 소켓을 이용해야 한다.
- 처음에 A가 포트번호로 소켓을 오픈한다.
- B는 A가 오픈한 소켓의 포트 번호와 A의 IP 주소를 이용해서 통신을 시도한다.
- 연결이 완료되면 통신이 완료된다.
그런데 이렇게 만들면 문제는 C가 A와 통신하고 싶을 때 A와 B가 5000번 포트를 사용 중이라서 C는 그 소켓을 이용할 수가 없다. 그래서 5000번 포트 소켓은 연결 용도로만 사용하고 연결이 완료되면 새로운 소켓을 만든다.
새로운 소켓의 포트 번호는 보통 랜덤이고 새로운 소켓이 만들어지면 B와 A가 연결했던 5000번 포트 소켓과의 통신은 끊어진다. B는 새로운 소켓과 연결해서 메세지를 주고받는다.
이 상태에서도 C와 A의 연결은 불가능하다. 왜냐하면 CPU가 B와 A가 5001번 포트에서 통신을 계속 하기 위해 일을 하고 있기 때문이다. 그래서 스레드를 이용해 해결해야 한다.
5000번 소켓의 main 스레드는 계속 새로운 사용자의 요청을 받고 새로운 소켓을 만들때마다 새로운 스레드를 같이 만들어준다. 그 스레드로 그 소켓과의 통신을 하는 것이다. 그럼 이 상태에서는 C가 5000번의 소켓과 통신이 가능하다.
소켓 통신의 핵심은 스레드이다. timeslice로 시간을 쪼개서 동시에 동작하는 것처럼 보이게 할 수 있다.
이 소켓 통신의 장점은 통신이 계속 연결되어 있기 때문에 소켓의 수가 늘어나면 부하가 커서 느려질 수 있다. 그래서 HTTP 통신은 연결을 지속시키지 않고 연결을 끊어버리는 stateless 방식을 사용한다.
stateless 방식이란?
http 통신은 단순하게 문서를 전달하는 통신이다. A가 a.txt 파일을 서버에게 요구했을 때 연결 요청을 받은 소켓이 새로운 소켓을 만들고 스레드를 만드는 것이 아니라 그냥 바로 다이렉트로 a.txt 파일을 찾아서 돌려준 후 통신을 끊는다. 마찬가지로 B가 b.txt를 요청해도 바로 찾아서 주고 끊어준다. 단지 문서 전달의 목적으로 만들어진 것이 http 통신인 것이다.
위의 소켓 통신은 부하가 크지만 한번만 연결해주면 계속 연결되는 장점이 있는 반면 http 통신의 stateless 방식은 연결이 끊기기 때문에 부하는 적지만 다시 연결하려고 요청하면 새로운 사람으로 인식하는 단점이 있다.
이러한 http 통신의 단점을 보완해서 만들어진 것이 웹 서버이다.
그렇다면 웹 서버란 무엇일까?
내 컴퓨터에 파일이 있는데 다른 사람이 그 파일을 보고 싶어하는 상황을 생각해보자. 여기서 파일을 가진 컴퓨터를 소유한 내가 갑이고 내 파일을 원하는 사람들이 을이다.
HTTP 통신은 항상 을이 갑에게 request 요청을 한다. 요청을 하기 위해서는 컴퓨터의 위치를 알아야 해서 IP 주소를 알아야 하고, 내 컴퓨터의 파일들 중 어떤 파일을 원하는 지 표시하기 위해 URL을 이용한다.
자원을 요청하는 주소를 뜻하는 URL을 갑인 컴퓨터가 받으면 response를 해준다. 갑은 을의 주소를 모르는 상태에서 을의 요청이 오면 그 URL을 토대로 response를 해준다. 여기서 갑이 웹 서버의 역할을 하는 것이다.
HTTP에서 갑은 을의 주소를 알 필요도 없고 알고 있지도 않다. 그래서 을의 요청이 없을 경우엔 응답을 할 수가 없다. 을의 주소를 알기 위해서는 소켓을 사용해야 한다. 소켓 통신은 한번 연결 후 연결이 계속 지속되고 있어서 을의 주소를 알 수 있기 때문이다.
참고로 을의 컴퓨터 파일들은 전부 static 정적 파일들이다. 같은 파일을 여러 을에서 요청했을 경우 항상 정적인 같은 파일을 응답해준다.
그렇다면 톰켓이란?
흔히 웹서버로 아파치를 사용한다. 아파치로 컴퓨터에 특정한 폴터를 지정하고 공유할 때 만약 자바 코드 기반의 파일을 요청한 상황을 생각해보자. 아파치는 자바 코드를 이해하지 못해서 응답하지 못한다. 그래서 여기에 다는 것이 톰켓이다.
아파치는 이해하지 못하는 파일에 대한 요청이 오면 제어권을 톰켓에게 넘긴다. 톰켓은 .JSP 파일의 모든 자바 코드를 컴파일한 후 .html로 덮어씌워서 웹 브라우저에 reponse해준다.
요청할 때에는 보통 웹 브라우저로 요청하는데 만약 아파치가 JSP 파일 요청대로 JSP 파일을 그대로 돌려준다면 웹 브라우저는 html, Javascript, Css, avi 등 정적인 파일들만 이해할 수 있기 때문에 웹 브라우저로 열 수가 없다. 그래서 아파치가 톰켓에게 제어권을 넘기고 톰켓이 html 파일로 변환해서 응답해주는 원리이다.
출처
[무료] 스프링부트 개념정리(이론) - 인프런 | 강의
스프링부트를 공부하며 헷갈리는 개념이 많았던 분 스프링부트에 대해 공부하고 싶었던 모든 분, - 강의 소개 | 인프런...
www.inflearn.com
'Spring > Spring 기초 이론' 카테고리의 다른 글
[Spring 기초 이론] 디스패처 서블릿 (0) | 2022.03.31 |
---|---|
[Spring 기초 이론] 웹 배포서술자 (web.xml) (0) | 2022.03.17 |
[Spring 기초 이론] Springboot - 서블릿 컨테이너 (0) | 2022.03.17 |
[Spring 기초 이론] JPA (0) | 2022.02.28 |
[Spring 기초 이론] Spring (0) | 2022.02.28 |