IT/SpringBoot

스프링 부트 #4.27-4.30. 웹 소켓 등

blogood 2020. 6. 16. 21:54
반응형
더보기

4.27. 웹소켓

스프링 부트은 임베디드 톰캣, 부두 및 언더토우에 대한 웹소켓 자동 구성을 제공합니다. 독립 실행형 컨테이너에 전쟁 파일을 배포하는 경우 스프링 부트은 컨테이너가 WebSocket 지원 의 구성에 대한 책임이 있다고 가정합니다.

스프링 프레임워크는 모듈을 통해 쉽게 액세스할 수 있는 MVC 웹 애플리케이션에 대한 풍부한 WebSocket 지원을 제공합니다.spring-boot-starter-websocket

WebSocket 지원은 반응형 웹 응용 프로그램에도 사용할 수 있으며 다음과 함께 WebSocket API를 포함해야 합니다.spring-boot-starter-webflux

<dependency>
    <groupId>javax.websocket</groupId>
    <artifactId>javax.websocket-api</artifactId>
</dependency>

4.28. 웹 서비스

Spring Boot는 웹 서비스 자동 구성을 제공하므로 수행해야 할 일은 를 정의하는 것입니다.Endpoints

스프링 웹 서비스 기능은 모듈로 쉽게 액세스할 수 있습니다.spring-boot-starter-webservices

SimpleWsdl11Definition 그리고 콩은 각각 WSDL 및 XSD에 대해 자동으로 생성될 수 있습니다. 이렇게 하려면 다음 예제와 같이 해당 위치를 구성합니다.SimpleXsdSchema

spring.webservices.wsdl-locations=classpath:/wsdl

4.28.1. 웹서비스로 웹 서비스 호출

응용 프로그램에서 원격 웹 서비스를 호출해야 하는 경우 WebServiceTemplate 클래스를 사용할 수 있습니다. 인스턴스를 사용 하기 전에 사용자 지정 해야 하는 경우가 많기 때문에 스프링 부트은 단일 자동 구성 콩을 제공하지 않습니다. 그러나 필요할 때 인스턴스를 만드는 데 사용할 수 있는 을 자동으로 구성합니다.WebServiceTemplateWebServiceTemplateWebServiceTemplateBuilderWebServiceTemplate

다음 코드에는 일반적인 예제가 표시됩니다.

@Service
public class MyService {

    private final WebServiceTemplate webServiceTemplate;

    public MyService(WebServiceTemplateBuilder webServiceTemplateBuilder) {
        this.webServiceTemplate = webServiceTemplateBuilder.build();
    }

    public DetailsResp someWsCall(DetailsReq detailsReq) {
         return (DetailsResp) this.webServiceTemplate.marshalSendAndReceive(detailsReq, new SoapActionCallback(ACTION));
    }

}

기본적으로 클래스 경로에서 사용 가능한 HTTP 클라이언트 라이브러리를 사용하여 적합한 HTTP 기반을 검색합니다. 다음과 같이 읽기 및 연결 시간 시간을 사용자 지정할 수도 있습니다.WebServiceTemplateBuilderWebServiceMessageSender

@Bean
public WebServiceTemplate webServiceTemplate(WebServiceTemplateBuilder builder) {
    return builder.messageSenders(new HttpWebServiceMessageSenderBuilder()
            .setConnectTimeout(5000).setReadTimeout(2000).build()).build();
}

4.29. 자체 자동 구성 만들기

공유 라이브러리를 개발하는 회사에서 일하거나 오픈 소스 또는 상용 라이브러리에서 작업하는 경우 자체 자동 구성을 개발할 수 있습니다. 자동 구성 클래스는 외부 jar에 번들로 사용할 수 있으며 스프링 부트으로 계속 선택할 수 있습니다.

자동 구성은 자동 구성 코드뿐만 아니라 사용할 일반적인 라이브러리를 제공하는 "시작"에 연결할 수 있습니다. 먼저 자체 자동 구성을 빌드하는 데 필요한 사항을 다룹니다.

  데모 프로젝트를 사용하여 단계별로 스타터를 만드는 방법을 보여 드립니다.

4.29.1. 자동 구성 된 콩 이해

후드 아래에는 표준 클래스와 함께 자동 구성이 구현됩니다. 자동 구성이 적용될 때 추가 주석을 사용하여 제한합니다. 일반적으로 자동 구성 클래스는 사용 및 주석을 사용합니다. 이렇게 하면 관련 클래스가 발견된 경우에만 자동 구성이 적용되며 직접 선언하지 않은 경우에만 자동 구성이 적용됩니다.@Configuration@Conditional@ConditionalOnClass@ConditionalOnMissingBean@Configuration

스프링 부트 자동 구성의 소스 코드를 탐색하여 스프링이 제공하는 클래스를 볼 수 있습니다(META-INF/spring.factories 파일 참조). @Configuration

4.29.2. 자동 구성 후보 찾기

스프링 부트은 게시된 jar 내에 파일이 있는지 확인합니다. 파일은 다음 예제와 같이 키 아래에 구성 클래스를 나열해야 합니다.META-INF/spring.factoriesEnableAutoConfiguration

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.mycorp.libx.autoconfigure.LibXAutoConfiguration,\
com.mycorp.libx.autoconfigure.LibXWebAutoConfiguration
  자동 구성은 그런 식으로만로드되어야 합니다. 특정 패키지 공간에 정의되어 있고 구성 요소 검색의 대상이 되지 않는지 확인합니다. 또한 자동 구성 클래스는 구성 요소 스캐닝을 활성화하여 추가 구성 요소를 찾을 수 있도록 설정해서는 안 됩니다. 대신 특정 s를 사용해야 합니다. @Import

구성을 특정 순서로 적용해야 하는 경우 @AutoConfigureAfter 또는 주석을 @AutoConfigureBefore 사용할 수 있습니다. 예를 들어 웹 관련 구성을 제공하는 경우 다음을 적용해야 할 수 있습니다.WebMvcAutoConfiguration

서로에 대한 직접적인 지식이 없어야 하는 특정 자동 구성을 주문하려는 경우. 이 어그리뷰션은 일반 어김과 동일한 의미 체계를 가지고 있지만 자동 구성 클래스에 대한 전용 순서를 제공합니다.@AutoConfigureOrder@Order

4.29.3. 조건 주석

거의 항상 자동 구성 클래스에 하나 이상의 주석을 포함하려고 합니다. 이 별표는 개발자가 기본값에 만족하지 않는 경우 자동 구성을 재정의할 수 있도록 하는 데 사용되는 일반적인 예 중 하나입니다.@Conditional@ConditionalOnMissingBean

Spring Boot에는 클래스 또는 개별 메서드에 주석을 주석으로 하여 자신의 코드에서 다시 사용할 수 있는 여러 주석이 포함되어 있습니다. 이러한 주석은 다음과 같습니다.@Conditional@Configuration@Bean

클래스 조건

주석및주석은 특정 클래스의 유무에 따라 클래스를 포함할 수 있습니다. ASM을사용하여 별표 메타데이터를 구문 분석할 수 있기 때문에 해당 클래스가 실행 중인 응용 프로그램 클래스 경로에 실제로 나타나지 않더라도 특성을 사용하여 실제 클래스를 참조할 수 있습니다. 값을 사용하여 클래스 이름을 지정하려는 경우에도 특성을 사용할 수 있습니다.@ConditionalOnClass@ConditionalOnMissingClass@ConfigurationvaluenameString

이 메커니즘은 일반적으로 반환 형식이 조건의 대상인 메서드에 동일한 방식으로 적용되지 않습니다. 메서드의 조건이 적용되기 전에 JVM은 클래스를 로드하고 클래스가 없는 경우 실패할 수 있는 잠재적으로 처리된 메서드 참조를 로드합니다.@Bean

이 시나리오를 처리하려면 다음 예제와 같이 조건을 격리하는 데 별도의 클래스를 사용할 수 있습니다.@Configuration

@Configuration(proxyBeanMethods = false)
// Some conditions
public class MyAutoConfiguration {

    // Auto-configured beans

    @Configuration(proxyBeanMethods = false)
    @ConditionalOnClass(EmbeddedAcmeService.class)
    static class EmbeddedConfiguration {

        @Bean
        @ConditionalOnMissingBean
        public EmbeddedAcmeService embeddedAcmeService() { ... }

    }

}
  메타 주석의 일부로 자신의 주석을 작성하는 경우, 이러한 경우 클래스를 참조하는 것으로 사용해야 합니다. @ConditionalOnClass@ConditionalOnMissingClassname
콩 조건

주석은 특정 콩의 존재 또는 부재에 따라 콩을 포함할 수 있게 한다. 특성을 사용하여 빈을 유형별로 지정하거나 이름으로 콩을 지정할 수 있습니다. 특성을 사용하면 콩을 검색할 때 고려해야 할 계층 구조를 제한할 수 있습니다.@ConditionalOnBean@ConditionalOnMissingBeanvaluenamesearchApplicationContext

메서드에 배치하면 대상 형식은 다음 예제와 같이 메서드의 반환 유형으로 기본값입니다.@Bean

@Configuration(proxyBeanMethods = false)
public class MyAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public MyService myService() { ... }

}

앞의 예제에서 빈은 이미 에 포함되어 있지 않으면 콩이 생성될 것입니다.myServiceMyServiceApplicationContext

  이러한 조건은 지금까지 처리된 내용에 따라 평가되므로 콩 정의가 추가되는 순서에 대해 매우 주의해야 합니다. 이러한 이유로 자동 구성 클래스에 만 주석을 사용하는 것이 좋습니다(사용자 정의 bean 정의가 추가된 후에로드가 보장되므로). @ConditionalOnBean@ConditionalOnMissingBean
  @ConditionalOnBean 클래스가 만들어지지 않도록 하지 마십시오. 클래스 수준에서 이러한 조건을 사용하고 각 포함된 방법을 기고하는 것 중 유일한 차이점은 조건이 일치하지 않는 경우 전자가 콩으로 클래스등록을 방지한다는 것입니다. @ConditionalOnMissingBean@Configuration@Bean@Configuration
재산 조건

이 어플런스를 사용하면 스프링 환경 속성을 기반으로 구성을 포함할 수 있습니다. 및 특성을 사용하여 확인해야 하는 속성을 지정합니다. 기본적으로 존재하고 같지 않은 모든 속성이 일치합니다. 또한 및 특성을 사용하여 고급 검사를 만들 수도 있습니다.@ConditionalOnPropertyprefixnamefalsehavingValuematchIfMissing

리소스 조건

이 애니플런지에서는 특정 리소스가 있는 경우에만 구성을 포함할 수 있습니다. 리소스는 다음 예제와 같이 일반적인 스프링 규칙을 사용하여 지정할 수 있습니다.@ConditionalOnResourcefile:/home/user/test.dat

웹 응용 프로그램 조건

응용 프로그램이 "웹 응용 프로그램"인지 여부에 따라 구성을 포함할 수 있습니다. 서슬렛 기반 웹 응용 프로그램은 Spring을 사용하거나 범위를 정의하거나 . 반응형 웹 응용 프로그램은 .@ConditionalOnWebApplication@ConditionalOnNotWebApplicationWebApplicationContextsessionConfigurableWebEnvironmentReactiveWebApplicationContextConfigurableReactiveWebEnvironment

이 애니플런지를 사용하면 응용 프로그램이 컨테이너에 배포되는 기존 WAR 응용 프로그램인지 여부에 따라 구성을 포함할 수 있습니다. 이 조건은 임베디드 서버로 실행되는 응용 프로그램과 일치하지 않습니다.@ConditionalOnWarDeployment

스펠 식 조건

이 애니플런지에서는 SpEL 식의결과에 따라 구성을 포함할 수 있습니다.@ConditionalOnExpression

4.29.4. 자동 구성 테스트

자동 구성은 사용자 구성(정의 및 사용자 지정), 상태 평가(특정 라이브러리의 존재) 등의 여러 요인의 영향을 받을 수 있습니다. 구체적으로, 각 테스트는 이러한 사용자 정의의 조합을 나타내는 잘 정의 된 만들어야합니다. 이를 달성할 수 있는 좋은 방법을 제공합니다.@BeanEnvironmentApplicationContextApplicationContextRunner

ApplicationContextRunner 일반적으로 기본, 공통 구성을 수집하는 테스트 클래스의 필드로 정의됩니다. 다음 예제에서는 항상 호출되는 것을 확인합니다.UserServiceAutoConfiguration

private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
        .withConfiguration(AutoConfigurations.of(UserServiceAutoConfiguration.class));
  여러 자동 구성을 정의해야 하는 경우 응용 프로그램을 실행할 때와 동일한 순서로 호출되는 대로 선언을 주문할 필요가 없습니다.

각 테스트는 러너를 사용하여 특정 사용 사례를 나타낼 수 있습니다. 예를 들어 아래 샘플은 사용자 구성()을 호출하고 자동 구성이 제대로 해제되는지 확인합니다. 호출은 에서 사용할 수 있는 콜백 컨텍스트를 제공합니다.UserConfigurationrunAssert4J

@Test
void defaultServiceBacksOff() {
    this.contextRunner.withUserConfiguration(UserConfiguration.class).run((context) -> {
        assertThat(context).hasSingleBean(UserService.class);
        assertThat(context).getBean("myUserService").isSameAs(context.getBean(UserService.class));
    });
}

@Configuration(proxyBeanMethods = false)
static class UserConfiguration {

    @Bean
    UserService myUserService() {
        return new UserService("mine");
    }

}

다음 예제와 같이 쉽게 사용자 지정할 수도 있습니다.Environment

@Test
void serviceNameCanBeConfigured() {
    this.contextRunner.withPropertyValues("user.name=test123").run((context) -> {
        assertThat(context).hasSingleBean(UserService.class);
        assertThat(context.getBean(UserService.class).getName()).isEqualTo("test123");
    });
}

러너를 사용하여 .를 표시할 수도 있습니다. 보고서는 또는 수준에서 인쇄할 수 있습니다. 다음 예제에서는 자동 구성 테스트에서 보고서를 인쇄하는 방법을 보여 주습니다.ConditionEvaluationReportINFODEBUGConditionEvaluationReportLoggingListener

@Test
public void autoConfigTest {
    ConditionEvaluationReportLoggingListener initializer = new ConditionEvaluationReportLoggingListener(
            LogLevel.INFO);
    ApplicationContextRunner contextRunner = new ApplicationContextRunner()
            .withInitializer(initializer).run((context) -> {
                    // Do something...
            });
}
웹 컨텍스트 시뮬레이션

Servlet 또는 반응성 웹 응용 프로그램 컨텍스트에서만 작동하는 자동 구성을 테스트해야 하는 경우 각각 또는WebApplicationContextRunnerReactiveWebApplicationContextRunner

클래스 경로 재정의

또한 런타임에 특정 클래스 및/또는 패키지가 없을 때 어떤 일이 발생하는지 테스트할 수도 있습니다. 스프링 부트는 러너가 쉽게 사용할 수있는 선박. 다음 예제에서는 존재하지 않는 경우 자동 구성이 제대로 비활성화되지 않는다고 주장합니다.FilteredClassLoaderUserService

@Test
void serviceIsIgnoredIfLibraryIsNotPresent() {
    this.contextRunner.withClassLoader(new FilteredClassLoader(UserService.class))
            .run((context) -> assertThat(context).doesNotHaveBean("userService"));
}

4.29.5. 자신의 스타터 만들기

일반적인 Spring Boot 스타터에는 지정된 기술의 인프라를 자동으로 구성하고 사용자 지정하는 코드가 포함되어 있습니다. 쉽게 확장할 수 있도록 전용 네임스페이스의 여러 구성 키를 환경에 노출할 수 있습니다. 마지막으로 사용자가 가능한 한 쉽게 시작할 수 있도록 단일 "스타터" 종속성이 제공됩니다.

구체적으로 사용자 지정 스타터는 다음을 포함할 수 있습니다.

  • "acme"에 대한 자동 구성 코드가 포함된 모듈입니다.autoconfigure
  • 모듈에 종속성을 제공하는 모듈과 "acme" 및 일반적으로 유용한 추가 종속성이 있습니다. 간단히 말해서 스타터를 추가하면 해당 라이브러리 사용을 시작하는 데 필요한 모든 것이 제공되어야 합니다.starterautoconfigure

두 모듈의 이 분리는 전혀 필요하지 않습니다. "acme"에는 여러 가지 맛, 옵션 또는 선택적 기능이 있는 경우 일부 기능이 선택 사항이라는 사실을 명확하게 표현할 수 있으므로 자동 구성을 분리하는 것이 좋습니다. 게다가, 당신은 그 선택적 종속성에 대한 의견을 제공하는 스타터를 만들 수있는 능력을 가지고있다. 동시에 다른 사람들은 모듈에만 의존하여 다른 의견으로 자신의 스타터를 만들 수 있습니다.autoconfigure

자동 구성이 비교적 간단하고 선택적 기능이 없는 경우 시작 시 두 모듈을 병합하는 것은 확실히 옵션입니다.

명명

스타터에 적합한 네임스페이스를 제공해야 합니다. 다른 메이븐을 사용하는 경우에도 모듈 이름을 시작하지 마십시오. 우리는 당신이 미래에 자동 구성 한 것에 대한 공식 지원을 제공 할 수 있습니다.spring-bootgroupId

엄지 손가락의 규칙으로, 당신은 스타터 후 결합 된 모듈의 이름을해야합니다. 예를 들어 "acme"에 대한 스타터를 만들고 자동 구성 모듈과 시작의 이름을 지정한다고 가정합니다. 두 모듈을 결합하는 모듈이 하나만 있는 경우 이름을 지정합니다.acme-spring-bootacme-spring-boot-starteracme-spring-boot-starter

구성 키

스타터가 구성 키를 제공하는 경우 고유한 네임스페이스를 사용합니다. 특히 스프링 부트이 사용하는 네임스페이스(예: , 등 등)에는 키를 포함하지 마십시오. 동일한 네임스페이스를 사용하는 경우 모듈을 끊는 방식으로 향후 이러한 네임스페이스를 수정할 수 있습니다. 엄지 손가락의 규칙으로, 당신이 소유 하는 네임 스페이스와 모든 키접두다 (예:).servermanagementspringacme

다음 예제와 같이 각 속성에 대해 필드 자바도크를 추가하여 구성 키가 문서화되어 있는지 확인합니다.

@ConfigurationProperties("acme")
public class AcmeProperties {

    /**
     * Whether to check the location of acme resources.
     */
    private boolean checkLocation = true;

    /**
     * Timeout for establishing a connection to the acme server.
     */
    private Duration loginTimeout = Duration.ofSeconds(3);

    // getters & setters

}
  JSON에 추가되기 전에 처리되지 않으므로 필드 Javadoc에서 간단한 텍스트만 사용해야 합니다. @ConfigurationProperties

다음은 설명이 일관성이 있는지 확인하기 위해 내부적으로 따르는 몇 가지 규칙입니다.

  • "The" 또는 "A"로 설명을 시작하지 마십시오.
  • 형식의 경우 "여부" 또는 "사용"으로 설명을 시작합니다.boolean
  • 컬렉션 기반 형식의 경우 "쉼표 구분 목록"으로 설명을 시작합니다.
  • "기간 접미사를 지정하지 않으면 초가 사용됩니다"와 같은 밀리초와 다른 경우 기본 단위를 사용하지 말고 설명합니다.java.time.Durationlong
  • 런타임에 결정되지 않는 한 설명에서 기본 값을 제공하지 마십시오.

키에 IDE 지원을 사용할 수 있도록 메타 데이터 생성을 트리거해야 합니다. 생성된 메타데이터()를 검토하여 키가 제대로 문서화되었는지 확인할 수 있습니다. 호환되는 IDE에서 사용자 고유의 스타터를 사용하는 것도 메타데이터의 품질을 확인하는 것이 좋습니다.META-INF/spring-configuration-metadata.json

"자동 구성" 모듈

모듈에는 라이브러리를 시작하는 데 필요한 모든 것이 포함되어 있습니다. 구성 키 정의(예:) 및 구성 요소가 초기화되는 방식을 더 사용자 지정하는 데 사용할 수 있는 모든 콜백 인터페이스가 포함될 수도 있습니다.autoconfigure@ConfigurationProperties

  프로젝트에 모듈을 보다 쉽게 포함할 수 있도록 라이브러리에 종속성을 선택 사항으로 표시해야 합니다. 이렇게 하면 라이브러리가 제공되지 않으며 기본적으로 스프링 부트이 다시 시작됩니다. autoconfigure

Spring Boot는 어반기 처리기를 사용하여 메타데이터 파일()에서 자동 구성에 대한 조건을 수집합니다. 해당 파일이 있는 경우 일치하지 않는 자동 구성을 열렬히 필터링하여 시작 시간을 개선하는 데 사용됩니다. 자동 구성이 포함된 모듈에 다음 종속성을 추가하는 것이 좋습니다.META-INF/spring-autoconfigure-metadata.properties

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-autoconfigure-processor</artifactId>
    <optional>true</optional>
</dependency>

Gradle 4.5 이전을 사용하면 다음 예제와 같이 구성에서 종속성을 선언해야 합니다.compileOnly

dependencies {
    compileOnly "org.springframework.boot:spring-boot-autoconfigure-processor"
}

Gradle 4.6 이상에서는 다음 예제와 같이 종속성을 구성에서 선언해야 합니다.annotationProcessor

dependencies {
    annotationProcessor "org.springframework.boot:spring-boot-autoconfigure-processor"
}
스타터 모듈

스타터는 정말 빈 항아리입니다. 유일한 목적은 라이브러리와 함께 작업하는 데 필요한 종속성을 제공하는 것입니다. 당신은 시작하기 위해 필요한 것에 대한 의견보기로 생각할 수 있습니다.

스타터가 추가되는 프로젝트에 대해 가정하지 마십시오. 라이브러리를 자동으로 구성하는 경우 일반적으로 다른 스타터가 필요한 경우 라이브러리를 언급합니다. 라이브러리의 일반적인 사용에 불필요한 종속성을 포함하지 않도록 해야 하므로 선택적 종속성 수가 높은 경우 적절한 기본 종속성 집합을 제공하는 것이 어려울 수 있습니다. 즉, 선택적 종속성을 포함해서는 안 됩니다.

  어느 쪽이든, 스타터는 코어 스프링 부트 스타터 () 직간접적으로 참조해야합니다 (즉, 스타터가 다른 스타터에 의존하는 경우 추가 할 필요가 없음). 사용자 지정 스타터만으로 프로젝트가 만들어지면 스프링 부트의 핵심 기능은 코어 스타터의 존재에 의해 영광됩니다. spring-boot-starter

 

Spring Boot Reference Documentation

Phillip Webb, Dave Syer, Josh Long, Stéphane Nicoll, Rob Winch, Andy Wilkinson, Marcel Overdijk, Christian Dupuis, Sébastien Deleuze, Michael Simons, Vedran Pavić, Jay Bryant, Madhura Bhave, Eddú Meléndez, Scott Frederick

2.3.1.RELEASE

Copyright © 2012-2020

Copies of this document may be made for your own use and for distribution to others, provided that you do not charge any fee for such copies and further provided that each copy contains this Copyright Notice, whether distributed in print or electronically.

출처 : https://docs.spring.io/spring-boot/docs/2.3.1.RELEASE/reference/htmlsingle/#boot-features-websockets

반응형