스프링 MVC 이해(Response)

송수용·2022년 6월 3일
0

웹 개발의 봄, Spring

목록 보기
22/25

스프링 MVC

  • MVC (Model - View - Controller) 디자인 패턴
  • Server 에서 HTML 을 내려 주는 경우
  1. 정적 (static) 웹 페이지

    • Controller
      1. Client 의 요청을 Model 로 받아 처리
      1. 예) 회원가입을 위한 개인 정보들 (id, password, name)
      2. Client 에게 View (정적 웹 페이지, HTML) 를 내려줌
      2. 동적 (dynamic) 웹 페이지
- **Controller**
    1. Client 의 요청을 **Model** 로 받아 처리
    2. Template engine 에게 **View**, **Model** 전달
        1. **View**: 동적 HTML 파일
        2. **Model**: View 에 적용할 정보들
    3. Template engine
        1. **View** 에 **Model** 을 적용 → 동적 웹페이지 생성
            1. 예) 로그인 성공 시, "로그인된 사용자의 id" 를 페이지에 추가
            2. Template engine 종류: 타임리프 (Thymeleaf), Groovy, FreeMarker, Jade 등 (스프링에서 JSP 이용은 추천하지 않고 있음)
    4. Client 에게 **View** (동적 웹 페이지, HTML) 를 내려줌
    
    
    26) Controller 와 HTTP Request 메시지
    

Client 와 Server 간 Request, Response 는 HTTP 메시지 규약을 따름

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Arrays;
import java.util.List;

@RestController
@RequestMapping("/hello/rest")
public class HelloRestController {

@GetMapping("/json/string")
public String helloHtmlString() {
return "<html><body>Hello @ResponseBody</body></html>";
}
@GetMapping("/json/list")
public List<String> helloJson() {
List<String> words = Arrays.asList("Hello", "Controller", "And", "JSON");

return words;
}
}
  • 25) 스프링 MVC 동작원리 👉 @Controller 는 스프링 서버 개발자 입장에서는 시작점과 끝점으로 보이지만, 사실 스프링이 뒤에서 많은 부분을 보이지 않게 처리해 주고 있습니다.

1. Client → DispatcherServlet
    1. 가장 앞 단에서 요청을 받아 FrontController 라고도 불림
2. DispatcherServlet → Controller
    - API 를 처리해 줄 Controller 를 찾아 요청을 전달
    - Handler mapping 에는 API path 와 Controller 함수가 매칭되어 있음
    
    <aside>
    💡 [Sample]
    **GET /hello/html/dynamic** → `HomeController` 의 **helloHtmlFile() 함수**
    **GET /user/login** → `UserController` 의 **login() 함수**
    **GET /user/signup** → `UserController` 의 **signup() 함수**
    **POST /user/signup** → `UserController` 의 **registerUser() 함수**
    
    </aside>
    
    - 함수 이름을 내 마음대로 설정 가능했던 이유!!
    - Controller 에서 요청하는 Request 의 정보 ('**Model**') 전달
        
        ```java
        @Controller
        public class ItemSearchController {
        		@GetMapping("/api/search")
            @ResponseBody
            public List<ItemDto> getItems(**@RequestParam String query**) {
        			// ...
        		}
        }
        ```
        

1. **Controller** → DispathcerServlet
    1. Controller 가 Client 으로 받은 API 요청을 처리
    2. '**Model' 정보**와 '**View' 정보**를 DispatcherServlet  으로 전달
2. DispatcherServlet → Client
    1. ViewResolver 통해 View 에 Model 을 적용
    2. View 를  Client 에게 응답으로 전달
profile
#공부중 #협업 #소통중시 #백엔드개발자 #능동적 #워커홀릭 #스파르타코딩 #항해99 #미니튜터 #Nudge #ENTJ #브레인스토밍 #아이디어뱅크

0개의 댓글