[GQL] 비동기 처리 하면서

바나나·2024년 12월 22일

GQL

목록 보기
3/3

비동기가 왜 필요한가?
2개의 쿼리 조회시 속도가 너무 느려 사용 최대 로컬에서 500ms 발생

적용해도 문제 없나?
쿼리 자체가 개별적으로 동작하는 쿼리라 이슈 없음

왜 느린가?
외부 서비스에 요청해서 결과값을 가져오는데 이때 속도가 이슈

결과
운영에서 평균 80ms

참고 : https://velog.io/@banana-wuyu/spring-osiv

결과 샘플 코드

@DgsComponent
class SampleQuery(
    private val dgsAsyncTaskExecutor: Executor,
) {
	@Async
    @DgsData
    fun sample1(): CompletableFuture<Sample> {
    	return CompletableFuture.supplyAsync({
        // 로직
        }, dgsAsyncTaskExecutor)
    }
    
    @Async
    @DgsData
    fun sample2(): CompletableFuture<Sample> {
        return CompletableFuture.supplyAsync({
        // 로직
        }, dgsAsyncTaskExecutor)
    }

작업중 오류

이슈

  1. Apparent connection leak detected

해결

Apparent connection leak detected

누수 확인 로그 추가

logging:
  level:
    com: trace
    org.springframework.transaction.interceptor: trace
spring:
  datasource-main:
    hikari:
      leak-detection-threshold: 2000

인증 처리를 하는 Resolver에서 오류 발생
유저 정보 조회 후 DB 커넥션이 제대로 닫히지 않아서 오류 발생

해결방법

osiv off로 수정 - https://kth990303.tistory.com/427
- 현재 코드에서는 lazy-load 가 있는 entity를 밖에서 사용하는 경우가 있어서 해당 방법 사용시 영향범위 파악도 어렵고, 테스트가 어려워 해당 방법은 사용 불가능 (해당 방법 사용)
- 다른 방법 확인중
- async용 userResolver 따로 만들어서 사용 가능한지 확인중 - 해당 resolver에서 db 커넥션 강제로 끊어서 사용 (이런식으로 해도 되는지 모름)

profile
Java/Kotlin Spring 개발자 황재명입니다.

0개의 댓글