https://github.com/kjh03160/go-mongo

go-mongo

어떻게 하다 시작했나?

회사에 입사하고 나서, golang과 몽고 DB를 주로 사용하게 되었다. mongo-driver 라이브러리를 사용하고 있었으며, 해당 라이브러리와 몽고 DB에 익숙해질 겸 라이브러리 함수를 사용하여 내가 나중에 쓸만한 코드를 만들어 둘려고 했다.

하지만 내가 golang으로 개발하면서 처음부터 그리고 지금까지도 고민되는 부분이 있었다.

go에서는 함수에서 에러가 발생하면, 다른 언어들처럼 exception(go에서는 panic)을 발생시키는 것이 아닌 해당 에러를 직접 핸들링을 하는것을 권장한다.

func fn() error {
        x, err := bar.Foo()
        if err != nil {
                return err // do not panic()
        }
        ...
}
  1. golang은 error를 직접 핸들링 해야되는데, 그러면 그 에러에 대한 로그를 어디서 어느 레벨로 찍어야하는가?
  2. 그리고 그 에러는 어디까지 올려야되는가?

그래서 함수들이 함수를 부르고, 에러를 리턴 받고 또 그것을 리턴하는 구조가 심심치 않게 발생하다 보니, 이 에러에 대한 로그는 어디에서 남겨야하는가에 대한 의문이 들었다.

물론 에러가 발생한 모든 지점에서 로그를 찍으면 가장 좋다. 하지만 그렇게 되면 로그 양이 너무나도 커질 수 있으며, 해당 에러가 어느 로그 레벨로 찍혀야되는지 모호한 경우도 많았다.

예를 들어, 함수에서 db 함수에서 어떤 document를 못찾았을 때, 이는 Error 레벨인가? 아니면 Info 레벨인가? 해당 함수 내부에서는 알 수 없다.

웹 서버 애플리케이션 관점으로 이야기 하자면, controller, service, repository의 단계로 프로젝트가 구성되어 있다고 하자. 하위 레이어에서는 본인이 내뱉을 에러 혹은 리턴 값이 어떻게 사용될 지 알 수 없고, 실제 에러인지 알 수 없다.

예를 들어, repository에서 userRepository가 있다고 하면, findUser를 하였을 때, 해당 user가 없는 경우 이것이 발생하면 안되는 상황인지 or 정상적인 상황인지는 상위 레이어(service)에서 결정된다.

그렇다면 로그는 어디서 어떻게 남겨야하는가? 에 대한 고민도 생긴다. repository에서는 에러 로그를 이를 info, warn으로 남길 것인가? 로그 레벨을 정할 수 없다.

그러면 repoistory에서는 Info 레벨로 남기고 에러인지는 service에서 판단하여 Error 레벨로 찍을 것인가? 라는 생각도 들었다. 하지만 그건 중복 로그가 남게 되는 것이며, 효율적이지 못하다고 생각했다.