[개발 일기 22.07.07] Pretty Print

김은섭 2.0·2022년 7월 8일
0

토이1호 개발일기

목록 보기
3/3
post-thumbnail

개발 일기를 당일에 쓰기가 쉽지 않네. 이럴 바엔 전날 작업한 내용을 다음 날 쓰는 걸로 해야겠다.

그래서, 어제는 그 전날 retrofit2로 open api 테스트 해본 것에다가 OkHttp3를 같이 사용해 통신 로그를 쉽게 볼 수 있도록 해봤다.

okhttp3의 logging-interceptor를 활용했다.

OkHttp의 공식사이트에서 최신 버전을 참고하는데, 이런 내용이 눈에 띄었다. bill of materials (BOM)을 지원해서 한 라이브러리에서 여러 개의 아티팩트를 가져다 쓸 때 버전 관리를 용이하게 해준다고 한다.

원래라면 okhttp 버전 따로, logging-interceptor 버전 따로 써야해 귀찮았는데..좋다 이거!

이런 식으로 LoggingInterceptor 만든 다음 Retrofit 객체를 생성할 때 넣어주면 되는 것이라 간단한데 문제는..

받아온 Response를 로그로 보여줄 때 이렇게 보여준다는 거....심지어 너무 길어서 3라인으로 나눠졌다. 이렇게 나오면 로그의 의미가 있을까..?

예전에 Json을 예쁘게 출력하는 방법을 지나가면서 본 것 같아서 찾아보니 역시 있었다.

StackOverflow에서 훌륭한 답변을 발견. HttpLoggingInterceptor.Logger를 상속 받아 로그를 예쁘게 출력해주는 커스텀 클래스를 하나 만든 다음 Interceptor 생성할 때 파라미터로 넣어주면 되는 거였다.

class PrettyJsonLogger : HttpLoggingInterceptor.Logger {
    private val gson = GsonBuilder().setPrettyPrinting().create()
    private val jsonParser = JsonParser()

    override fun log(message: String) {
        val trimMessage = message.trim()

        if ((trimMessage.startsWith("{") && trimMessage.endsWith("}"))
            || (trimMessage.startsWith("[") && trimMessage.endsWith("]"))) {
            try {
                val prettyJson = gson.toJson(jsonParser.parse(message))
                Platform.get().log(prettyJson, INFO,null)
            } catch (e: Exception) {
                Platform.get().log(message, WARN, e)
            }
        } else {
            Platform.get().log(message, INFO, null)
        }
    }
}

https://stackoverflow.com/a/58151367/19499849 이 답변의 코드가 제일 깔끔했다. Java 코드를 Kotlin으로만 바꿨을 뿐 동일한 코드다.

log 메소드를 재정의해서 Json 형식의 데이터면 Pretty Printing을 해서 출력하도록 하는 코드다.

만든 커스텀 클래스 객체는 이렇게 넣어준다.

결과는

예쁘다👏 아름답다👏

그리고 비동기 처리를 아름답게 해주려고 coroutine을 보기 시작했다. 예전에 사용해본 적은 있고, 또 사용법이야 하라는 대로 하면 되는데.. 깊은 이해를 좀 가져보고 싶어서 이번에는 시간을 좀 들이기로 했다.

그런데 Android Developer 사이트에서 제공하는 가이드도 그렇고, Kotlin 홈페이지에서 제공하는 문서도 그렇고 설명이 참.. 쉽지 않다.

딥한 공부는 공부대로 하면서 일단 기본적인 사용법대로만 쓰고 토이 1호를 쭉쭉 만들어 나가야지.

profile
생각하지 말고 그냥 할게요

0개의 댓글