ex) B라는 클라이언트가 5000번(메인스레드) 포트와 통신을 한다.
5000번 포트와 연결이 되면 서버는 새로운 포트(랜덤)
5001 소켓과 연결을 해주고 5000대신 그 곳과 통신을한다.
그러나 다른 사용자의 요청도 받고싶다.
그래서 5001번의 새로운 소켓을 만들땐 새로운 스레드를 1개 더 만든다.
5000번 메인스레드는 계속해서 사용자 요청을 받고
5001번 스레드는 B와 통신한다.
그리고 새로운 클라이언트 C가 요청을하면 메인스레드 5000과 통신을 하게되고 연결이 된다면 또 새로운 소켓 5002(랜덤), 새로운 스레드를 생성하게 된다!
메인스레드와 통신 > 연결이되면 메인스레드와 연결은 끊기고 새로운 포트(스레드)를 만들어 그곳과 통신
장점 - 연결이 계속되어있다.
단점 - 연결이 계속되어있어 부하가 크다. 소켓이 많아진다면 엄청난 부하가 생길 수 있다.
HTTP 통신은 그래서 계속 연결하시 않고 연결을 끊어버리는
Stateless방식을 사용한다.
http방식은 쉽게말해 문서를 전달하는 형식
ex) 클라이언트 a가 서버에 a.txt달라고 요청
새로운 소켓을 만드는 것이 아닌 a.txt파일을 찾아서 돌려주고 통신을 끊는다
응답해주고 통신을 바로끊는다.
장점 - 연결이 끊기므로 부하가 적다.
단점 - 다시 연결시 항상 새로운 사용자라고 인식한다.
http 웹서버는 쉽게 말해서 '갑'이다.
갑이라는 건 '을'이 필요한 데이터를 가지고 있다.
을이 갑에게 요청(request)한다.
요청하기 위해서 요청을 보낼 주소(IP)를 알아야한다.
그리고 요청 시 어떤 데이터가 필요한지 명시해줘야한다
그것을 URL로 명시한다.
http에선 갑은 을의 ip주소를 모른다.
그래서 클라이언트(을)이 요청을 하지않으면 어떤 데이터를 줄 수가 없다.(소켓은 계속 연결되어 있어 통신가능)
요청 시 마다 변하는 자원이 아닌 static자원(정적자원)만을 응답할 수 있다.
아파치라는 웹서버를 사용한다.
클라이언트가 어떤 데이터를 요청하면 아파치가 요청한 데이터를 응답해준다.
ex) a가 .jsp(자바코드)라는 파일을 요청한다.
그러나 아파치는 자바코드를 이해하지 못한다.
그래서 제어권을 톰캣에게 넘겨준다
톰캣은 .jsp파일안에 있는 모든 java코드들을 컴파일하고
컴파일된 데이터를 html파일에 덮어 씌워준다.
톰캣을 java코드를 컴파일하고 html문서로 만들어주고 다시 아파치에게 돌려주고 아파치는 html을 클라이언트에게 응답해준다.
톰캣을 아파치가 이해못한 코드를 컴파일해 다시 아파치에게 넘겨주고 아파치는 클라이언트에게 응답해준다.