Skip to content

Commit

Permalink
Merge pull request #7 from minson96/main
Browse files Browse the repository at this point in the history
11월 10일 기술 블로그 수정
  • Loading branch information
corazzon authored Nov 24, 2023
2 parents bdbe94c + 9a2701b commit 32a674d
Showing 1 changed file with 19 additions and 25 deletions.
44 changes: 19 additions & 25 deletions _posts/2023-11-24-DS.md → _posts/2023-11-10-DS.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,44 +4,38 @@ title: Dispatcher Servlet
author: 손민우
categories: 기술세미나
banner:
image: https://raw.githubusercontent.com/Kernel360/blog-image/main/20231110/1.png
image: https://raw.githubusercontent.com/Kernel360/blog-image/main/2023/1110/1.png
background: "#000"
height: "100vh"
min_height: "38vh"
heading_style: "font-size: 4.25em; font-weight: bold; text-decoration: underline"
tags: [java, Dispatcher Servlet, 기술세미나]
---

안녕하세요, 기술 세미나도 벌써 1주차의 마지막이 되었는데요. 자료를 준비하고 발표 연습을 하면서 우여곡절이
안녕하세요, 첫 주의 마지막 기술세미나를 맞게 된 손민우입니다. 자료를 준비하고 발표 연습을 하면서 우여곡절이 정말 많았습니다. (발표가 끝난 지금도 생각하면 떨리네요.)

정말 많았습니다. (발표가 끝난 지금도 생각하면 떨리네요.)
주제를 선택하면서 가장 기본적인 부분에 대해 설명하고 싶었어요. 그래서 Controller에 대해 검색하다 알게 된 Dispatcher Servlet에 대해 발표해보면 어떨까하는 생각을 했던 것 같습니다.

주제를 선택하면서 가장 기본적인 부분에 대해 설명하고 싶었어요. 그래서 Controller에 대해 검색하다 알게 된

Dispatcher Servlet에 대해 발표해보면 어떨까하는 생각을 했던 것 같습니다.

그래서 이번 기술 세미나에서는 MVC의 흐름도에서부터 시작하여 Dispatcher Servlet, 마지막으로 Servlet에

대해 알아보고 결론적으로 개발자에게 어떤 도움을 주는지 알아볼까 합니다.
그래서 이번 기술 세미나에서는 MVC의 흐름도에서부터 시작하여 Dispatcher Servlet, 마지막으로 Servlet에 대해 알아보고 결론적으로 개발자에게 어떤 도움을 주는지 알아볼까 합니다.

그럼, 시작해보겠습니다.

## 1. Spring Web MVC

<div align="center">
<img width="692" alt="image" src="https://raw.githubusercontent.com/Kernel360/blog-image/main/20231110/2.png">
<img width="692" alt="image" src="https://raw.githubusercontent.com/Kernel360/blog-image/main/2023/1110/2.png">
</div>

위의 흐름도는 spring docs의 내용을 기반으로 그린 spring web MVC의 흐름도 입니다. 아마 Controller을 검색하다 종종 보신 적이 있으실 겁니다.

<div align="center">
<img width="691" alt="image" src="https://raw.githubusercontent.com/Kernel360/blog-image/main/20231110/3.png">
<img width="691" alt="image" src="https://raw.githubusercontent.com/Kernel360/blog-image/main/2023/1110/3.png">
</div>

그리고 이 흐름도에서 개발자에 의해 주로 개발되어지는 부분인 Controller, Repository, Service, Component 입니다.

<div align="center">
<img width="691" alt="image" src="https://raw.githubusercontent.com/Kernel360/blog-image/main/20231110/4.png">
<img width="691" alt="image" src="https://raw.githubusercontent.com/Kernel360/blog-image/main/2023/1110/4.png">
</div>

그리고 Dispatcher Servlet을 이해하기 위해서는 먼저 Client와 Controller 사이의 일들에 대해 알 필요가 있습니다.
Expand All @@ -51,7 +45,7 @@ Dispatcher Servlet에 대해 발표해보면 어떨까하는 생각을 했던
그럼 순서대로 설명을 진행하겠습니다.

<div align="center">
<img width="692" alt="image" src="https://raw.githubusercontent.com/Kernel360/blog-image/main/20231110/5.png">
<img width="692" alt="image" src="https://raw.githubusercontent.com/Kernel360/blog-image/main/2023/1110/5.png">
</div>

User(Client)가 보내는 Request에는 다양한 정보가 있는데 다음은 그 중 몇 가지입니다.
Expand All @@ -60,31 +54,31 @@ User(Client)가 보내는 Request에는 다양한 정보가 있는데 다음은
- 이 외에도 HTTP 헤더, 세션 정보 등 다양한 내용이 들어있다.

<div align="center">
<img width="691" alt="image" src="https://raw.githubusercontent.com/Kernel360/blog-image/main/20231110/6.png">
<img width="691" alt="image" src="https://raw.githubusercontent.com/Kernel360/blog-image/main/2023/1110/6.png">
</div>

보내진 Request를 받은 Dispatcher Servlet은 받은 내용 중 URI를 Handler Mapping에 보내 Controller들 의 URI List 중에서 동일한 주소를 가진 Controller 찾아 주게 된다.

<div align="center">
<img width="691" alt="image" src="https://raw.githubusercontent.com/Kernel360/blog-image/main/20231110/7.png">
<img width="691" alt="image" src="https://raw.githubusercontent.com/Kernel360/blog-image/main/2023/1110/7.png">
</div>

그럼 찾은 Controller로 Request를 보내기 위해 Handler Adapter를 거쳐 Controller로 일 처리를 위임하게 됩니다.

<div align="center">
<img width="692" alt="image" src="https://raw.githubusercontent.com/Kernel360/blog-image/main/20231110/8.png">
<img width="692" alt="image" src="https://raw.githubusercontent.com/Kernel360/blog-image/main/2023/1110/8.png">
</div>

그렇게 Controller가 일을 위임받게 되면 개발자가 구현해 놓은 Business Logic을 기반으로 Response를 만들어 반환을 해주게 되는데 이때 View name과 Model을 같이 보내게 됩니다.

<div align="center">
<img width="692" alt="image" src="https://raw.githubusercontent.com/Kernel360/blog-image/main/20231110/9.png">
<img width="692" alt="image" src="https://raw.githubusercontent.com/Kernel360/blog-image/main/2023/1110/9.png">
</div>

Response를 받은 Dispatcher Servlet은 View name과 Model을 View Resolver로 보내게 되고 View를 거쳐 최종적으로 User에게 보여질 View를 생성하여 다시 Dispatcher Servlet으로 보내게 됩니다.

<div align="center">
<img width="690" alt="image" src="https://raw.githubusercontent.com/Kernel360/blog-image/main/20231110/10.png">
<img width="690" alt="image" src="https://raw.githubusercontent.com/Kernel360/blog-image/main/2023/1110/10.png">
</div>

그렇게 완성한 Response를 다시 User에게 보내게 되면서 한 흐름이 끝나게 됩니다. 위 그림에서 Dispatcher Servlet이 중간에 위치하면서 모든 처리에 대해 중앙 집중적으로 처리한다는 점을 알 수 있습니다.
Expand All @@ -95,13 +89,13 @@ Response를 받은 Dispatcher Servlet은 View name과 Model을 View Resolver로
다음 그림은 여러 요청이 들어오는 그림입니다. 위의 그림에서 Client와 Dispatcher Servlet, Controller만을 분리하여 그린 그림입니다.

<div align="center">
<img width="500" height="300" alt="image" src="https://raw.githubusercontent.com/Kernel360/blog-image/main/20231110/11.png">
<img width="500" height="300" alt="image" src="https://raw.githubusercontent.com/Kernel360/blog-image/main/2023/1110/11.png">
</div>

위의 그림은 Dispatcher Servlet이 여러 요청들을 받더라도 각 URI에 대해 연결되어지는 Controller에게 일을 위임하고 응답을 받아 User에게 전달하게 됩니다.

<div align="center">
<img width="500" height="300" alt="image" src="https://raw.githubusercontent.com/Kernel360/blog-image/main/20231110/12.png">
<img width="500" height="300" alt="image" src="https://raw.githubusercontent.com/Kernel360/blog-image/main/2023/1110/12.png">
</div>

그리고 우리는 이렇게 중앙 집중적으로 일을 처리하는 패턴을 Front Controller Pattern이라고 합니다.
Expand All @@ -113,24 +107,24 @@ Response를 받은 Dispatcher Servlet은 View name과 Model을 View Resolver로
그걸 알기 위해서는 이전에 사용되어진 방식을 알아야 합니다.

<div align="center">
<img width="500" alt="image"height="300" src="https://raw.githubusercontent.com/Kernel360/blog-image/main/20231110/13.png">
<img width="500" alt="image"height="300" src="https://raw.githubusercontent.com/Kernel360/blog-image/main/2023/1110/13.png">
</div>

위 그림은 일반적인 Servlet을 이용해서 Controller로 요청을 보내는 과정을 보여주는 그림입니다.

Servlet을 통해 요청과 응답을 할 때마다 스레드가 생성이 되면서 멀티 스레딩에 의한 자원 공유로 인해 동기화 문제가 발생하거나 단일 프로세스 시스템 일때 효과를 못 볼 수 있습니다.

<div align="center">
<img width="500" alt="image"height="300" src="https://raw.githubusercontent.com/Kernel360/blog-image/main/20231110/14.png">
<img width="500" alt="image"height="300" src="https://raw.githubusercontent.com/Kernel360/blog-image/main/2023/1110/14.png">
</div>

그리고 일반적인 Servlet은 Singleton Pattern으로 구현되어 있어 매 요청마다 쓰레드를 새로 생성하여 일을 처리하게 됩니다. 처리한 이후에 쓰레드는 소멸되지만 인스턴스는 서블릿 컨테이너에 남아 동일한 요청이 다시 오게 되면 인스턴스를 호출해 재사용하게 됩니다.

<div align="center">
<img width="692" alt="image" src="https://raw.githubusercontent.com/Kernel360/blog-image/main/20231110/2.png">
<img width="692" alt="image" src="https://raw.githubusercontent.com/Kernel360/blog-image/main/2023/1110/2.png">
</div>

다시 첫 번째 사진을 보니 어떠신가요? Dispatcher Servlet이 왜 필요한지 그리고 어떤 역할을 하고 있는지 느껴지셨나요?
다시 첫 번째 사진을 보니 어떠신가요? Dispatcher Servlet이 왜 필요한지 그리고 어떤 역할을 하고 있는지 느껴지셨나요?

이렇게 Dispatcher Servlet은 기존의 Servlet을 이용하여 여러 요청들을 처리하면서 생길 수 있는 문제를 해결함과 동시에 중앙에서 모든 일을 처리하게 되면서 구조를 단순하게 해주고 유지 보수를 쉽게 해줍니다.

Expand Down

0 comments on commit 32a674d

Please sign in to comment.