Flutter에서 print를 사용하지 말아야 하는 이유

halfmoon-mind
GDSC Soongsil
Published in
5 min readJun 18, 2024

안녕하세요 GDSC SSU, Web/Mobile팀 심상현입니다!
저는 현재 talecrew라는 회사에서 Flutter Engineer로 근무하고 있습니다.
저는 이번 글의 주제인 “Flutter에서 print를 사용하지 말아야 하는 이유”에 대해서 깨닫고 고민한 부분을 같이 공유하고자 이 글을 작성하게 되었습니다.

Flutter란?

Flutter는 구글에서 만든 프레임워크로 단일 코드로 iOS, Android, Mac, Window 등 크로스플랫폼으로 서비스를 만들 수 있습니다.

선언형 UI, 핫 리로드와 DevTools, Cupertino/Material Widget과 같은 좋은 기능들이 많아서 요즘 Flutter로 만들어진 앱이 많아지는 추세입니다.

로그 작성하는 방법

프로그래머는 무엇이던 개발할 때, 로그를 통해서 디버깅을 주로 진행을 합니다.
Flutter에서 로그를 어떻게 진행할까요?

  • print
  • debugPrint
  • log
  • 외부 패키지 사용 (예, Sentry)

여기에서 이번 글의 주제인 print가 나옵니다.

Print는 왜 안좋을까?

로깅을 위해서 print 함수를 호출하면 파란색 린트가 발생하면서 다음과 같은 메시지가 출력됩니다.

Don’t invoke ‘print’ in production code.
Try using a logging framework.

이 말은 print 를 production에서 실행하지 말고, logging framework를 따로 사용하라는 의미입니다.
다음과 같은 에러가 뜨는 이유가 무엇일까요?

  • 긴 문자열을 출력하기 어렵다.

여러분이 짧은 로그를 생성한다면 크게 문제가 되지 않겠지만, 긴 로그를 출력한다면 분명 로그가 중간에 잘리는 현상을 겪었을 것입니다.
물론 print를 활용하여 로그를 출력할 때, 더 긴 문자열을 출력하고 싶다면 약간의 변형을 주면 되긴 하지만, logdebugPrint와 같은 다른 방식이 있는데 굳이 변형을 할 필요는 없을 것입니다.

/// print를 더 길게 할 수 있게 해주는 코드
/// 출처 : https://stackoverflow.com/a/70111859
void printWrapped(String text) {
final pattern = new RegExp('.{1,800}'); // 각 문자열을 800글자 단위로 자르기
pattern.allMatches(text).forEach((match) => print(match.group(0)));
}
  • Release Mode로 빌드 시에 로그를 작성할 수 있음

이 부분은 어떤 사람은 이렇게 생각할 수 있습니다.

오히려 릴리즈 모드에서 로그를 볼 수 있어서 좋은거 아닌가?!

하지만 단점은 앱을 릴리즈 모드로 빌드한 이후에 Flutter로 만들어진 앱을 실행하면 다른 앱의 로그도 찍히는 것이 확인되었습니다.

예를 들어보겠습니다.
저는 A라는 앱을 릴리즈로 빌드를 해서 실행하였습니다.

그리고 현재는 유지보수하고 있지 않은 앱 B를 실행하였습니다.
이렇게 되니, 앱 A의 로그 뿐만 아니라, 앱 B의 로그가 찍히는 것이 보입니다

현재 B 앱 에서는 서버를 내렸기 때문에 lookup 할 수 없어서, 에러를 출력하는데 이를 print로 핸들링하고 있어서, 프로덕션에서도 로그가 찍히는 모습을 확인할 수 있습니다.

A 앱을 릴리즈로 실행한 후, B 앱을 실행하였을 때 A 앱의 로그 뿐만 아니라 B 앱의 로그도 함께 보이는 것을 알 수 있다.

이러한 경우에 내가 만든 앱을 Release 모드로 빌드한 이후에 Flutter로 만들어진 다른 앱을 실행하면 해당 앱에서 print로 찍히는 모든 로그를 확인할 수 있는 것입니다!

이는 명시적으로 print로 로그를 출력한 것 이외에도 다른 패키지에서 print로 로그를 출력한다면 본의 아니게 출력하게 됩니다.
현재 회사에서는 API 통신에서 dio를 사용하고 있습니다.
API 통신에서 문제가 없는지 확인하기 위해서 내부적으로 pretty dio logger 패키지를 사용하고 있습니다.

하지만 pretty_dio_logger를 사용하면 출력이 print로 보여지고, 이 때문에 api 로그가 production에서 Release모드로 빌드된 앱에서 모든 API 로그가 자연스럽게 노출되게 됩니다.

대안으로는?

일단 명시적으로 print를 활용하여 로그를 찍는 습관을 줄여야합니다.
또한 production용 어플리케이션을 빌드하면, Sentry와 같은 로깅 패키지를 활용하여 따로 로그를 볼 수 있는 환경을 구축하면 될 것입니다.

궁금하신 점이 있으시다면, 댓글로 부탁드립니다
감사합니다 :)

--

--