Project

[TDD] API 응답속도를 개선해보자.

EJUN 2024. 8. 13. 22:31

TDD프로젝트를 진행하면서 우연히 프론트분에게 todo를 불러오는데 로딩이 좀 있는거 같다 라는 연락을 받게 되었다..

 

문제(?)의 동영상

저걸 보고 전 어라? 저 부분은 데이터도 적은 부분인데 왜 로딩이 되지...? 라는 불안감이 생겼고, API테스터로 response time을

측정해보니,,,,,,

대참사 1분전...

보자마자 와 뭐지,,API호출하는데 1.5초가 걸린다고? 라는 생각이 들면서 뭐가 문제인지 고민을 해보았습니다.

 

우선 제가 생각한 문제는 일자별로 DB에서 검색하는게 오래걸렸나..? 라는 생각을 하였습니다..

그래서 cache를 적용해야하나? 라는 고민을 하며 우선 로그를 찍어서 한번 확인해보기로 했습니다.

 

우선 문제의(?) API의 Service를 보면

fun findTodoLists(todoDateRequest: TodoDateRequest, username: String): List<TodoResponse> {
    val member = memberReader.getMember(username)
    return todoReader.bringTodoLists(todoDateRequest.deadline, member)
}

위와 같은데 각각의 기능이 실행되는 시간을 측정해보니 각각 4ms, 24ms 가 나오고 API호출시간은 44ms가 나오는 것을 확인했습니다.

 

이러니 더더욱 뭐가 문제인지 확인이 안되었습니다...

왜냐하면 만약 DB Query가 문제였다면 애초에 각각의 기능 수행시간도 똑같이 길어야했기 때문입니다(진짜 문제를 몰랐던,,,)

 

(딱 내 심정)

 

문득 그럼 다른 API는 괜찮겠지? 라는 생각을 하며 다른 API도 똑같이 테스트를 해봤는데,,,,,하

이게 왠걸,,다른 API도 response time이 1초대가 나오는 것을 확인했다......................

 

이쯤 되면 내가 생각한 문제가 아닐수도 있겠다, 설마 네트워크가? 하면서 핫스팟에서 집 와이파이(GIGA ㅋㅋ)로도 변경해봤는데 똑같았다.,ㅋㅋㅋㅋㅋㅋ(진짜 별 걸 다해봄)

 

그러다 아무 생각없이 애플리케이션을 실행하고 문제의(?)API를 호출하고 로그를 보고있는데 어라? 무엇인가 로그에서 딜레이가 있는 것을 확인했다.
뭐지하고 자세히 봤는데

문제의 로그!!!!

SecurityContext부분에서 로딩이 심한 것을 확인하였다..ㅎ

순간 아차차 생각이 들었다.

왜냐면 본 서비스는 Apple Social Login이 있는데 필자는 앱스토어 배포가 목표였기 때문에 최대한 애플에 순응(?)하기로 했기 때문에

애플에서 발급받은 JWT토큰을 그대로 사용하였다..(이게 이렇게 나에게 스트레스를 안겨줄진 몰랐다,,,)

 

문제는 이 부분이었다.

 

왜냐면 인증이 필요한 API를 호출할 떄마다 Header에 있는 Token을 검증해야되는데 ApplePubilcKeys를 통해서 할 수 있기 때문이다.

fun getAppleAuthentication(token: String): Authentication {
        val applePublicKeys = appleClient.getApplePublicKeys().keys
        val decodedJWT = AppleJwtUtil.decodeAndVerify(token, applePublicKeys)
        val payload = AppleJwtUtil.getPayload(token, applePublicKeys)

        val authorities = listOf(SimpleGrantedAuthority("ROLE_USER"))
        val principal = User(payload["sub"] as String, "", authorities)

        return UsernamePasswordAuthenticationToken(principal, token, authorities)
    }

이 부분이 Apple의 JWT로부터 Authentication객체를 생성하는 부분인데 여기서 appleClient.getApplePublicKeys() 이걸 호출할 때 마다 Apple Server에 요청을 보내고 받아야되는데 그 시간이 무려 1.3초 정도가 걸리고 있던 것이다..

 

그래서 어떡해야 저 부분을 사용하지 않을까 하다가 결국엔 Apple에 반항(?)하기로 했다..ㅎ

 

지금은 Apple에서 발급받은 JWT를 그대로 사용했지만 지금부턴 Apple에서 받은 Token을 Decoding해서 내가 원하는 정보만 넣어주기로 했다.

val user = User(userIdentifier,"",authorities)
val authentication = UsernamePasswordAuthenticationToken(user, null, authorities)
val jwtToken = tokenProvider.createToken(authentication)

저 부분을 통해 자체적으로 JWT를 생성해서 생성된 jwtToken을 FE분에게 전달해드기로했다.ㅎㅎㅎㅎ(첨부터 이렇게 할껄)

 

이렇게 수정을 한 후 다시 API Test를 진행했고 결과는,,,,

성공적으로 감소!

성공적으로 response time이 준 것을 확인하였다.ㅎㅎ

다음엔 좀 더 줄이기위한 다른 방법도 소개해보겠다!

 

사실 이 문제는 log를 유심히 보고 또 집중해서 봤으면 금방 문제를 찾을 수 있었는데 그렇지 않아서 좀 삽질을 길게 한 거 같다..

전 날 나의 항복선언,,,

사실 지금까진 log에서 결과가 바로 나왔고 그렇기 때문에 log가 출력되는 속도를 크게 신경쓰지 않았지만, 이제부턴 담에도 이렇게

이상한 response time이 나온다면 log가 출력되는 속도도 보고 문제에 더 빠르게 접근할 거 같다.

 

이렇게 계속해서 모르는 것이 나오고 미처 대수롭게 넘겼던 부분의 중요성을 다시 한번 깨닫게 되는 계기가 되었다.

'Project' 카테고리의 다른 글

[Project] - Distance  (1) 2024.05.12
[Project] - 가자지구  (0) 2024.04.05
[Project] - 카페 체크인  (0) 2024.04.05