요청이 잘 갔는지, 안 갔다면 왜 안 갔는지를 확인하는 함수들입니다. 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 로 키를 직접 지정해 두었다가 다시 자동 탐색으로 돌아가고 싶을 때 정도가 쓰임새입니다.