오늘 Flutter로 작성한 소스 코드를 리팩토링하면서 긴 String을 만나게 되었다.
예전에 작성한 나의 앱에도 긴 String이 있는 경우가 있었는데, 소스코드 속에 넣어놓으니 상당히 지저분해보여서 정리하고 싶었던 기억이 있다. 일반적으로, 이용약관이나 개인정보처리방침 문자열 같은 것을 앱 소스코드 상에 포함시키는 경우에 이런 일이 자주 발생할 것 같다. 깔끔하게 만드는 방법을 알아보자.
1. 지저분한 코드 - Widget 클래스 내부에 static const 상수로 포함시키는 방식
일단 적당히 Widget 클래스 안에 static const 상수로 긴 스트링을 넣어놓은 모습이다. 스크린샷을 위해서 중간의 텍스트를 5~6줄 정도로 생략을 하였으나 원래는 100줄 이상되는 문자열이기 때문에 상당히 가독성을 떨어뜨린다. 이것을 고쳐보겠다.
2. 차선책 - constants/strings.dart 등의 상수 파일로 빼내는 방식
일반적으로 String을 포함해서 소스코드 내에세 공통적으로 사용되는 상수값들은 constants.dart, constants/strings.dart 등의 파일을 만들어서 빼내면 관리가 수월해진다.
하지만, 이용약관 같이 너무 긴 텍스트는 다른 상수값들에게도 민폐(?)를 끼치는 느낌이다. 이 String 하나 때문에 다른 상수값을 보려고 몇백줄을 스크롤을 내려야할 수도 있다. 그러므로 다른 방법을 써보자.
3. 깔끔한 방식 - assets/texts/terms.txt 와 같이 별도의 에셋 파일로 관리하는 방식
오늘 생각한 방법은 assets의 txt 파일로 빼내는 방식이다. 긴 String을 txt 파일로 빼내고, 해당 파일을 TextHelper라는 클래스를 통해 읽어와서 앱에 제공해주도록 구현하였다. 코드는 아래와 같다.
긴 String을 txt 파일로 분리해내고, pubspec.yaml에 assets으로 등록시킨다. 그리고, assets을 로드해야하므로 main 함수에서 TextHelper.initialize를 호출해준다. TextHelper의 경우, static late로 변수를 선언하였고, initialize 과정에서 해당 값을 채워주었다. TextHelper는 static 메소드와 필드만 존재하는 유틸성 클래스이므로 private 생성자로 인스턴스 생성을 막아주었다.
앱이 시작할 때, 텍스트 파일을 읽어와야하므로 어느 정도 오버헤드가 생길 수도 있겠지만(테스트해보지 않아서 확실하게는 모르겠다. 소스 코드 내의 상수로 놔두어도 결국엔 프로그램 로드 시에 메모리로 올라가야하니까 큰 차이가 없을지도 모르겠다), 적어도 코드 상으로는 훨씬 깔끔해지고 추후에 이용약관을 개정할 때도 훨씬 편하게 작업할 수 있을 듯 하다. 더욱 발전시키고 싶다면, 필요할 때 assets을 lazy하게 load하는 형태로 개선할 수도 있을 것 같다. 나는 편하게 사용하고 싶어서 main에서 initialize하는 형태로 만들었다. 너무 큰 text 파일의 경우, 앱 시동 시에 렉이 걸릴 수 있으므로 lazy하게 읽어오도록 개선하는 것이 좋을 것 같다.
혹시라도 더 좋은 방법이 있으신 분들은 공유해주시면 좋을 것 같습니다.
P.S.티스토리에서 Dart 코드 블럭이 지원이 안 되서 일단 스크린샷으로 넣었습니다. 소스코드 복사가 필요하신 분들은 아래의 소스코드를 복사하시면 될 것 같습니다. MIT 라이선스로 자유롭게 이용하시면 될 것 같습니다.
import 'package:flutter/services.dart';
class TextHelper {
static late String termsText;
static late String privacyText;
static Future<void> initialize() async {
final texts = await Future.wait([
rootBundle.loadString("assets/texts/terms.txt"),
rootBundle.loadString("assets/texts/privacy.txt"),
]);
termsText = texts[0];
privacyText = texts[1];
}
TextHelper._();
}
감사합니다.
좋은 하루 되세요~!
'개발관련' 카테고리의 다른 글
Google AdSense Site Verification 실패 시 해결 경험 (0) | 2023.12.17 |
---|---|
AWS에서 NAT Gateway의 비용을 낮춰보자! (0) | 2023.11.07 |
MySQL은 대소문자를 구분할까? 정답은 OS에 따라 다르다. (0) | 2023.10.25 |
Chrome Lighthouse 소개 - 개발한 사이트의 성능, 접근성, PWA, SEO를 체크해보자! (0) | 2023.07.23 |
AWS CLI 자동완성 기능 설정하기 (0) | 2023.07.13 |