-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[6주차] 공통 과제 #7
Comments
입금 폼 렌더링홈화면에서 입금 아이콘을 눌러 입금 폼에 접근하려는 클라이언트 요청이 들어왔다고 가정한다. 1단계 : 웹 브라우저가 DispatcherServlet에 요청을 전송한다.
2단계 : DispatcherServlet이 HandlerMapping 빈 객체에 컨트롤러 검색을 요청한다. DispatcherSerlvet은 해당 요청을 처리할 컨트롤러를 검색하지 않고, RequestMappingHandelrMapping 빈 객체에게 컨트롤러 검색을 요청한다. RequestMappingHandlerMapping 빈 객체는 웹 브라우저에서 전달한 “/core/deposit” 요청경로를 3단계 : DispatcherServlet이 HandlerAdapter 빈 객체에 컨트롤러 객체의 요청 처리를 위임한다. 4단계 : HandlerAdapter 빈 객체가 컨트롤러의 알맞은 메서드를 호출해서 요청을 처리하고, 결과를 ModelAndView로 변환하여 리턴한다. 링크를 통해 URL에 접속하면, 해당 요청 GET방식으로 이루어진다. RequestMappingHandlerAdapter 빈 객체는 GET 방식의 “/core/deposit” 요청경로를 처리할 수 있는 DepositController의 depositForm() 메서드를 실행한다. depositForm 메서드는 조회된 모든 멤버 목록을 Model 객체에 members라는 이름으로 추가하고, 즉, 뷰 이름을 문자열로 반환하고 모델 데이터는 Model 객체를 통해 전달한다고 볼 수 있다. 4단계-내부동작 : ModelAndView 객체로 변환되어 처리된다. depositForm 메서드를 보면 메서드 자체에서 ModelAndView 객체를 리턴하지는 않는다. 스프링 MVC에서는 Model과 View를 반환하는 메서드가 내부적으로 ModelAndView 객체로 변환되어 5단계 : DispatcherServlet이 ViewResolver를 이용해 결과를 보여줄 View를 검색한다. 스프링 부트에서는 다음의 ViewResolver를 사용한다.
기본적으로는 ThymeleafViewResolver가 자동으로 설정되며, 템플릿 위치와 파일 확장자는 다음과
즉, ThymeleafViewResolver는 “core/deposit/depositForm”이라는 뷰 이름을 이용해 classpath:/templates/core/deposit/depositForm.html이라는 최종 템플릿 경로를 생성하고, 이 경로를 기반으로 ThymeleafView 객체를 생성해 리턴한다. 6단계 : DispatcherServlet이 최종 응답 HTML을 웹 브라우저에 리턴한다. { 이름 : 땅울림, 보너스 선택 : 정률 보너스, 입금할 금액 : 10000}을 선택 후 입금버튼 클릭 입금 화면에서 “회원 선택: 땅울림, 보너스 선택: 정률 보너스, 입금할 금액: 10000”을 선택해 입금 버튼을 클릭했다고 가정한다. 1단계 : 웹 브라우저가 DispatcherServlet에 요청을 전송한다. depositForm.html에서 “/core/deposit” 경로로 POST 방식을 이용해 데이터를 전송하려는 요청을 DIspatcherServlet에 보낸다. 2단계 : DispatcherServlet이 HandlerMapping 빈 객체에 컨트롤러 검색을 요청한다. RequestMappingHandlerMapping 빈 객체는 웹 브라우저에서 전달한 “/core/deposit” 요청경로를 3단계 : DispatcherServlet이 HandlerAdapter 빈 객체에 컨트롤러 객체의 요청 처리를 위임한다. 4단계 : HandlerAdapter 빈 객체가 컨트롤러의 알맞은 메서드를 호출해서 요청을 처리하고, 결과를 ModelAndView로 변환하여 리턴한다. depositForm.html에서 폼 데이터 처리를 POST 방식으로 하고 있기 때문에 POST 방식의 “/core/deposit” 요청 경로를 처리할 수 있는 deposit() 메서드를 실행한다. deposit 메서드는 @ModelAttribute을 이용해 DepositForm 타입의 커맨드 객체에 요청 파라미터 데이터들을 복사한다. deposit 인터페이스를 구현한 DepositServiceImpl 클래스에서는 재정의한 deposit 메서드에서 커맨드 객체에서 복사한 요청 파라미터 값을 이용하는데, memberId에 해당하는 member를 찾고, 이후 “redirect:/core”이라는 리다이렉트 메세지를 작성한다. 5단계 : DispatcherServlet은 클라이언트에게 HTTP 응답을 보낸다. 이때, 302 상태 코드와 함께 Location 헤더가 포함되어, 클라이언트가 /core URL로 새 요청을 보내도록 지시한다. 6단계 : 웹 브라우저가 DispatcherServlet에 “/core”에 대해 새로운 요청을 보낸다. 웹 브라우저는 리다이렉트 응답을 수신한 후, Location 헤더에 지정된 URL로 새로운 GET 요청을 보낸다. 이때는 새로운 요청이므로, /core 주소에 대한 요청을 보내게 된다. 7단계 : DispatcherServlet이 HandlerMapping 빈 객체에 컨트롤러 검색을 요청한다. RequestMappingHandlerMapping 빈 객체는 웹 브라우저에서 전달한 “/core” 요청경로를 8단계 : DispatcherServlet이 HandlerAdapter 빈 객체에 컨트롤러 객체의 요청 처리를 위임한다. 9단계 : HandlerAdapter 빈 객체가 컨트롤러의 알맞은 메서드를 호출해서 요청을 처리하고, 결과를 ModelAndView로 변환하여 리턴한다. RequestMappingHandlerAdapter 빈 객체는 GET 방식의 “/core/home” 요청경로를 처리할 수 있는 HomeController의 home() 메서드를 실행한다. home() 메서드는 “core/home” 이라는 뷰 이름을 리턴한다. 스프링 MVC에서는 View를 반환하는 home() 메서드가 내부적으로 ModelAndView 객체로 변환되어 10단계 : DispatcherServlet이 ViewResolver를 이용해 결과를 보여줄 View를 검색한다. ThymeleafViewResolver는 “core/home”이라는 뷰 이름을 이용해 classpath:/templates/core/home.html이라는 최종 템플릿 경로를 생성하고, 이 경로를 기반으로 ThymeleafView 객체를 생성해 리턴한다. 11단계 : DispatcherServlet이 최종 응답 HTML을 웹 브라우저에 리턴한다. 웹 브라우저의 http 요청
EX) localhost:8080/core URL로 접속하려는 경우 웹 브라우저에서 URL을 통해 특정 경로에 접속하는 경우, HTTP는 GET방식의 요청을 서버에 전송한다 GET 방식 : 요청 방식 서버로 부터 데이터를 요청하며, 주로 리소스를 조회하는 경우에 사용된다. 1단계 : 요청 메서드 포함 요청 헤더는 클라이언트가 서버에 추가 정보를 전달하는 부분이다. Host: 요청하는 호스트의 이름과 포트 번호를 포함 실제로, 크롬에서 스프링 Application을 실행한 뒤 localhost:8080/core로 접속했을 때 메세지를 확인해보면 다음과 같이 나온다. 메세지를 보면 요청 메서드, 요청 리소스 URL, HTTP 버전 등의 내용이 포함되어 있다. HTTP가 서버에 요청을 보낸 후 처리가 되면 이에 대한 응답을 보내는데, HTTP 응답 헤더는 서버가 클라이언트에게 보내는 메타데이터로, 응답의 특성이나 처리 방법에 대한 정보를 포함한다. 또한, 입금 아이콘을 통해 입금 폼에 접근하면 다음과 같은 메세지를 확인할 수 있다. HTTP 응답 헤더는 다음과 같이 나타난다.
EX) 입금 폼에서 {이름: 땅울림, 보너스 선택: 고정 보너스, 입금할 금액:10000}을 선택한 뒤 입금했을 때 html을 작성할 때, 전송하면 POST 방식으로 처리하도록 설정했기 때문에 요청 메서드가 POST로 변경된 것을 볼 수 있다. 또한, GET 방식과는 다르게, POST 방식은 RequestBody가 존재하는 것을 확인할 수 있다. 코드에서는 입금 폼을 작성하고 제출하면 /core로 리다이렉트 했었기 때문에, 상태코드는 302가 된 것을 알 수 있다. 또한, 리다이렉션 응답을 생성하는 경우에는, Location 정보가 포함되며, 클라이언트가 요청을 보내야하는 새로운 URL을 지정한다. 이 경우에는 요청을 보내야하는 새로운 URL로 http://localhost:8080/core가 지정되었으므로 다시 요청이 발생한다. 따라서, 위의 요청을 서버가 처리하고 다음과 같은 응답 메세지를 보내면서, 요청이 종료된다. |
스프링 MVC가 웹 요청을 처리하려면 DispatcherServlet을 통해서 웹 요청을 받아야 한다. -> 스프링 부트 프로젝트에서는 별도의 web.xml 파일을 이용해 DispatcherServlet을 등록하지 않고도 자동으로 이를 등록해준다. 홈페이지에서 입금기능을 선택한다고 가정하자.++ 현재 클라이언트와 서버는 SYN, SYN+ACK, ACK 과정을 거쳐 이미 연결된 상태라고 가정하자. 연결이 끊겨 있으면 HTML 요청을 보낼 수가 없다. localhost:8080/core/deposit을 누르고 엔터를 누른 상태이다.
지금까지는 아무런 정보를 입력하지 않고 딱 입금 페이지에 들어오는 과정을 봤다.{ 이름 : 땅울림, 보너스 선택 : 정률 보너스, 입금할 금액 : 10000} 을 선택하고 ‘입금’ 버튼 클릭하는 과정을 설명하고자 한다.++ 그림은 생략하고 설명 { 이름 : 땅울림, 보너스 선택 : 정률 보너스, 입금할 금액 : 10000} 을 선택하고 ‘입금’ 버튼 클릭하면
HandlerAdapter은 POST요청이 들어왔기에 @PostMapping 애노테이션이 사용된 **deposit 함수를 호출하고 DepositForm 객체에 amount, policy, ID와 같은 정보를 담아준다 **
|
입금 폼 랜더링0. 클라이언트 요청웹 브라우저에서 입금 버튼을 눌러 입금 폼에 접근하고자 한다. 1. 요청 URL과 매칭되는 컨트롤러 검색
2. 처리 요청DispatcherServlet은 RequestMappingHandlerMapping이 찾아준 컨트롤러 객체를 처리할 수 있는 HandlerAdapter 빈에게 요청 처리를 위임한다. 3. HandlerAdapterHandlerAdapter는 컨트롤러의 알맞은 메서드를 호출해서 요청을 처리하고 그 결과를 ModelAndView라는 객체로 변환해서 DispatcherServlet에 리턴한다.
클라이언트가 /core/deposit 경로로 GET 요청을 보내면,
4. JSP를 위한 ViewResolverDispatcherServlet은 결과를 보여줄 뷰를 찾기 위해 ViewResolver 빈 객체를 사용한다.
5. 응답 생성DispatcherServlet은 ViewResolver가 리턴한 View 객체에게 응답 결과 생성을 요청하고, 이를 웹 브라우저에 전송한다. HTTP
{이름 : 땅울림, 보너스 선택 : 정률 보너스, 입금할 금액 : 10000} 을 선택하고 ‘입금’ 버튼 클릭0. 클라이언트 요청{이름 : 땅울림, 보너스 선택 : 정률 보너스, 입금할 금액 : 10000}을 선택하고 ‘입금’ 버튼을 클릭한다. 1. 요청 URL과 매칭되는 컨트롤러 검색
2. 처리 요청DispatcherServlet은 RequestMappingHandlerMapping이 찾아준 컨트롤러 객체를 처리할 수 있는 HandlerAdapter 빈에게 요청 처리를 위임한다. 3. HandlerAdapterHandlerAdapter는 컨트롤러의 알맞은 메서드를 호출해서 요청을 처리하고 그 결과를 ModelAndView라는 객체로 변환해서 DispatcherServlet에 리턴한다.
클라이언트가 /core/deposit 경로로 POST 요청을 보내면,
HTTP
4. 클라이언트의 "/core" 경로에 대한 새로운 요청5. 요청 URL과 매칭되는 컨트롤러 검색
6. 처리 요청DispatcherServlet은 RequestMappingHandlerMapping이 찾아준 컨트롤러 객체를 처리할 수 있는 HandlerAdapter 빈에게 요청 처리를 위임한다. 7. HandlerAdapterHandlerAdapter는 컨트롤러의 알맞은 메서드를 호출해서 요청을 처리하고 그 결과를 ModelAndView라는 객체로 변환해서 DispatcherServlet에 리턴한다.
클라이언트가 /core 경로로 GET 요청을 보내면,
8. JSP를 위한 ViewResolverDispatcherServlet은 결과를 보여줄 뷰를 찾기 위해 ViewResolver 빈 객체를 사용한다.
9. 응답 생성DispatcherServlet은 ViewResolver가 리턴한 View 객체에게 응답 결과 생성을 요청하고, 이를 웹 브라우저에 전송한다. |
입금 화면에서는 등록되어있는 회원 선택, 고정/정률 보너스 선택, 입금 금액 입력을 작성한 후 "입금" 버튼을 눌러 입금하는 구조를 띄고 있습니다. 먼저 사용자는 홈 화면에서 입금 버튼을 누르면 /core/deposit 요청 경로를 디스패쳐 서블릿에게 전달한 후 해당 컨트롤러를 탐색하게 됩니다.
사용자가 페이지에서 "입금" 버튼을 클릭합니다. 클릭 이벤트로 인해 브라우저는 /core/deposit 경로로 GET 요청을 보냅니다. 서버는 이 GET 요청을 DepositController의 depositForm 메서드로 전달합니다. 이 메서드는 @RequestMapping("/core/deposit") 어노테이션에 의해 매핑됩니다. 서버는 depositForm.html 페이지를 브라우저로 반환합니다.
폼 데이터 제출사용자가 웹 폼에서 다음과 같은 정보를 입력했다고 가정합니다: 회원 이름: "홍길동" 사용자가 "입금" 버튼을 클릭하면, 폼 데이터가 POST 요청으로 서버의 /core/deposit URL로 전송됩니다. 서버의 DepositController에서 요청 처리@PostMapping 애너테이션은 /core/deposit 경로로의 POST 요청을 처리할 메서드를 지정합니다. Spring MVC는 요청 본문에서 폼 데이터를 추출하여 DepositForm 객체를 생성하고, 이 객체의 필드에 폼 데이터 값을 바인딩합니다. DepositController.deposit 메서드는 DepositForm 객체의 데이터를 사용하여 DepositService의 deposit 메서드를 호출합니다.
호출되는 메서드의 매개변수는 memberId, amount, policy입니다. DepositService에서 입금 처리memberRepository.findById(memberId)를 사용하여 데이터베이스에서 해당 회원을 조회합니다.
위에서 봤던 deposit 메소드에서, Money finalDepositMoney = new Money(amount + bonusAmount)를 사용하여 최종 입금 금액을 설정합니다. 사용자 리다이렉션DepositController.deposit 메서드는 처리 후 "redirect:/core"를 반환합니다. 브라우저는 /core URL로 새 요청을 보내고, 서버는 이에 대한 응답을 생성하여 사용자에게 반환합니다. |
입금 폼을 제출하는 과정에서 일어나는 모든 동작을 웹 브라우저에서 서버에 요청을 보내고 서버가 응답하는 이 과정은 웹 애플리케이션의 요청-응답으로 이루어져있으며, 주요 단계를 다음과 같이 정리할 수 있음. 1. 브라우저에서 입금 폼 제출 (클라이언트 측)클라이언트(사용자)는 이름, 보너스 선택, 입금할 금액을 입력하고, 입금 버튼을 클릭합니다. 이 정보들은 HTML 폼의 필드에 포함되어 있다. 2. HTTP 요청 생성 및 전송
3. 서버에서 요청 수신 및 처리 (서버 측)
4. 비즈니스 로직 처리
5. 서버에서 클라이언트로 응답 전송
6. 클라이언트에서 응답 처리
|
과제 설명
목표
기능
{ 이름 : 땅울림, 보너스 선택 : 정률 보너스, 입금할 금액 : 10000}
을 선택하고 ‘입금’ 버튼 클릭The text was updated successfully, but these errors were encountered: