본문 바로가기

SPRING/SPRING BOOT V3.0.6 REFERENCE

[Spring Boot Reference V3.0.6] Spring Boot IO

반응형

대부분의 애플리케이션은 어느 시점에서 입력 및 출력 문제를 처리해야 합니다. Spring Boot는 IO 기능이 필요할 때 도움이 되는 다양한 기술과의 통합 및 유틸리티를 제공합니다. 이 섹션에서는 캐싱 및 유효성 검사와 같은 표준 IO 기능과 스케줄링 및 분산 트랜잭션과 같은 고급 항목을 다룹니다. 또한 원격 REST 또는 SOAP 서비스 호출 및 이메일 전송에 대해서도 다룹니다.

1. 캐싱

Spring Framework는 애플리케이션에 투명하게 캐싱을 추가하기 위한 지원을 제공합니다. 핵심적으로 추상화는 메서드에 캐싱을 적용하여 캐시에서 사용 가능한 정보를 기반으로 실행 횟수를 줄입니다. 캐싱 논리는 호출자에 대한 간섭 없이 투명하게 적용됩니다. 주석 을 사용하여 캐싱 지원이 활성화되어 있는 한 Spring Boot는 캐시 인프라를 자동 구성합니다 @EnableCaching.

  자세한 내용은 Spring Framework 참조의 관련 섹션을 확인하십시오 .

간단히 말해서 서비스 작업에 캐싱을 추가하려면 다음 예제와 같이 해당 메서드에 관련 주석을 추가합니다.

@Component
public class MyMathService {

    @Cacheable("piDecimals")
    public int computePiDecimal(int precision) {
        ...
    }

}
 

이 예는 잠재적으로 비용이 많이 드는 작업에서 캐싱을 사용하는 방법을 보여줍니다. 를 호출하기 전에 추상화는 인수와 일치하는 캐시 computePiDecimal항목을 찾습니다 . 항목이 발견되면 캐시의 콘텐츠가 호출자에게 즉시 반환되고 메서드가 호출되지 않습니다. 그렇지 않으면 메서드가 호출되고 값을 반환하기 전에 캐시가 업데이트됩니다.piDecimalsi

  표준 JSR-107(JCache) 주석(예: )을 투명하게 사용할 수도 있습니다 @CacheResult. 그러나 Spring Cache와 JCache 주석을 혼용하지 않는 것이 좋습니다.

특정 캐시 라이브러리를 추가하지 않으면 Spring Boot는 메모리에서 동시 맵을 사용하는 간단한 공급자를 자동 구성합니다 . 캐시가 필요한 경우(예: piDecimals앞의 예에서) 이 공급자가 캐시를 생성합니다. 단순 공급자는 프로덕션 용도로 권장되지는 않지만 시작하고 기능을 이해하는 데 유용합니다. 사용할 캐시 공급자에 대해 결정했으면 설명서를 읽고 응용 프로그램에서 사용하는 캐시를 구성하는 방법을 알아보세요. 거의 모든 공급자는 애플리케이션에서 사용하는 모든 캐시를 명시적으로 구성하도록 요구합니다. 일부는 속성에 의해 정의된 기본 캐시를 사용자 지정하는 방법을 제공합니다 spring.cache.cache-names.

  캐시에서 데이터를 투명하게 업데이트하거나 제거  수도 있습니다 .

1.1. 지원되는 캐시 공급자

캐시 추상화는 실제 저장소를 제공하지 않으며 org.springframework.cache.Cache및 org.springframework.cache.CacheManager인터페이스에 의해 구체화된 추상화에 의존합니다.

CacheManager유형 또는 CacheResolver명명된 bean을 정의하지 않은 경우 cacheResolver(참조 CachingConfigurer) Spring Boot는 다음 제공자를 감지하려고 시도합니다(표시된 순서대로).

  속성을 설정하여 특정 캐시 공급자를 강제 적용 할 수도 있습니다 spring.cache.type. 특정 환경(예: 테스트)에서 캐싱을 모두 비활성화 해야 하는 경우 이 속성을 사용합니다 .
  spring-boot-starter-cache기본 캐싱 종속성을 빠르게 추가하려면 "스타터"를 사용하십시오 . 스타터는 spring-context-support. 종속성을 수동으로 추가하는 경우 spring-context-supportJCache 또는 Caffeine 지원을 사용하려면 포함해야 합니다.

가 Spring Boot에 의해 자동 구성되는 경우 CacheManager인터페이스를 구현하는 bean을 노출하여 완전히 초기화되기 전에 구성을 추가로 조정할 수 있습니다 CacheManagerCustomizer. 다음 예제에서는 null값이 기본 맵으로 전달되지 않아야 함을 나타내는 플래그를 설정합니다.

@Configuration(proxyBeanMethods = false)
public class MyCacheManagerConfiguration {

    @Bean
    public CacheManagerCustomizer<ConcurrentMapCacheManager> cacheManagerCustomizer() {
        return (cacheManager) -> cacheManager.setAllowNullValues(false);
    }

}
 
  앞의 예에서 자동 구성이 ConcurrentMapCacheManager예상됩니다. 그렇지 않은 경우(자체 구성을 제공했거나 다른 캐시 공급자가 자동 ​​구성됨) 사용자 지정 프로그램이 전혀 호출되지 않습니다. 사용자 정의자는 원하는 만큼 보유할 수 있으며 @Order또는 를 사용하여 주문할 수도 있습니다 Ordered.

1.1.1. Generic

컨텍스트가 적어도 하나의 org.springframework.cache.CacheBean을 정의하는 경우 일반 캐싱이 사용됩니다. 해당 유형의 모든 Bean을 래핑 CacheManager하는 것이 작성됩니다.

1.1.2. JCache(JSR-107)

JCache는javax.cache.spi.CachingProvider 클래스 경로(즉, JSR-107 호환 캐싱 라이브러리가 클래스 경로에 있음) 의 존재를 통해 부트스트랩되며 "스타터" JCacheCacheManager에서 제공됩니다 . spring-boot-starter-cache다양한 호환 라이브러리를 사용할 수 있으며 Spring Boot는 Ehcache 3, Hazelcast 및 Infinispan에 대한 종속성 관리를 제공합니다. 다른 호환 라이브러리도 추가할 수 있습니다.

둘 이상의 공급자가 있을 수 있으며 이 경우 공급자를 명시적으로 지정해야 합니다. JSR-107 표준이 구성 파일의 위치를 ​​정의하는 표준화된 방법을 적용하지 않더라도 Spring Boot는 다음 예제와 같이 구현 세부 정보가 있는 캐시 설정을 수용하기 위해 최선을 다합니다.

# Only necessary if more than one provider is present
spring.cache.jcache.provider=com.example.MyCachingProvider
spring.cache.jcache.config=classpath:example.xml
 
  캐시 라이브러리가 기본 구현과 JSR-107 지원을 모두 제공하는 경우 Spring Boot는 JSR-107 지원을 선호하므로 다른 JSR-107 구현으로 전환해도 동일한 기능을 사용할 수 있습니다.
  Spring Boot는 Hazelcast를 일반적으로 지원 합니다 . 단일 항목을 사용할 수 있는 경우 속성을 지정 하지 않는 한 HazelcastInstance자동으로 재사용됩니다 . CacheManagerspring.cache.jcache.config

기본을 사용자 정의하는 두 가지 방법이 있습니다 javax.cache.cacheManager.

  • 속성을 설정하여 시작 시 캐시를 생성할 수 있습니다 spring.cache.cache-names. 사용자 지정 javax.cache.configuration.Configuration빈이 정의된 경우 이를 사용자 지정하는 데 사용됩니다.
  • org.springframework.boot.autoconfigure.cache.JCacheManagerCustomizerBean은 완전한 사용자 정의를 위해 참조로 호출됩니다 CacheManager.
  표준 빈이 정의되면 추상화가 기대하는 구현 javax.cache.CacheManager으로 자동으로 래핑됩니다 . org.springframework.cache.CacheManager추가 사용자 정의가 적용되지 않습니다.

1.1.3. Hazelcast

Spring Boot는 Hazelcast를 일반적으로 지원 합니다 . HazelcastInstancea가 자동 구성되고 클래스 경로에 있는 경우 com.hazelcast:hazelcast-spring자동으로 a로 래핑됩니다 CacheManager.

  Hazelcast는 JCache 호환 캐시 또는 Spring 호환 캐시로 사용할 수 있습니다 CacheManager. spring.cache.type로 설정하면 hazelcastSpring Boot는 기반 구현을 사용합니다 CacheManager. Hazelcast를 JCache 호환 캐시로 사용하려면 spring.cache.type로 설정하십시오 jcache. 여러 JCache 호환 캐시 공급자가 있고 Hazelcast를 강제로 사용하려면 JCache 공급자를 명시적으로 설정 해야 합니다 .

1.1.4. Infinispan

Infinispan 에는 기본 구성 파일 위치가 없으므로 명시적으로 지정해야 합니다. 그렇지 않으면 기본 부트스트랩이 사용됩니다.

spring.cache.infinispan.config=infinispan.xml
 

속성을 설정하여 시작 시 캐시를 생성할 수 있습니다 spring.cache.cache-names. 사용자 지정 ConfigurationBuilder빈이 정의된 경우 캐시를 사용자 지정하는 데 사용됩니다.

Spring Boot의 Jakarta EE 9 기준과 호환되려면 Infinispan의 -jakarta모듈을 사용해야 합니다. 변형이 있는 모든 모듈에 대해 -jakarta표준 모듈 대신 변형을 사용해야 합니다. 예를 들어 infinispan-core-jakartaand는 각각 and 대신 infinispan-commons-jakarta사용해야 합니다 .infinispan-coreinfinispan-commons

1.1.5. Couchbase

Spring Data Couchbase가 사용 가능하고 Couchbase가 구성되어 있으면 a가 CouchbaseCacheManager자동 구성됩니다. 속성을 설정하여 시작 시 추가 캐시를 생성할 수 있으며 속성 spring.cache.cache-names을 사용하여 캐시 기본값을 구성할 수 있습니다 spring.cache.couchbase.*. 예를 들어 다음 구성은 10분의 항목 만료cache1 로 생성 및 캐시합니다.cache2

spring.cache.cache-names=cache1,cache2
spring.cache.couchbase.expiration=10m
 

구성에 대한 더 많은 제어가 필요한 경우 CouchbaseCacheManagerBuilderCustomizerbean 등록을 고려하십시오. 다음 예는 cache1및 에 대한 특정 항목 만료를 구성하는 사용자 정의 프로그램을 보여줍니다 cache2.

@Configuration(proxyBeanMethods = false)
public class MyCouchbaseCacheManagerConfiguration {

    @Bean
    public CouchbaseCacheManagerBuilderCustomizer myCouchbaseCacheManagerBuilderCustomizer() {
        return (builder) -> builder
                .withCacheConfiguration("cache1", CouchbaseCacheConfiguration
                        .defaultCacheConfig().entryExpiry(Duration.ofSeconds(10)))
                .withCacheConfiguration("cache2", CouchbaseCacheConfiguration
                        .defaultCacheConfig().entryExpiry(Duration.ofMinutes(1)));

    }

}
 

1.1.6. 레디스

Redis 가 사용 가능하고 구성된 경우 a가 RedisCacheManager자동 구성됩니다. 속성을 설정하여 시작 시 추가 캐시를 생성할 수 있으며 속성 spring.cache.cache-names을 사용하여 캐시 기본값을 구성할 수 있습니다 spring.cache.redis.*. 예를 들어 다음 구성은 10분의 TTL(Time to Live )로 생성 cache1및 캐시합니다.cache2

spring.cache.cache-names=cache1,cache2
spring.cache.redis.time-to-live=10m
 
  기본적으로 두 개의 별도 캐시가 동일한 키를 사용하는 경우 Redis가 겹치는 키를 갖지 않고 유효하지 않은 값을 반환할 수 없도록 키 접두사가 추가됩니다. 자신만의 RedisCacheManager.
  RedisCacheConfiguration @Bean고유한 구성을 추가하여 기본 구성을 완전히 제어할 수 있습니다 . 이는 기본 직렬화 전략을 사용자 지정해야 하는 경우에 유용할 수 있습니다.

구성에 대한 더 많은 제어가 필요한 경우 RedisCacheManagerBuilderCustomizerbean 등록을 고려하십시오. 다음 예는 cache1및 에 대한 특정 TTL(Time to Live)을 구성하는 사용자 정의 프로그램을 보여줍니다 cache2.

@Configuration(proxyBeanMethods = false)
public class MyRedisCacheManagerConfiguration {

    @Bean
    public RedisCacheManagerBuilderCustomizer myRedisCacheManagerBuilderCustomizer() {
        return (builder) -> builder
                .withCacheConfiguration("cache1", RedisCacheConfiguration
                        .defaultCacheConfig().entryTtl(Duration.ofSeconds(10)))
                .withCacheConfiguration("cache2", RedisCacheConfiguration
                        .defaultCacheConfig().entryTtl(Duration.ofMinutes(1)));

    }

}
 

1.1.7. Caffeine

Caffeine은 Guava에 대한 지원을 대체하는 Guava 캐시의 Java 8 재작성입니다. 카페인이 있으면 a CaffeineCacheManager( spring-boot-starter-cache"스타터"에서 제공)가 자동으로 구성됩니다. 속성을 설정하여 시작 시 캐시를 생성할 수 spring.cache.cache-names있으며 다음 중 하나를 사용하여(표시된 순서대로) 사용자 지정할 수 있습니다.

  1. 다음에 의해 정의된 캐시 사양spring.cache.caffeine.spec
  2. 빈이 com.github.benmanes.caffeine.cache.CaffeineSpec정의됨
  3. 빈이 com.github.benmanes.caffeine.cache.Caffeine정의됨

예를 들어 다음 구성은 최대 크기가 500이고 TTL 이 10분인 생성cache1 및 캐시입니다.cache2

spring.cache.cache-names=cache1,cache2
spring.cache.caffeine.spec=maximumSize=500,expireAfterAccess=600s
 

빈이 com.github.benmanes.caffeine.cache.CacheLoader정의되면 자동으로 CaffeineCacheManager.  캐시 관리자가 관리하는 모든CacheLoader 캐시 와 연관될 것이므로 로 정의해야 합니다 . 자동 구성은 다른 일반 유형을 무시합니다.CacheLoader<Object, Object>

1.1.8. Cache2k

Cache2k 는 메모리 내 캐시입니다. Cache2k 스프링 통합이 있는 경우 a가 SpringCache2kCacheManager자동 구성됩니다.

속성을 설정하여 시작 시 캐시를 생성할 수 있습니다 spring.cache.cache-names. 캐시 기본값은 Cache2kBuilderCustomizerbean을 사용하여 사용자 정의할 수 있습니다. 다음 예는 만료 시간이 5분인 캐시 용량을 항목 200개로 구성하는 사용자 정의 프로그램을 보여줍니다.

@Configuration(proxyBeanMethods = false)
public class MyCache2kDefaultsConfiguration {

    @Bean
    public Cache2kBuilderCustomizer myCache2kDefaultsCustomizer() {
        return (builder) -> builder.entryCapacity(200)
                .expireAfterWrite(5, TimeUnit.MINUTES);
    }

}
 

1.1.9. Simple

다른 공급자를 찾을 수 없는 경우 ConcurrentHashMap캐시 저장소로 사용하는 간단한 구현이 구성됩니다. 애플리케이션에 캐싱 라이브러리가 없는 경우 기본값입니다. 기본적으로 캐시는 필요에 따라 생성되지만 속성을 설정하여 사용 가능한 캐시 목록을 제한할 수 있습니다 cache-names. cache1예를 들어 캐시 만 원하는 경우 속성을 다음과 같이 cache2설정합니다 .cache-names

spring.cache.cache-names=cache1,cache2
 

그렇게 하고 애플리케이션이 나열되지 않은 캐시를 사용하는 경우 캐시가 필요할 때 런타임에 실패하지만 시작 시에는 실패합니다. 이는 선언되지 않은 캐시를 사용하는 경우 "실제" 캐시 공급자가 작동하는 방식과 유사합니다.

1.1.10. None

가 구성에 있는 경우 @EnableCaching적절한 캐시 구성도 예상됩니다. none특정 환경에서 캐싱을 모두 비활성화해야 하는 경우 다음 예제와 같이 캐시 유형이 no-op 구현을 사용하도록 강제합니다 .

spring.cache.type=none
 

2. Hazelcast

Hazelcast 가 클래스 경로에 있고 적절한 구성이 발견되면 Spring Boot는 애플리케이션 HazelcastInstance에 주입할 수 있는 a를 자동 구성합니다.

Spring Boot는 먼저 다음 구성 옵션을 확인하여 클라이언트 생성을 시도합니다.

  • bean 의 존재 com.hazelcast.client.config.ClientConfig.
  • 속성 으로 정의된 구성 파일입니다 spring.hazelcast.config.
  • 시스템 속성 의 존재 hazelcast.client.config.
  • hazelcast-client.xml작업 디렉토리 또는 클래스 경로의 루트에 있습니다 .
  • 작업 디렉토리 또는 클래스 경로의 루트에 있는 A hazelcast-client.yaml(또는 ).hazelcast-client.yml

클라이언트를 생성할 수 없는 경우 Spring Boot는 임베디드 서버 구성을 시도합니다. bean 을 정의하면 com.hazelcast.config.ConfigSpring Boot는 이를 사용합니다. 구성이 인스턴스 이름을 정의하는 경우 Spring Boot는 새 인스턴스를 생성하는 대신 기존 인스턴스를 찾으려고 시도합니다.

다음 예제와 같이 구성을 통해 사용할 Hazelcast 구성 파일을 지정할 수도 있습니다.

spring.hazelcast.config=classpath:config/my-hazelcast.xml
 

그렇지 않으면 Spring Boot는 기본 위치에서 Hazelcast 구성을 찾으려고 시도합니다. hazelcast.xml작업 디렉토리 또는 클래스 경로의 루트 또는 동일한 위치의 .yaml/ 상대. .yml시스템 속성이 설정되어 있는지도 확인합니다 hazelcast.config. 자세한 내용은 헤이즐캐스트 문서를 참조하십시오 .

  기본적으로 @SpringAwareHazelcast 구성 요소가 지원됩니다. 0 보다 큰 bean을 선언 ManagementContext하여 무시할 수 있습니다 . HazelcastConfigCustomizer@Order
  Spring Boot는 또한 Hazelcast에 대한 명시적인 캐싱 지원을 제공합니다 . 캐싱이 활성화된 경우 구현 HazelcastInstance에 자동으로 래핑됩니다 CacheManager.

3. Quartz Scheduler

Spring Boot는 "Starter" 를 포함하여 Quartz 스케줄러spring-boot-starter-quartz 작업을 위한 몇 가지 편리한 기능을 제공합니다 . Quartz를 사용할 수 있는 경우 a는 Scheduler자동 구성됩니다( SchedulerFactoryBean추상화를 통해).

다음 유형의 Bean이 자동으로 선택되어 다음과 연결됩니다 Scheduler.

  • JobDetail: 특정 작업을 정의합니다. JobDetail인스턴스는 API로 구축할 수 있습니다 JobBuilder.
  • Calendar.
  • Trigger: 특정 작업이 트리거되는 시기를 정의합니다.

기본적으로 인 메모리가 JobStore사용됩니다. 그러나 다음 예제와 같이 DataSource응용 프로그램에서 빈을 사용할 수 있고 그에 따라 속성이 구성된 경우 JDBC 기반 저장소를 구성할 수 있습니다 .spring.quartz.job-store-type

spring.quartz.job-store-type=jdbc
 

JDBC 저장소를 사용하는 경우 다음 예제와 같이 시작 시 스키마를 초기화할 수 있습니다.

spring.quartz.jdbc.initialize-schema=always
 
  기본적으로 데이터베이스는 Quartz 라이브러리와 함께 제공되는 표준 스크립트를 사용하여 감지되고 초기화됩니다. 이 스크립트는 기존 테이블을 삭제하고 다시 시작할 때마다 모든 트리거를 삭제합니다. 속성 을 설정하여 사용자 지정 스크립트를 제공할 수도 있습니다 spring.quartz.jdbc.schema.

DataSourceQuartz가 애플리케이션의 main 이외의 다른 것을 사용하게 하려면 bean을 DataSource선언 하고 메서드에 . 이렇게 하면 Quartz 특정이 스키마 초기화를 위해 및 모두에서 사용됩니다 . 유사하게, Quartz가 애플리케이션의 메인이 아닌 다른 것을 사용하게 하려면 bean을 선언 하고 메소드에 .DataSource@Bean@QuartzDataSourceDataSourceSchedulerFactoryBeanTransactionManagerTransactionManagerTransactionManager@Bean@QuartzTransactionManager

기본적으로 구성에 의해 생성된 작업은 영구 작업 저장소에서 읽은 이미 등록된 작업을 덮어쓰지 않습니다. 기존 작업 정의 덮어쓰기를 활성화하려면 spring.quartz.overwrite-existing-jobs속성을 설정합니다.

spring.quartzQuartz 스케줄러 구성은 프로그래밍 방식의 사용자 지정을 허용하는 속성 및 SchedulerFactoryBeanCustomizer빈을 사용하여 사용자 지정할 수 있습니다 SchedulerFactoryBean. 고급 Quartz 구성 속성은 를 사용하여 사용자 지정할 수 있습니다 spring.quartz.properties.*.

  특히, ExecutorQuartz는 를 통해 스케줄러를 구성하는 방법을 제공하므로 Bean은 스케줄러와 연관되지 않습니다 spring.quartz.properties. 작업 실행기를 사용자 정의해야 하는 경우 구현을 고려하십시오 SchedulerFactoryBeanCustomizer.

작업은 데이터 맵 속성을 주입하기 위해 setter를 정의할 수 있습니다. 다음 예제와 같이 일반 빈도 비슷한 방식으로 주입할 수 있습니다.

public class MySampleJob extends QuartzJobBean {

    // fields ...

    // Inject "MyService" bean
    public void setMyService(MyService myService) {
        this.myService = myService;
    }

    // Inject the "name" job data property
    public void setName(String name) {
        this.name = name;
    }

    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        this.myService.someMethod(context.getFireTime(), this.name);
    }

}
 

4. 이메일 보내기

Spring Framework는 인터페이스를 사용하여 이메일을 보내기 위한 추상화를 제공 JavaMailSender하고 Spring Boot는 이를 위한 자동 구성과 스타터 모듈을 제공합니다.

  사용 방법에 대한 자세한 설명은 참조 문서를 참조하십시오 JavaMailSender.

spring.mail.host관련 라이브러리( 에서 정의한 대로 )를 사용할 수 있는 경우 없는 경우 spring-boot-starter-mail기본값이 JavaMailSender생성됩니다. 보낸 사람은 네임스페이스의 구성 항목으로 추가로 사용자 지정할 수 있습니다 spring.mail. MailProperties자세한 내용은 참조하십시오 .

특히 특정 기본 시간 초과 값은 무한하며 다음 예와 같이 응답하지 않는 메일 서버에 의해 스레드가 차단되는 것을 방지하기 위해 이를 변경할 수 있습니다.

spring.mail.properties[mail.smtp.connectiontimeout]=5000
spring.mail.properties[mail.smtp.timeout]=3000
spring.mail.properties[mail.smtp.writetimeout]=5000
 

JavaMailSenderJNDI에서 기존으로 구성하는 것도 가능합니다 Session.

spring.mail.jndi-name=mail/Session
 

a가 jndi-name설정되면 다른 모든 세션 관련 설정보다 우선합니다.

5. 검증

Bean Validation 1.1에서 지원하는 메서드 유효성 검사 기능은 JSR-303 구현(예: Hibernate 유효성 검사기)이 클래스 경로에 있는 한 자동으로 활성화됩니다. jakarta.validation이를 통해 매개변수 및/또는 반환 값에 대한 제약 조건 으로 bean 메서드에 주석을 달 수 있습니다 . @Validated이러한 주석이 달린 메서드가 있는 대상 클래스 는 해당 메서드가 인라인 제약 조건 주석을 검색할 수 있도록 유형 수준에서 주석 으로 주석을 추가해야 합니다 .

예를 들어 다음 서비스는 첫 번째 인수의 유효성 검사를 트리거하여 크기가 8에서 10 사이인지 확인합니다.

@Service
@Validated
public class MyBean {

    public Archive findByCodeAndAuthor(@Size(min = 8, max = 10) String code, Author author) {
        return ...
    }

}
 

응용 프로그램은 제약 조건 메시지에서 MessageSource확인할 때 사용됩니다 . 이를 통해 Bean 유효성 검증 메시지에 애플리케이션 파일을{parameters} 사용할 수 있습니다 . 매개변수가 해결되면 Bean Validation의 기본 보간기를 사용하여 메시지 보간이 완료됩니다.messages.properties

Configuration를 빌드하는 데 사용되는 을 사용자 정의하려면 bean을 ValidatorFactory정의하십시오 ValidationConfigurationCustomizer. 여러 사용자 정의 Bean이 정의되면 @Order주석 또는 Ordered구현에 따라 순서대로 호출됩니다.

6. REST 서비스 호출

애플리케이션이 원격 REST 서비스를 호출하는 경우 Spring Boot는 a RestTemplate또는 WebClient.

6.1. RestTemplate

애플리케이션에서 원격 REST 서비스를 호출해야 하는 경우 Spring Framework의 RestTemplate클래스를 사용할 수 있습니다. RestTemplate인스턴스를 사용하기 전에 사용자 정의해야 하는 경우가 많기 때문에 Spring Boot는 단일 자동 구성 RestTemplate빈을 제공하지 않습니다. 그러나 필요할 때 인스턴스를 RestTemplateBuilder만드는 데 사용할 수 있는 a 를 자동 구성합니다. RestTemplate자동 구성은 인스턴스에 RestTemplateBuilder현명한 HttpMessageConverters적용을 보장합니다 RestTemplate.

다음 코드는 일반적인 예를 보여줍니다.

@Service
public class MyService {

    private final RestTemplate restTemplate;

    public MyService(RestTemplateBuilder restTemplateBuilder) {
        this.restTemplate = restTemplateBuilder.build();
    }

    public Details someRestCall(String name) {
        return this.restTemplate.getForObject("/{name}/details", Details.class, name);
    }

}
 
  RestTemplateBuilder에는 를 빠르게 구성하는 데 사용할 수 있는 여러 가지 유용한 방법이 포함되어 있습니다 RestTemplate. 예를 들어 BASIC 인증 지원을 추가하려면 builder.basicAuthentication("user", "password").build().

6.1.1. RestTemplate 커스터마이징

RestTemplate사용자 지정을 적용하려는 범위에 따라 사용자 지정 에 대한 세 가지 주요 접근 방식이 있습니다 .

사용자 지정 범위를 최대한 좁히려면 자동 구성을 삽입한 RestTemplateBuilder다음 필요에 따라 해당 메서드를 호출합니다. 각 메서드 호출은 새 RestTemplateBuilder인스턴스를 반환하므로 사용자 지정은 이 빌더 사용에만 영향을 미칩니다.

응용 프로그램 전체에 부가적인 사용자 정의를 수행하려면 RestTemplateCustomizerbean을 사용하십시오. 이러한 모든 bean은 자동 구성에 자동으로 등록되고 RestTemplateBuilder함께 빌드된 모든 템플릿에 적용됩니다.

다음 예는 다음을 제외한 모든 호스트에 대해 프록시 사용을 구성하는 사용자 정의 프로그램을 보여줍니다 192.168.0.5.

public class MyRestTemplateCustomizer implements RestTemplateCustomizer {

    @Override
    public void customize(RestTemplate restTemplate) {
        HttpRoutePlanner routePlanner = new CustomRoutePlanner(new HttpHost("proxy.example.com"));
        HttpClient httpClient = HttpClientBuilder.create().setRoutePlanner(routePlanner).build();
        restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory(httpClient));
    }

    static class CustomRoutePlanner extends DefaultProxyRoutePlanner {

        CustomRoutePlanner(HttpHost proxy) {
            super(proxy);
        }

        @Override
        protected HttpHost determineProxy(HttpHost target, HttpContext context) throws HttpException {
            if (target.getHostName().equals("192.168.0.5")) {
                return null;
            }
            return super.determineProxy(target, context);
        }

    }

}
 

마지막으로 자신만의 RestTemplateBuilder빈을 정의할 수 있습니다. 이렇게 하면 자동 구성된 빌더가 대체됩니다. 빈을 사용자 정의 빌더에 적용 하려면 RestTemplateCustomizer자동 구성이 수행된 것처럼 RestTemplateBuilderConfigurer. 다음 예제는 RestTemplateBuilder사용자 지정 연결 및 읽기 제한 시간도 지정된 것을 제외하고 Spring Boot의 자동 구성이 수행했을 것과 일치하는 를 노출합니다.

@Configuration(proxyBeanMethods = false)
public class MyRestTemplateBuilderConfiguration {

    @Bean
    public RestTemplateBuilder restTemplateBuilder(RestTemplateBuilderConfigurer configurer) {
        return configurer.configure(new RestTemplateBuilder())
            .setConnectTimeout(Duration.ofSeconds(5))
            .setReadTimeout(Duration.ofSeconds(2));
    }

}
 

가장 극단적인(거의 사용되지 않는) 옵션은 RestTemplateBuilder구성자를 사용하지 않고 고유한 bean을 생성하는 것입니다. 자동 구성된 빌더를 교체하는 것 외에도 RestTemplateCustomizerBean이 사용되는 것을 방지합니다.

6.2. 웹클라이언트

클래스 경로에 Spring WebFlux가 있는 경우 WebClient원격 REST 서비스를 호출하는 데 사용하도록 선택할 수도 있습니다. 에 비해 RestTemplate이 클라이언트는 더 기능적인 느낌을 가지고 있으며 완전히 반응합니다. Spring Framework 문서의WebClient 전용 섹션에서 자세히 알아볼 수 있습니다 .

Spring Boot는 자동으로 생성하고 미리 구성합니다 WebClient.Builder. 구성 요소에 주입하고 인스턴스를 만드는 데 사용하는 것이 좋습니다 WebClient. Spring Boot는 HTTP 리소스를 공유하고 서버와 동일한 방식으로 코덱 설정을 반영하도록 해당 빌더를 구성하고 있습니다( WebFlux HTTP 코덱 자동 구성 참조 ).

다음 코드는 일반적인 예를 보여줍니다.

@Service
public class MyService {

    private final WebClient webClient;

    public MyService(WebClient.Builder webClientBuilder) {
        this.webClient = webClientBuilder.baseUrl("https://example.org").build();
    }

    public Mono<Details> someRestCall(String name) {
        return this.webClient.get().uri("/{name}/details", name).retrieve().bodyToMono(Details.class);
    }

}
 

6.2.1. 웹클라이언트 런타임

Spring Boot는 애플리케이션 클래스 경로에서 사용 가능한 라이브러리에 따라 ClientHttpConnector드라이브에 사용할 것을 자동으로 감지합니다 . WebClient현재로서는 Reactor Netty, Jetty ReactiveStream 클라이언트, Apache HttpClient 및 JDK의 HttpClient가 지원됩니다.

스타터 는 기본적으로 서버 및 클라이언트 구현을 모두 가져오는 spring-boot-starter-webflux에 의존합니다 . io.projectreactor.netty:reactor-netty대신 Jetty를 반응형 서버로 사용하기로 선택한 경우 Jetty 반응형 HTTP 클라이언트 라이브러리에 대한 종속성을 추가해야 합니다 org.eclipse.jetty:jetty-reactive-httpclient. 서버와 클라이언트에 동일한 기술을 사용하면 클라이언트와 서버 간에 HTTP 리소스를 자동으로 공유하므로 이점이 있습니다.

ReactorResourceFactory개발자는 사용자 지정 또는 bean 을 제공하여 Jetty 및 Reactor Netty에 대한 리소스 구성을 재정의할 수 있습니다 JettyResourceFactory. 이는 클라이언트와 서버 모두에 적용됩니다.

클라이언트에 대한 해당 선택을 재정의하려는 경우 자신의 ClientHttpConnector빈을 정의하고 클라이언트 구성을 완전히 제어할 수 있습니다.

WebClientSpring Framework 참조 문서에서 구성 옵션 에 대해 자세히 알아볼 수 있습니다 .

6.2.2. 웹클라이언트 사용자 지정

WebClient사용자 지정을 적용하려는 범위에 따라 사용자 지정 에 대한 세 가지 주요 접근 방식이 있습니다 .

사용자 지정 범위를 최대한 좁히려면 자동 구성을 삽입한 WebClient.Builder다음 필요에 따라 해당 메서드를 호출합니다. WebClient.Builderinstance are stateful: 빌더에 대한 모든 변경 사항은 이후 생성된 모든 클라이언트에 반영됩니다. 동일한 빌더로 여러 클라이언트를 생성하려는 경우 WebClient.Builder other = builder.clone();.

모든 인스턴스에 대한 응용 프로그램 전체의 추가 사용자 정의를 수행하려면 빈을 선언하고 주입 시점에서 로컬로 변경할 WebClient.Builder수 있습니다 .WebClientCustomizerWebClient.Builder

마지막으로 원래 API로 폴백하고 WebClient.create(). 이 경우 자동 구성이 WebClientCustomizer적용되지 않습니다.

7. 웹 서비스

Spring Boot는 웹 서비스 자동 구성을 제공하므로 Endpoints.

Spring Web Services 기능은 모듈을 사용하여 쉽게 액세스할 수 있습니다 spring-boot-starter-webservices.

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

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

7.1. WebServiceTemplate으로 웹 서비스 호출

애플리케이션에서 원격 웹 서비스를 호출해야 하는 경우 클래스를 사용할 수 있습니다 WebServiceTemplate. WebServiceTemplate인스턴스를 사용하기 전에 사용자 정의해야 하는 경우가 많기 때문에 Spring Boot는 단일 자동 구성 WebServiceTemplate빈을 제공하지 않습니다. 그러나 필요할 때 인스턴스를 WebServiceTemplateBuilder만드는 데 사용할 수 있는 a 를 자동 구성합니다.WebServiceTemplate

다음 코드는 일반적인 예를 보여줍니다.

@Service
public class MyService {

    private final WebServiceTemplate webServiceTemplate;

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

    public SomeResponse someWsCall(SomeRequest detailsReq) {
        return (SomeResponse) this.webServiceTemplate.marshalSendAndReceive(detailsReq,
                new SoapActionCallback("https://ws.example.com/action"));
    }

}
 

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

@Configuration(proxyBeanMethods = false)
public class MyWebServiceTemplateConfiguration {

    @Bean
    public WebServiceTemplate webServiceTemplate(WebServiceTemplateBuilder builder) {
        WebServiceMessageSender sender = new HttpWebServiceMessageSenderBuilder()
                .setConnectTimeout(Duration.ofSeconds(5))
                .setReadTimeout(Duration.ofSeconds(2))
                .build();
        return builder.messageSenders(sender).build();
    }

}
 

8. JTA와의 분산 트랜잭션

Spring Boot는 JNDI에서 검색된 트랜잭션 관리자를 사용하여 여러 XA 리소스에서 분산 JTA 트랜잭션을 지원합니다.

JTA 환경이 감지되면 Spring을 JtaTransactionManager사용하여 트랜잭션을 관리합니다. 자동 구성된 JMS, DataSource 및 JPA Bean은 XA 트랜잭션을 지원하도록 업그레이드되었습니다. 와 같은 표준 Spring 관용구를 사용하여 @Transactional분산 트랜잭션에 참여할 수 있습니다. JTA 환경에 있고 여전히 로컬 트랜잭션을 사용하려는 경우 속성을 spring.jta.enabled로 설정하여 falseJTA 자동 구성을 비활성화할 수 있습니다.

8.1. Jakarta EE 관리 트랜잭션 관리자 사용

Spring Boot 애플리케이션을 waror ear파일로 패키징하고 Jakarta EE 애플리케이션 서버에 배포하는 경우 애플리케이션 서버의 기본 제공 트랜잭션 관리자를 사용할 수 있습니다. java:comp/UserTransactionSpring Boot는 일반적인 JNDI 위치( , java:comp/TransactionManager등) 를 확인하여 트랜잭션 관리자를 자동 구성하려고 시도합니다 . 애플리케이션 서버에서 제공하는 트랜잭션 서비스를 사용할 때 일반적으로 모든 자원이 서버에서 관리되고 JNDI를 통해 노출되는지 확인하려고 합니다. ConnectionFactorySpring Boot는 JNDI 경로( java:/JmsXA또는 )에서 a를 찾아 JMS를 자동 구성하려고 시도하며 속성을 사용 java:/XAConnectionFactory하여 .spring.datasource.jndi-nameDataSource

8.2. XA 및 비XA JMS 연결 혼합

JTA를 사용할 때 기본 JMS ConnectionFactoryBean은 XA를 인식하고 분산 트랜잭션에 참여합니다. 다음을 사용할 필요 없이 빈에 주입할 수 있습니다 @Qualifier.

public MyBean(ConnectionFactory connectionFactory) {
    // ...
}
 

경우에 따라 비 XA를 사용하여 특정 JMS 메시지를 처리할 수 있습니다 ConnectionFactory. 예를 들어 JMS 처리 논리는 XA 제한 시간보다 오래 걸릴 수 있습니다.

비 XA를 사용하려면 빈을 사용할 ConnectionFactory수 있습니다 nonXaJmsConnectionFactory.

public MyBean(@Qualifier("nonXaJmsConnectionFactory") ConnectionFactory connectionFactory) {
    // ...
}
 

일관성을 위해 jmsConnectionFactorybean 별칭을 사용하여 bean도 제공됩니다 xaJmsConnectionFactory.

public MyBean(@Qualifier("xaJmsConnectionFactory") ConnectionFactory connectionFactory) {
    // ...
}
 

8.3. Embedded Transaction Manager 지원

XAConnectionFactoryWrapper 인터페이스 XADataSourceWrapper는 포함된 트랜잭션 관리자를 지원하는 데 사용할 수 있습니다. XAConnectionFactory인터페이스는 포장 및 빈을 담당 XADataSource하고 일반 ConnectionFactory및 DataSource빈으로 노출하여 분산 트랜잭션에 투명하게 등록합니다. DataSource 및 JMS 자동 구성은 JtaTransactionManagerbean 및 적절한 XA 래퍼 bean이 ApplicationContext.

9. 다음에 읽을 내용

이제 Spring Boot의 핵심 기능 과 Spring Boot가 자동 구성을 통해 지원하는 다양한 기술에 대해 잘 이해하셨을 것입니다 .

다음 몇 섹션에서는 클라우드 플랫폼에 애플리케이션을 배포하는 방법에 대해 자세히 설명합니다. 다음 섹션에서 컨테이너 이미지 빌드 에 대해 읽거나 프로덕션 준비 기능 섹션으로 건너뛸 수 있습니다 .

 

출처

https://docs.spring.io/spring-boot/docs/current/reference/html/io.html

반응형