주 콘텐츠로 건너뛰기
기능별 활용 가이드 생성 편집

연결 상태와 오류 확인

요청이 잘 갔는지, 안 갔다면 왜 안 갔는지를 확인하는 함수들입니다. CallGet 같은 호출 함수는 실패해도 오류를 일으키지 않고 응답 문자열을 그대로 돌려주기 때문에, 상태를 따로 확인하는 수단이 필요합니다.

이 글에서 다루는 것

・ 직전 호출이 성공했는지 확인하기

・ 무엇을 보내고 무엇을 받았는지 들여다보기

・ 오류 메시지만 뽑아내기

・ 모든 요청을 즉시 창에 기록하기

・ 타임아웃과 서버 설정 확인하기

・ MAPI-Key가 살아 있는지 직접 확인하기

CvIsOk()

CvLastStatus()

CvLastVerb()

CvLastUrl()

CvLastRequestBody()

CvLastResponse()

CvLastError()

CvErrorText([jsonText])

CvPrintLast()

CvCallCount()

CvSetLog(on)

CvLogOn()

CvSetTimeout(milliseconds)

CvTimeout()

CvProgram()

CvBaseUrl()

IsMapiKeyAlive(mapiKey)

GetRunningMidasProcesses()

직전 호출이 성공했는지 확인하기

CvIsOk 는 직전 호출이 2xx로 끝났으면 True를 돌려줍니다. 상태 코드를 직접 보고 싶다면 CvLastStatus 를 씁니다.

Sub CheckOne()
    Dim result As String
    result = CallGet("/db/UNIT")

    If CvIsOk() Then
        Debug.Print "성공: " & result
    Else
        Debug.Print "실패 " & CvLastStatus() & " : " & CvLastError()
    End If
End Sub

자주 만나게 되는 상태 코드는 아래와 같습니다.

상태 확인할 것
200 정상 -
400 바디가 잘못됨 필수 항목이 빠졌거나 값의 형식이 다릅니다. CvLastRequestBody 로 실제로 보낸 바디를 확인하십시오.
404 대상이 없음 번호가 없는 항목을 지웠거나, 응답에 client does not exist 가 들어 있다면 MAPI-Key가 죽은 것입니다.
-1 통신 자체가 실패 제품이 꺼져 있거나 방화벽에 막힌 경우입니다.

무엇을 보내고 무엇을 받았는지 들여다보기

바디를 만드는 코드가 길어지면 실제로 어떤 JSON이 나갔는지 보는 것이 가장 빠른 확인 방법입니다.

CvLastVerb() — 보낸 메서드

CvLastUrl() — 실제로 보낸 전체 주소

CvLastRequestBody() — 실제로 보낸 바디

CvLastResponse() — 돌아온 응답 원문

CvLastError() — 실패했을 때의 사유

네 가지를 한 번에 보고 싶다면 CvPrintLast 를 부르면 됩니다. 즉시 창(Ctrl+G)에 요약이 찍힙니다.

Sub WhatWentWrong()
    CallPut "/db/NODE", "{""Assign"":{""1"":{""X"":0}}}"
    CvPrintLast
End Sub

오류 메시지만 뽑아내기

응답 본문에 오류가 들어 있으면 CvErrorText 가 메시지만 꺼내 줍니다. 오류가 없으면 빈 문자열입니다. 인자를 비우면 직전 응답을 봅니다.

Dim result As String
result = CallPut("/db/SECT", jsonBody)

If Len(CvErrorText()) > 0 Then
    Debug.Print "제품이 거부했습니다: " & CvErrorText()
End If

💡 Tip

상태가 200이어도 본문에 오류가 담겨 오는 경우가 있습니다. 단면 치수가 형상에 맞지 않을 때가 대표적입니다. 쓰기 요청 뒤에는 CvIsOk 뿐 아니라 CvErrorText 도 함께 보는 편이 안전합니다.

모든 요청을 즉시 창에 기록하기

CvSetLog True 를 한 번 실행해 두면 이후 모든 요청의 메서드, 경로, 상태 코드, 응답 길이가 자동으로 즉시 창에 찍힙니다. 무엇이 몇 번 나가는지 확인할 때 가장 빠른 방법입니다.

CvSetLog True

Node 1, 0, 0, 0
Node 2, 10, 0, 0

' [CivilVBA] PUT /db/NODE -> 200 (35 bytes)
' [CivilVBA] PUT /db/NODE -> 200 (35 bytes)

Debug.Print CvCallCount()   ' 지금까지 나간 요청 수
CvSetLog False

타임아웃과 서버 설정 확인하기

해석처럼 오래 걸리는 요청은 기본 5분 안에 끝나지 않을 수 있습니다. CvSetTimeout 으로 늘리고 CvTimeout 으로 지금 값을 확인합니다.

CvSetTimeout 900000            ' 15분
Debug.Print CvTimeout()        ' 900000

Debug.Print CvBaseUrl()        ' 지금 보내고 있는 주소
Debug.Print CvProgram()        ' civil 또는 gen

MAPI-Key가 살아 있는지 직접 확인하기

모듈은 평소에 확인용 요청을 보내지 않지만, 특정 키가 살아 있는지 직접 물어보고 싶을 때는 IsMapiKeyAlive 를 쓸 수 있습니다. 그 키로 조회 요청을 한 번 보내 보고 True/False를 돌려줍니다.

Debug.Print IsMapiKeyAlive(GetMapiKey("FES"))
Debug.Print IsMapiKeyAlive(GetMapiKey("HYPER-S"))

지금 어떤 MIDAS 프로그램이 실제로 떠 있는지는 GetRunningMidasProcesses 로 볼 수 있습니다.

Sub ShowProcesses()
    Dim one As Variant
    For Each one In GetRunningMidasProcesses()
        Debug.Print one
    Next one
End Sub

⚠️ 주의

CIVIL NX와 HYPER-S는 실행 파일 이름이 둘 다 CVLw.exe 라서 프로세스 목록만으로는 어느 쪽인지 구분되지 않습니다. 확실한 구분은 MAPI-Key로 요청을 보내 보는 것뿐입니다.

 

레지스트리에 남아 있는 제품 확인하기

MAPI-Key는 제품을 껐다 켜도 레지스트리에 남습니다. CIVIL NX와 HYPER-S를 둘 다 써 본 PC라면 두 경로 모두에 키가 있고 그중 하나는 죽은 키입니다. CvFoundSolvers 는 지금 레지스트리에 키가 남아 있는 제품을 전부 보여 줍니다.

각 항목은 제품 이름 / 키 앞 8자 / 레지스트리 경로 가 탭으로 이어진 문자열입니다.

Sub ShowSolvers()
    Dim one As Variant
    For Each one In CvFoundSolvers()
        Debug.Print Replace(one, vbTab, "  |  ")
    Next one
End Sub

' FES      |  a1b2c3d4...  |  HKEY_CURRENT_USER\Software\MIDAS\CVLwNX_KR\CONNECTION\Key
' HYPER-S  |  9f8e7d6c...  |  HKEY_CURRENT_USER\Software\MIDAS\CVLwNX_KR_HYPER_S\CONNECTION\Key

여러 개가 나와도 걱정할 것은 없습니다. 모듈은 첫 번째 것을 그냥 써 보고, 404와 함께 client does not exist 가 오면 한 번만 다른 제품으로 바꿔 다시 보냅니다.

캐시 비우기

한 번 성공한 키는 세션 내내 재사용됩니다. ResetSolverCache 는 그 캐시를 비워서 다음 요청 때 다시 고르게 만듭니다.

ResetSolverCache
Debug.Print GetCurrentSolverName()

💡 Tip

FES와 HYPER-S를 오가는 경우는 위의 자동 재시도가 알아서 처리하므로 보통은 부를 일이 없습니다. CvSetMapiKey 로 키를 직접 지정해 두었다가 다시 자동 탐색으로 돌아가고 싶을 때 정도가 쓰임새입니다.

 

0
컨텐츠가 도움이 되셨나요?