2022년 04월 19일 TIL

Spring MVC

DispatcherServlet

  • Front Controller Pattern
    • DispatcherServlet = Front Controller
    • Controller에서 중복적으로 처리해야 하는 일들을 한곳(Front Controller)에서 처리한다.
  • 요청을 알맞은 컨트롤러에 위임한다.
  • 예외 처리

처리 흐름

  1. DispatcherServlet의 HTTP 요청 접수
  2. DispatcherServlet에서 Controller로 HTTP 요청 위임
  3. Controllerdml 모델 생성과 정보 등록
  4. Contorller의 결과 리턴: 모델과 뷰
  5. DispatcherServlet의 뷰 호출과 모델 참조
  6. HTTP 응답 반환

DispatcherServlet에서 controller로 요청 매핑

  • Controller = Handler
  • Handler Mapping
    • 어떤 Controller에게 요청을 위임할지 결정하는 전략
  • Handler Adapter
    • 매핑 대상 Controller에 request를 처리하도록 보낸다.
    • 다른 메소드와 포맷을 가진 컨트롤러를 DispatcherServlet에서 호출할 수 있도록 한다.
  • View Resolver
    • Controller에서 view를 return 했을경우 해당하는 view를 찾아 client에게 return 한다.

static resource 처리하기

resourceHandler

resourceHandler는 요청을 default servlet에게 위임하고 default servlet이 resource를 제공한다.

@EnableWebMvc

Spring MVC에서 필요한 Bean을 등록하기 위해 사용한다.

resourceChain()

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/resources/**")
            .addResourceLocations("/resources/")
            .setCachePeriod(60) 
            .resourceChain(true)
            .addResolver(new EncodedResourceResolver()); 
}
  • setCachePeriod()
    캐싱 설정

  • resourceChain(true)
    resourceResolver에 요청에 따른 자원 매핑 설정(기본 resolver는 pathResolver지만 chain을 사용하면 우선 순위 떨어짐)

    • .resourceChain(true).addResolver(new EncodedResourceResolver())
      gzip 파일을 우선적으로 탐색한다. 만약 파일이 있으면 제공하고 없으면 일반 파일 제공한다.

Thymeleaf

Controller

@GetMapping("/customers")
public String findCustomers(Model model) {
    var allCustomers = customerService.getAllCustomers();
    model.addAttribute("serverTime", LocalDateTime.now());
    model.addAttribute("customers", allCustomers);
    return "views/customers";
}

변수 식: ${변수}

<p th:text="'The time on the server is' + ${serverTime}">----</p>

링크 식: @{링크}

<img th:src="@{/resources/bg.png}" class="img-fluid">

선택 변수 식: *{~~}

<tr th:each="customer: ${customers}" th:object="${customer}" >
    <td th:text="${customer.customerId}"></td>
    <td th:text="*{name}"></td>
    <td th:text="*{email}"></td>
    <td th:text="*{createdAt}"></td>
    <td th:text="*{lastLoginAt}"></td>
</tr>

추가 정리)

servlet container

  • Web container
  • TOMCAT
  • 서블릿을 관리하는 곳

IOC Container

  • Spring Container
  • Bean Factory (Bean을 읽고 Bean을 생성)

ApplicationContext

  • BeanFactory + 추가 기능
  • IOC Container + 추가 기능(리소스 로딩)
  • ApplicationContext extends BeanFactory

좋은 웹페이지 즐겨찾기