저는 다음과 같이 개발해 왔습니다. 카우치베이스 와 Go SDK를 오랫동안 사용해 왔지만, 최근 몇 시간 동안 문제를 해결한 끝에 SDK의 버그라고 생각되는 문제가 발생했습니다. 결과가 나온다는 것을 확실히 알고 있는 N1QL 쿼리를 실행하려고 했습니다. 문제는 Go 애플리케이션 내에서 이러한 결과가 전혀 표시되지 않는다는 것이었습니다.
Go SDK 엔지니어와 함께 문제를 해결한 결과, 버그가 아니라 사용자 오류였습니다. 정말 당황스럽죠?
제가 무엇을 잘못했는지, 문제를 해결하기 위해 어떤 단계를 거쳤는지 살펴보겠습니다.
제 Go 애플리케이션에는 Couchbase에 저장하고 있는 데이터를 모델로 삼아야 하는 여러 데이터 구조가 있었습니다. 그 데이터 구조 중 하나는 다음과 같았습니다:
1 2 3 4 5 6 7 |
유형 블로그 구조체 { 유형 문자열 `json:"유형,생략"` Pid 문자열 `json:"pid,생략"` 제목 문자열 `json:"제목,생략"` 콘텐츠 문자열 `json:"콘텐츠, 생략"` 타임스탬프 int `json:"타임스탬프, 생략"` } |
위는 매우 간단한 문서 모델을 나타내는 매우 간단한 데이터 구조입니다.
모두 쿼리하려면 블로그
문서에서 다음 코드를 실행하고 있었습니다:
1 2 3 4 5 6 7 8 9 10 11 12 |
쿼리 := gocb.NewN1qlQuery("SELECT `" + 버킷.이름() + "`.* FROM `" + 버킷.이름() + "` WHERE 유형 = '블로그'") 행, err := 버킷.ExecuteN1qlQuery(쿼리, nil) 만약 err != nil { fmt.Println(err.오류()) 반환 } var 행 블로그 에 대한 행.다음(&행) { fmt.Println(행) 행 = 블로그{} } 행.닫기() |
애플리케이션을 실행할 때 쿼리가 올바른지 다른 곳에서 확인할 수 있음에도 불구하고 결과가 인쇄되지 않았습니다. 이 경우 .다음
함수는 항상 거짓을 반환했습니다.
다음 논리적 단계는 Couchbase가 Go SDK 기반 애플리케이션으로부터 요청을 올바르게 수신하고 있는지 확인하는 것이었습니다. 이는 Couchbase 로그 모니터링을 통해 확인했습니다. 로그에는 모든 것이 합산된 것으로 나타났습니다.
그런 다음 코드를 약간 변경했습니다:
1 2 3 4 5 6 7 8 9 |
쿼리 := gocb.NewN1qlQuery("SELECT `" + 버킷.이름() + "`.* FROM `" + 버킷.이름() + "` WHERE 유형 = '블로그'") 행, err := 버킷.ExecuteN1qlQuery(쿼리, nil) 만약 err != nil { fmt.Println(err.오류()) 반환 } var 행 블로그 행.하나(&행) fmt.Println(행) |
대신 .다음
함수를 사용하여 .One
함수를 사용했습니다. 결과 중 하나가 인쇄되었지만 부분 인쇄라는 사실을 깨닫지 못했습니다.
Go SDK 엔지니어인 브렛 로슨과 이야기를 나눈 후, 그는 제가 결과 오류를 일으키는 오류를 수신하고 있다는 결론을 내렸습니다.
하지만 잠깐만요. 다음과 같이 오류가 출력되지 않나요?
1 2 3 4 |
만약 err != nil { fmt.Println(err.오류()) 반환 } |
위의 코드는 쿼리 실행 시 오류를 출력합니다. 실제로 쿼리가 실행되고 결과를 받은 후 다른 곳에서 오류가 발생했습니다.
브렛은 제 코드를 다음과 같이 변경할 것을 권장했습니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
쿼리 := gocb.NewN1qlQuery("SELECT `" + 버킷.이름() + "`.* FROM `" + 버킷.이름() + "` WHERE 유형 = '블로그'") 행, err := 버킷.ExecuteN1qlQuery(쿼리, nil) 만약 err != nil { fmt.Println(err.오류()) 반환 } var 행 블로그 에 대한 행.다음(&행) { fmt.Println(행) 행 = 블로그{} } err = 행.닫기() fmt.Println(err) |
오류를 인쇄하고 있는 것을 확인합니다. .닫기
함수입니다.
알고 보니 오류가 있었습니다. 문제는 제 결과가 데이터 구조에 올바르게 매핑되지 않는다는 것이었습니다. 더 구체적으로 말하자면, 데이터 구조의 타임스탬프
속성입니다.
저는 타임스탬프
as int64
데이터를 읽으려고 했지만 마치 int
. 이 사소한 세부 사항으로 인해 제가 포착하지 못한 오류가 발생하여 결과가 비어 있고 Go SDK에 버그가 있다고 생각하게 되었습니다.
결론
이 이야기의 교훈은 Go 함수가 오류를 반환하면 반드시 그 정보를 활용하여 무언가를 하라는 것입니다. 코드에서 오류를 생략하고 존재하지 않는 것처럼 계속 진행하지 마세요. 나중에 몇 시간 동안 좌절감을 맛보게 될 수도 있습니다.
당황스러운 이슈 티켓과 적절한 해결 방법을 확인하려면 Jira 트래커를 확인하세요. 여기.
Couchbase와 함께 Go SDK를 사용하는 방법에 대한 자세한 내용은 다음을 확인하세요. 카우치베이스 개발자 포털.