diff --git a/build.gradle b/build.gradle index fffcc9c..094ed41 100644 --- a/build.gradle +++ b/build.gradle @@ -70,6 +70,10 @@ dependencies { implementation 'io.github.openfeign:feign-httpclient:12.4' implementation 'io.github.openfeign:feign-core:12.4' + // https://mvnrepository.com/artifact/org.apache.httpcomponents.client5/httpclient5 + implementation 'org.apache.httpcomponents.client5:httpclient5:5.2.1' + + // Amazon AWS Java SDK s3 And File implementation 'commons-io:commons-io:2.13.0' implementation('com.amazonaws:aws-java-sdk-s3:1.12.530') { diff --git a/src/main/java/HookKiller/server/common/service/TranslateService.java b/src/main/java/HookKiller/server/common/service/TranslateService.java index 4fb463d..d351b02 100644 --- a/src/main/java/HookKiller/server/common/service/TranslateService.java +++ b/src/main/java/HookKiller/server/common/service/TranslateService.java @@ -8,6 +8,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.http.*; import org.springframework.stereotype.Service; import org.springframework.util.LinkedMultiValueMap; @@ -25,6 +26,12 @@ public class TranslateService { private final PapagoProperties papagoProperties; private final ObjectMapper objectMapper; + @Qualifier("papagoTextTranslateTemplate") + private final RestTemplate textRestTemplate; + + @Qualifier("papagoHtmlTranslateTemplate") + private final RestTemplate htmlRestTemplate; + /** * @param source : 번역의 대상이 될 원래의 언어 종류 * @param target : 번역 후 결과물로 나올 언어 종류 @@ -32,8 +39,6 @@ public class TranslateService { * @return : html 형식의 번역이 된 String */ public String naverPapagoHtmlTranslate(LanguageType source, LanguageType target, String html) { - RestTemplate restTemplate = new RestTemplate(); - MultiValueMap papagoRequestBody = new LinkedMultiValueMap<>(); papagoRequestBody.add("source", source.getLanguageCode()); papagoRequestBody.add("target", target.getLanguageCode()); @@ -46,7 +51,7 @@ public String naverPapagoHtmlTranslate(LanguageType source, LanguageType target, HttpEntity> request = new HttpEntity<>(papagoRequestBody, papagoRequestHeaders); ResponseEntity response = - restTemplate.postForEntity(URI.create(papagoProperties.getHtmlRequestUrl()), request, String.class); + htmlRestTemplate.postForEntity(URI.create(papagoProperties.getHtmlRequestUrl()), request, String.class); if (response.getStatusCode().equals(HttpStatus.OK)) { log.info("result >>> {}", response.getBody()); return response.getBody(); @@ -55,7 +60,6 @@ public String naverPapagoHtmlTranslate(LanguageType source, LanguageType target, } public String naverPapagoTextTranslate(LanguageType source, LanguageType target, String content) { - RestTemplate restTemplate = new RestTemplate(); HttpHeaders papagoRequestHeaders = new HttpHeaders(); papagoRequestHeaders.setContentType(MediaType.APPLICATION_JSON); papagoProperties.getHeader().forEach(papagoRequestHeaders::set); @@ -69,7 +73,7 @@ public String naverPapagoTextTranslate(LanguageType source, LanguageType target, HttpEntity request = new HttpEntity<>(papagoRequestBody, papagoRequestHeaders); ResponseEntity response = - restTemplate.postForEntity(URI.create(papagoProperties.getTextRequestUrl()), request, PapagoTextResponse.class); + textRestTemplate.postForEntity(URI.create(papagoProperties.getTextRequestUrl()), request, PapagoTextResponse.class); if (response.getStatusCode().equals(HttpStatus.OK)) { log.info("result >>> {}", response.getBody().getMessage().getResult().toString()); diff --git a/src/main/java/HookKiller/server/common/util/HtmlTranslateRestTemplate.java b/src/main/java/HookKiller/server/common/util/HtmlTranslateRestTemplate.java new file mode 100644 index 0000000..6d3c52a --- /dev/null +++ b/src/main/java/HookKiller/server/common/util/HtmlTranslateRestTemplate.java @@ -0,0 +1,48 @@ +package HookKiller.server.common.util; + +import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; +import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; +import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager; +import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.web.client.RestTemplate; + +import java.time.Duration; + +@Configuration +public class HtmlTranslateRestTemplate { + + @Bean + @Qualifier("papagoHtmlTranslateTemplate") + public RestTemplate htmlTranslate() { + HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(); + factory.setHttpClient(this.httpClient()); + + RestTemplate restTemplate = new RestTemplateBuilder() + .setConnectTimeout(Duration.ofSeconds(5)) + .setReadTimeout(Duration.ofSeconds(20)) + .build(); + + restTemplate.setRequestFactory(factory); + + return restTemplate; + } + + private CloseableHttpClient httpClient() { + return HttpClientBuilder + .create() + .setConnectionManager(this.papagoHtmlHttpClient()) + .build(); + } + private PoolingHttpClientConnectionManager papagoHtmlHttpClient() { + return PoolingHttpClientConnectionManagerBuilder.create() + .setMaxConnTotal(50) + .setMaxConnPerRoute(5) + .build(); + } + +} diff --git a/src/main/java/HookKiller/server/common/util/TextTranslateRestTemplate.java b/src/main/java/HookKiller/server/common/util/TextTranslateRestTemplate.java new file mode 100644 index 0000000..694dbf9 --- /dev/null +++ b/src/main/java/HookKiller/server/common/util/TextTranslateRestTemplate.java @@ -0,0 +1,51 @@ +package HookKiller.server.common.util; + +import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; +import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; +import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager; +import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.web.client.RestTemplate; + +import java.time.Duration; + + +@Configuration +public class TextTranslateRestTemplate { + + @Bean + @Primary + @Qualifier("papagoTextTranslateTemplate") + public RestTemplate textTranslate() { + HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(); + factory.setHttpClient(this.httpClient()); + + RestTemplate restTemplate = new RestTemplateBuilder() + .setConnectTimeout(Duration.ofSeconds(5)) + .setReadTimeout(Duration.ofSeconds(5)) + .build(); + + restTemplate.setRequestFactory(factory); + + return restTemplate; + } + + private CloseableHttpClient httpClient() { + return HttpClientBuilder + .create() + .setConnectionManager(this.papagoTextHttpClient()) + .build(); + } + private PoolingHttpClientConnectionManager papagoTextHttpClient() { + return PoolingHttpClientConnectionManagerBuilder.create() + .setMaxConnTotal(20) + .setMaxConnPerRoute(5) + .build(); + } + +}