Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[bug] 한국투자증권 액세스 토큰 만료시 발급 문제 #131

Closed
yonghwankim-dev opened this issue Jan 12, 2024 · 0 comments · Fixed by #132
Closed

[bug] 한국투자증권 액세스 토큰 만료시 발급 문제 #131

yonghwankim-dev opened this issue Jan 12, 2024 · 0 comments · Fixed by #132
Assignees
Labels
bug Something isn't working

Comments

@yonghwankim-dev
Copy link
Member

yonghwankim-dev commented Jan 12, 2024

상황

이전 이슈를 통하여 서버 시작시 한국투자증권 서버로부터 액세스 토큰을 발급받지 못하는 경우에 다시 저장하지 못하는 문제가 있었습니다. 이를 통해 retryWhen operator를 이용하여 재시도할 수 있도록 개선하였습니다.

하지만 배포 서버의 모니터링 결과 액세스 토큰이 만료되었을때 저장되지 않는 문제가 있습니다. 또한 다음 테스트를 통하여 redis 저장소에 액세스 토큰을 지운 상황에서 새로운 토큰을 발급받을 때 저장되지 않는 문제가 있다는 것을 알게 되었습니다.

@DisplayName("서버 시작시 액세스 토큰을 발급하여 redis에 저장한다")
@Test
void checkAccessTokenExpiration() {
    // given
    kisRedisService.deleteAccessTokenMap();
    // when
    accessTokenAspect.checkAccessTokenExpiration();
    // then
    Assertions.assertThat(kisRedisService.getAccessTokenMap().isPresent()).isTrue();
}

테스트 실행 결과는 다음과 같습니다.

org.opentest4j.AssertionFailedError: 
Expecting value to be true but was false
Expected :true
Actual   :false

원인

문제가 발생한 원인은 retryWhen operator를 통하여 재발급하는 것은 좋았으나 subscribe operator 실행이 마치기도 전에 메소드가 종료되어 redis에 accessToken을 저장하지 못하였습니다.

private Runnable handleNewAccessToken(LocalDateTime now) {
	return () -> {
		client.accessToken(oauthKisProperties.getTokenURI())
			.subscribe(accessToken -> {
				log.info("accessToken 발급 결과 : {}", accessToken);
				redisService.setAccessTokenMap(accessToken, now);
				manager.refreshAccessToken(accessToken);
				log.info("새로운 액세스 토큰 갱신 완료");
			});
		log.info("handleNewAccessToken task finish");
	};
}

본인은 subscribe가 실행되기 전에 block되어 서버로부터 응답을 받아서 실행될것이라고 기대했으나 실제로는 어떤 operator에서도 blocking이 되지 않아서 액세스 토큰을 저장하지 못하고 종료되었습니다.

해결방법

handleNewAccessToken 메서드는 subscribe가 종료되고 나서.종료되도록 대기를 설정합니다.

private void handleNewAccessToken(LocalDateTime now) {
CountDownLatch latch = new CountDownLatch(1);
client.fetchAccessToken()
.subscribe(accessToken -> {
redisService.setAccessTokenMap(accessToken, now);
manager.refreshAccessToken(accessToken);
log.info("새로운 액세스 토큰 갱신 완료");
},
error -> {
log.error("새로운 액세스 토큰 발급 에러", error);
latch.countDown();
}, latch::countDown);
try {
latch.await();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}

@yonghwankim-dev yonghwankim-dev added the bug Something isn't working label Jan 12, 2024
@yonghwankim-dev yonghwankim-dev self-assigned this Jan 12, 2024
yonghwankim-dev added a commit that referenced this issue Jan 12, 2024
yonghwankim-dev added a commit that referenced this issue Jan 12, 2024
yonghwankim-dev added a commit that referenced this issue Jan 15, 2024
* #123 docs: 테스트 프로파일에 히카리 로깅 레벨 설정

* #129 refactor: 별도 메소드 분리

* #129 test: 히카리 연결 풀 테스트 코드 추가

* #123 fix: 스케줄링 메소드 오타 수정

* #123 fix: throwable 로깅

* #131 test: HasPortfolioAuthorizationAspect 테스트 코드 추가

* #123 fix: OSIV(open session in view) 설정

* #123 test: 불필요한 테스트 코드 제거

* #123 refactor: 포트폴리오 조회시 fetch join으로 변경

- N+1 문제를 해결하기 위해서 fetch join 사용

* #123 test: findAllByPortfolioId 테스트 코드 추가

* #123 fix: OSIV 비활성화에 따른 fetch join 적용

* #123 fix: OSIV 비활성화에 따른 테스트 코드 수정
yonghwankim-dev added a commit that referenced this issue Jan 15, 2024
* #131 fix: 액세스 토큰 발급 오류 수정

* #131 test: 액세스 토큰 발급 테스트 코드 추가

* #131 test: 오타 수정

* [fix] Hikari Connection Pool 고갈 문제 해결 (#135)

* #123 docs: 테스트 프로파일에 히카리 로깅 레벨 설정

* #129 refactor: 별도 메소드 분리

* #129 test: 히카리 연결 풀 테스트 코드 추가

* #123 fix: 스케줄링 메소드 오타 수정

* #123 fix: throwable 로깅

* #131 test: HasPortfolioAuthorizationAspect 테스트 코드 추가

* #123 fix: OSIV(open session in view) 설정

* #123 test: 불필요한 테스트 코드 제거

* #123 refactor: 포트폴리오 조회시 fetch join으로 변경

- N+1 문제를 해결하기 위해서 fetch join 사용

* #123 test: findAllByPortfolioId 테스트 코드 추가

* #123 fix: OSIV 비활성화에 따른 fetch join 적용

* #123 fix: OSIV 비활성화에 따른 테스트 코드 수정
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant