FeginClient 어노테이션을 추가하고, yml 파일에 추가한 설정값으로 Timeout을 테스트한 결과입니다.

 

송신 서버는 아래 java 코드와 같이 단순 호출만 하고, 시간을 체크합니다.

수신 서버는 Thread.sleep(1000 * 120); 과 같이 매우 긴 시간을 대기하게 설정했습니다.

 

- Controller Class

import com.test.project.feign.client.TestClient;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@RestController
@RequiredArgsConstructor
public class TestController {
        private final TestClient testClient;

        @PostMapping("/test")
        public ResponseEntity<?> zxc() throws InterruptedException {

            long startTime = System.currentTimeMillis();

            try {
                testClient.test();
            } catch (Exception e) {
                e.printStackTrace();
            }

            long timeTaken = System.currentTimeMillis() - startTime;
            System.err.println("################## 걸린 시간 : " + timeTaken);

            return ResponseEntity.ok().build();
        }
}

- Feign Interface

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient(name = "test", url = "http://localhost:28010", path = "/test")
public interface TestClient {

    @GetMapping(value = "/do")
    void test();
}

 

테스트 결과 Timeout에 영향을 받는 yml 설정은 다음 2가지가 있습니다.

 

feign.client.config

feign:
  hystrix:
    # true 값 설정시 hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds 설정과 비교하여 짧은 값이 적용됨
    # feign.client.config.default.readTimeout 기본값 : 60_000
    # hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds 기본값 : 1_000
    enabled: false
  client:
    config:
      # FeignClient의 name값으로 타겟팅 가능
      default: # 기본값
        loggerLevel: BASIC
        connectTimeout: 5000	# 3 Way Handshake가 5초가 넘는다면 수신 서버와의 통신 자체에 문제가 있는것.
        readTimeout: 5000	# 수신 서버의 처리시간을 고려하여 설정
      test: # FeignClient의 name이 test인 인터페이스
        loggerLevel: BASIC
        connectTimeout: 5000
        readTimeout: 5000

hystrix

feign:
  hystrix:
    # true 값 설정시 hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds 설정과 비교하여 짧은 값이 적용됨
    # feign.client.config.default.readTimeout 기본값 : 60_000
    # hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds 기본값 : 1_000
    enabled: true

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 5000

테스트 케이스

Case 1.

  feign.hystrix.enabled=false

  feign.client.config.default.connectTimeout=5000

  feign.client.config.default.readTimeout=15000

  hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=5000

 

실행 로그

feign.RetryableException: Read timed out executing GET http://localhost:22222/test/do
	at feign.FeignException.errorExecuting(FeignException.java:213)
	...
Caused by: java.net.SocketTimeoutException: Read timed out
	at java.base/java.net.SocketInputStream.socketRead0(Native Method)
	...
################## 걸린 시간 : 15024

 

Case 2.

  feign.hystrix.enabled=false

  feign.client.config.default.connectTimeout=5000

  feign.client.config.default.readTimeout=5000

  hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=15000

 

실행 로그

feign.RetryableException: Read timed out executing GET http://localhost:22222/test/do
	at feign.FeignException.errorExecuting(FeignException.java:213)
	...
Caused by: java.net.SocketTimeoutException: Read timed out
	at java.base/java.net.SocketInputStream.socketRead0(Native Method)
	...
################## 걸린 시간 : 5029

 

Case 3.

  feign.hystrix.enabled=true

  feign.client.config.default.connectTimeout=5000

  feign.client.config.default.readTimeout=15000

  hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=5000

 

실행 로그

com.netflix.hystrix.exception.HystrixRuntimeException: TestClient#test() failed and no fallback available.
	at com.netflix.hystrix.AbstractCommand$22.call(AbstractCommand.java:822)
    ...
feign.RetryableException: Read timed out executing GET http://localhost:22222/test/do
	at feign.FeignException.errorExecuting(FeignException.java:213)
	...
Caused by: java.net.SocketTimeoutException: Read timed out
	at java.base/java.net.SocketInputStream.socketRead0(Native Method)
	...
################## 걸린 시간 : 5280

Case 4.

  feign.hystrix.enabled=true

  feign.client.config.default.connectTimeout=5000

  feign.client.config.default.readTimeout=5000

  hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=15000

 

실행 로그

com.netflix.hystrix.exception.HystrixRuntimeException: TestClient#test() failed and no fallback available.
	at com.netflix.hystrix.AbstractCommand$22.call(AbstractCommand.java:822)
    ...
feign.RetryableException: Read timed out executing GET http://localhost:22222/test/do
	at feign.FeignException.errorExecuting(FeignException.java:213)
	...
Caused by: java.net.SocketTimeoutException: Read timed out
	at java.base/java.net.SocketInputStream.socketRead0(Native Method)
	...
################## 걸린 시간 : 5211

Case 5.

  feign.hystrix.enabled=true

  feign.client.config.default.connectTimeout=5000

  feign.client.config.default.readTimeout=15000

  hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=15000

 

실행 로그

com.netflix.hystrix.exception.HystrixRuntimeException: TestClient#test() failed and no fallback available.
	at com.netflix.hystrix.AbstractCommand$22.call(AbstractCommand.java:822)
    ...
feign.RetryableException: Read timed out executing GET http://localhost:22222/test/do
	at feign.FeignException.errorExecuting(FeignException.java:213)
	...
Caused by: java.net.SocketTimeoutException: Read timed out
	at java.base/java.net.SocketInputStream.socketRead0(Native Method)
	...
################## 걸린 시간 : 15157

Case 6.

  feign.hystrix.enabled=true

  hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=15000

 

실행 로그

com.netflix.hystrix.exception.HystrixRuntimeException: TestClient#test() failed and no fallback available.
	at com.netflix.hystrix.AbstractCommand$22.call(AbstractCommand.java:822)
    ...
Caused by: java.util.concurrent.TimeoutException
	at com.netflix.hystrix.AbstractCommand.handleTimeoutViaFallback(AbstractCommand.java:997)
################## 걸린 시간 : 15168

Case 7.

  feign.hystrix.enabled=true

  feign.client.config.default.connectTimeout=5000

  feign.client.config.default.readTimeout=15000

 

실행 로그

com.netflix.hystrix.exception.HystrixRuntimeException: TestClient#test() failed and no fallback available.
	at com.netflix.hystrix.AbstractCommand$22.call(AbstractCommand.java:822)
    ...
Caused by: java.util.concurrent.TimeoutException
	at com.netflix.hystrix.AbstractCommand.handleTimeoutViaFallback(AbstractCommand.java:997)
################## 걸린 시간 : 1018

Case 8.

  feign.hystrix.enabled=true

 

실행 로그

com.netflix.hystrix.exception.HystrixRuntimeException: TestClient#test() failed and no fallback available.
	at com.netflix.hystrix.AbstractCommand$22.call(AbstractCommand.java:822)
    ...
Caused by: java.util.concurrent.TimeoutException
	at com.netflix.hystrix.AbstractCommand.handleTimeoutViaFallback(AbstractCommand.java:997)
################## 걸린 시간 : 1146

Case 9.

아무런 설정을 하지 않음

 

실행 로그

feign.RetryableException: Read timed out executing GET http://localhost:22222/test/do
	at feign.FeignException.errorExecuting(FeignException.java:213)
	...
Caused by: java.net.SocketTimeoutException: Read timed out
	at java.base/java.net.SocketInputStream.socketRead0(Native Method)
	...
################## 걸린 시간 : 60008

 


 

테스트 케이스의 설정을 다음과 같다.

 

  • Case 1, 2
    feign.hystrix.enabled=false인 경우, feign.client.config.default.readTimeout 설정이 적용된다.

  • Case 3, 4, 5, 6, 7, 8
    feign.hystrix.enabled=true인 경우
    1. 설정값 feign.client.config.default.readTimeout와
      hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds 중 낮은 값이 적용된다.
    2. hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds만 설정할 경우,
      feign.client.config.default.readTimeout는 고려하지 않는다.
    3. Case 7, 8이 약 1초가 적용된 이유는 hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds 의 기본값은 1,000을 따르기 때문이다.
  • Case 9
    아무런 설정을 하지 않은 경우, Case1, 2와 동일한 에러 로그가 출력된다.
    feign.client.config.default.readTimeout 설정이 적용된것이고, 기본값은 60,000이다.

  • Case 6, 7, 8, 9
    feign.client.config.default.readTimeout 기본값은 60,000
    hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds 기본값은 1,000
    더 낮은 값은 hystrix 설정이기 때문에 Case 8에서 1,000이 적용됐다.

 

정리

hystrix를 사용하지 않을 경우 feign.client.config.default.readTimeout 설정을 하고

hystrix를 사용해야 한다면 feign.client.config.default.readTimeout와 hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds 두가지 값을 설정하되 기본값을 고려해야 한다.

 

 


 

※ Timeout은 10초도 길다고 볼 수 있다.

로직 처리 자체가 문제있는 것이므로 Timeout을 조절하기 보다는 로직을 수정 하는것이 옳바른 방법이다.

 

 

알고리즘은 문제를 해결하기 위한 방법을 추상화하여 일련의 단계적 절차를 논리적으로 기술한 명세서이다.

예를 들어, 요리 레시피도 알고리즘의 하나라고 할 수 있다.

 


표현 방식

알고리즘을 표현할 때, 다음과 같은 방식이 있다.

  • 자연어
    사람이 사용하는 언어로 서술
  • 순서도(Flow Chart)
    순서도의 작성 규칙에 따라 도식화

 

  • 프로그래밍 언어
  • 가상 코드(Pseudo code)

 

성능분석

알고리즘을 분석, 판단하는 기준으로 정확성, 명확성, 수행량, 메모리 사용량, 최적성 등이 있다.

이 중 가장 중요한 항목은 최적성이며, 알고리즘을 적용할 시스템의 사용 환경에 따라 수행량과 메모리 사용량이 달라지기 때문에 가장 좋은 알고리즘이란 최적의 알고리즘이라고 할 수 있다.

 

성능 분석 방법

성능 분석 방법은 공간 복잡도와 시간 복잡도, 일반적으로 이 두가지를 평가한다.

 

  1.  공간 복잡도 (Space Complexity)
    프로그램을 실행하여 완료하기 까지 필요한 저장 공간을 의미한다.
    따라서 필요한 고정 공간 + 가변 공간으로 계산된다.

  2. 시간 복잡도 (Time Complexity)
    프로그램을 실행하여 완료하는데 걸리는 시간이다, 컴파일 시간 + 실행 시간의 합으로 표현한다.
    일반적으로 빅-오(Big Oh) 표기법을 사용하여 표기한다.


빅-오(Big Oh) 표기법

① 빅-오 표기법은 실행 빈도수를 구하여 실행 시간 함수를 찾고, ②가장 큰 영향을 주는 n에 대한 항을 선택하여, ③ 계수는 생략하고 O의 오른쪽 괄호 안에 표시한다.

 

알고리즘에 따라 표현되는 예시는 다음과 같다.

 

logn, n, nlogn, n², n³, 2ⁿ...

 

=> O(logn), O(n), O(nlogn), O(n²), O(n³), O(2ⁿ)...

 

 


<<참고 자료>>

 

이지영, "C로 배우는 쉬운 자료구조 (개정판)", 한빛아카데미, 2013년, p63 ~ p77

노드 패키지 매니저를 이용해 설치해보자.

 

윈도우 콘솔창(윈도우키 + R을 누르고 cmd를 실행)을 기본으로 진행된다.

 

먼저 원하는 위치에 폴더를 생성을 하고 콘솔창을 이용해 해당 경로로 이동한다.

 

cd /~~/~~

 

 

이동 후 패키지 매니저를 이용해 전역으로 Vue-cli를 설치한다.

 

전역으로 사용한다는 키워드는 -g를 붙인다.

 

npm install -g vue-cli

 

 설치되있다면 위와같이 업데이트 작업이 진행된다.

 

이제 해당 경로에 webpack을 설치

 

웹팩은 일반 설치가 있고 simple, 필요한 기능만 설치하는 방법이 있는데

 

simple의 경우 기능이 너무 없어서 일반 설치를 한다.

 

vue init webpack

 

이와 같이 설치 진행 과정들을 보여주며 설치가 진행된다.

 

처음에 설치 키워드를 입력하면

 

? Generate project in current directory? Yes
? Project name webpack
? Project description A Vue.js project
? Author hawee
? Vue build standalone
? Install vue-router? Yes
? Use ESLint to lint your code? Yes
? Pick an ESLint preset Standard
? Set up unit tests Yes
? Pick a test runner karma
? Setup e2e tests with Nightwatch? Yes
? Should we run `npm install` for you after the project has been created? (recommended) npm

 

이와같은 기본설정이 나타난다. 버전에 따라서 기본 설정은 다른걸 요구하지만 대부분

 

영어문장 그대로 요구하는 값을 넣어주고 기본값이나 자주 사용하는 기능을 선택하면 된다.

 

vue-router : vue의 페이지 이동 기능을 담당

 

ESLint : 문장을 검사해주는 툴, 본인이 코드를 뒤죽박죽 쓴다면 추천

 

설치가 정상적으로 됫다면 프로젝트를 최신으로 업데이트(의존성을 통해 가져온 기능들)하고나서

 

개발자 모드로 웹팩을 실행시켜보자.

 

먼저 업데이트 키워드

 

npm install

 

외부 기능을 사용하고 싶어서 추가했다면 npm install을 통해서 업데이트를 진행하자.

 

의존성을 통해서 누군가 만들어놓은 외부 기능을 install 키워드를 사용하면

 

node_modules, Dependencies 에 추가된다.

 

외부 기능들은 정말 많이 있고 사용하기 쉽기 때문에 Vue를 사용하는 이유 중 하나이기도 하다.

 

아래 사이트에서 검색해 볼 수 있다.

 

https://www.npmjs.com/

 

npm | build amazing things

Bring the best of open source to your company npm is the tool used by over 11,000,000 JavaScript developers around the world. Your developers already use it. Your company depends on it. Create an Org and get more out of the tools your team already knows an

www.npmjs.com

 

 

개발자 모드 키워드를 통해 실행시켜보자

 

npm run dev

 

 

개발자 모드로 빌드가 완료되면 접속할 수 있는 url이 나오고 해당 url로 접속하면 vue의 Hello world 페이지가 뜬다.

 

만약 포트를 8080에서 원하는 포트로 바꾸고 싶다면

 

npm run dev -- --port 1234

 

키워드를 사용하면 되고

 

종료하고 싶다면 콘솔창에서 Ctrl + C를 누르면 빠져나온다.

 

설치된 웹팩 프로젝트는 다음과 같은 구조로 이루어져있다.

 

 

 

build 폴더는 프로젝트 빌드 설정이 저장된 js 파일들이다.

 

빌드 경로나 포트 등 다양한 설정을 한다.

 

 

 

config 폴더는 개발자 모드, 실제 패키지 빌드 모드 등 구동할 환경에 대해 상세 설정을 할 수 있다.

 

 

 

node_modules 폴더는 많은 의존성 기능들을 다운받은 폴더이다.

 

 - 이에 대한 의존성 내용은 가장 아래의 package.json의 Dependencies 값에서 확인

 

 - java 프로젝트에서 메이븐이나 Gradle을 이용해 api를 가져오고 의존성관리를 하는것과 비슷하다.

 

 

 

src 폴더는 실제 Vue 소스를 작성할 폴더들의 집합이다.

 

 

 

 

 

 

이로써 Vue Webpack 설치 및 환경설정은 끝났다.

 

프로젝트에서 Vue는 화면 역할을 하게 될 것이고

 

나중에 포스트 할 Spring Boot는 Spring Framework MVC 패턴은 html 파일, View를 리턴하는것과 달리

 

Rest API라고 Request가 오면 알맞은 JSON 형태의 Response 데이터를

 

return하는 서버로 DB에서 데이터를 뽑아오는 역할을 하게 된다.

+ Recent posts