Legday

[Spring]Apache Tomcat 내부원리 본문

Spring&Springboot/Spring(개인공부용)

[Spring]Apache Tomcat 내부원리

Legday 2022. 8. 26. 11:33

Apache Tomcat 을 써서 서버를 구현 했을 때 Client가 Request를 하면 Apach 서버 내부에서 어떻게 동작이 되서 Response 하는지 정리 해보았다

 

- Http 통신 기반으로 Request(요청), Response(응답) 을 할때는 항상 header와 body로 이루어진 데이터패킷을 주고받게 된다.

 

<동작 원리 설명> // 그림에 Spring내부에는 더많은 자원이 있지만 설명을 위해 간략히표시

1) Client가 데이터를 Request(요청)한다면 Apache 서버 port를 통해 들어온다 . 그러면 web.xml(배포 서술자라고 한다) 에서 필터링을 한다. 

2) 필터링한 내용을 DS(Dispatcher Servelet)에 전달하고 이때 Apache에서 Request객체, Response객체를 생성한다.(여러 Client가 요청을 하면 요청이 들어올 때 Request, Response 객체를 여러개 생성한다)

3) DS가 데이터 파싱을 하여 식별자를 찾아 Controller에 라우팅을 해줍니다.(Controller 메서드호출) 그리고 여러 과정을 거쳐서  DB에서 데이터를 가져와 Response를 합니다. 이때! Response를 하면 Request객체를 소멸하게 됩니다!

하지만 문제가 있다. 아래 그림처럼 Client가 View에 데이터를 전달하고 싶을 때는 내부에서 2번의 Requeest가 일어나기 때문에 Request객체가 2개 생긴다

Controller는 요청받은 데이터를 첫번째 Request객체에 저장하고 View에게 새로운 요청을 할때 첫번째 Request객체를 사용하지 않고 새로운 Request요청을 하게 된다.

이때  Client에서 요청한 데이터는 첫번째Request1에 저장되고, 실제 Client가 Resopne받는 데이터는 두번째 Request객체에 데이터를 받기 때문에 Client가 빈 데이터를 받게 됩니다.

위 방법이 Redirect 기술이다

<Requeset Dispatcher>

- Redirect의 문제를 해결하기 위해 Spring 프레임워크는 Request Dispatcher기술을 디폴트로 설정되어 있다.

- Request Dispatcher기술은 기존 Request객체를 새로운 Request가 생겨 2번째 Request객체가 생길 때 덮어씌워서 데맨처음 요청때 받은 데이터를 계속 기억하여 Client에게 Response하는 기술이다.

 하지만 Request Dispatcher도 Response가 될 때 사라지는 문제점이 있다.

<Session>

- 보통 Session 이라고 하면 사용자인증, 권한 등의 역할을 한다고 생각할 수 있지만 그 외에도 데이터를 계속 기억하고 싶을때 사용할 수도 있다.

- 기본원리를 설명한다면 Session에 데이터가 저장이 되면 자동으로 key값이 생겨진다(프로토콜에 의해서)

- 그리고 똑같은 Client가 재요청을 했을때 key값을 비교하여 인증이 되어 저장되었던 데이터를 돌려준다.

- 그렇다면 이 key값을 Client에서도 계속 기억해야 하는데 이때 Cookie를 이용한다.

- 맨 처음 요청을 할 때는 Session에 데이터를 저장한다. 그럼 key값이 생성되서 Response할때 header에 key값이 저장된다.

- Response받은 Client(브라우저)는 Cookie라는 공간에 key값을 저장하고 그다음 요청(재요청)을 할때 자동으로 header에 Cookie에 있는 key값을 담아서 Request한다(프로토콜에 의해서)

- 그러면 Session에서 key값을 비교하여 데이터를 돌려주는 원리이다.

- 위 모든 과정들은 http프로토콜에 의해서 이루어 지는것이고 브라우저에 한해서 이루어진다( 절대 flutter나 다른 어플리케이션에서는 따로 구축을 해야한다)