1. 소개

HTTP / 2 ( RFC 7540 )의 일부인 서버 푸시 기술 을 사용하면 서버 측에서 사전에 클라이언트로 리소스를 보낼 수 있습니다. 이는 HTTP / 1.X 풀 기반 접근 방식의 주요 변경 사항입니다.

Spring 5가 제공하는 새로운 기능 중 하나는 Jakarta EE 8 Servlet 4.0 API와 함께 제공되는 서버 푸시 지원입니다. 이 기사에서는 서버 푸시를 사용하고이를 Spring MVC 컨트롤러와 통합하는 방법을 살펴 보겠습니다 .

2. Maven 의존성

사용할 의존성을 정의하는 것으로 시작하겠습니다.

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.8.RELEASE</version>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.0</version>
    <scope>provided</scope>
</dependency>

Spring-mvcservlet-api 의 최신 버전은 Maven Central에서 찾을 수 있습니다.

3. HTTP / 2 요구 사항

서버 푸시를 사용하려면 HTTP / 2 및 Servlet 4.0 API를 지원하는 컨테이너에서 애플리케이션실행 해야합니다 . 다양한 컨테이너의 구성 요구 사항은 Spring wiki 에서 찾을 수 있습니다 .

또한 클라이언트 측에서 HTTP / 2 지원필요합니다 . 물론 대부분의 최신 브라우저 는이 기능을 지원합니다.

4. PushBuilder 기능

PushBuilder의 인터페이스는 서버 푸시를 구현하기위한 책임이 있습니다. Spring MVC에서는 @RequestMapping 어노테이션이 달린 메소드의 인자로 PushBuilder주입 할 수 있습니다 .

이 시점 에서 클라이언트가 HTTP / 2를 지원하지 않는 경우 참조가 null 로 전송 된다는 점을 고려하는 것이 중요합니다 .

PushBuilder 인터페이스에서 제공하는 핵심 API는 다음과 같습니다 .

  • 경로 (문자열 경로) – 보낼 리소스를 나타냅니다.
  • push () – 리소스를 클라이언트로 보냅니다.
  • addHeader (문자열 이름, 문자열 값) – 푸시 된 리소스에 사용할 헤더를 나타냅니다.

5. 빠른 예

통합을 시연하기 위해 하나의 리소스 ( logo.png)가 있는 demo.jsp 페이지를 생성 합니다 .

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>PushBuilder demo</title>
</head>
<body>
    <span>PushBuilder demo</span>
    <br>
    <img src="<c:url value="/resources/logo.png"/>" alt="Logo" 
      height="126" width="411">
    <br>
    <!--Content-->
</body>
</html>

또한 PushController 컨트롤러를 사용 하여 두 개의 엔드 포인트를 노출 할 것입니다. 하나는 서버 푸시를 사용하고 다른 하나는 사용하지 않습니다.

@Controller
public class PushController {

    @GetMapping(path = "/demoWithPush")
    public String demoWithPush(PushBuilder pushBuilder) {
        if (null != pushBuilder) {
            pushBuilder.path("resources/logo.png").push();
        }
        return "demo";
    }

    @GetMapping(path = "/demoWithoutPush")
    public String demoWithoutPush() {
        return "demo";
    }
}

Chrome 개발 도구를 사용하여 두 엔드 포인트를 모두 호출하여 차이점을 확인할 수 있습니다.

demoWithoutPush 메서드를 호출하면 뷰와 리소스가 게시되고 풀 기술을 사용하여 클라이언트에서 사용됩니다.


demoWithPush 메서드를 호출하면 푸시 서버의 사용과 서버가 리소스를 미리 전달하여로드 시간을 줄이는 방법을 볼 수 있습니다.


서버 푸시 기술은 여러 시나리오에서 애플리케이션 페이지의로드 시간을 개선 할 수 있습니다. 즉, 지연 시간을 줄이더라도 제공하는 리소스 수에 따라 대역폭을 늘릴 수 있다는 점을 고려해야합니다.

이 기술을 Caching , Resource Minification 및 CDN과 같은 다른 전략과 결합 하고 애플리케이션에서 성능 테스트를 실행하여 서버 푸시를 사용하기위한 이상적인 엔드 포인트를 결정하는 것도 좋은 생각입니다.

6. 결론

이 빠른 예제에서 우리는 PushBuilder 인터페이스를 사용하여 Spring MVC에서 서버 푸시 기술을 사용하는 방법의 예를 보았고 그것을 사용할 때의로드 시간과 표준 풀 기술을 비교했습니다.

항상 그렇듯이 소스 코드는 GitHub에서 사용할 수 있습니다 .