하루에 5분씩만 투자해서 함께 공부해요~ 댓글은 개별 포스트 클릭하면 작성가능합니다~

Flutter에서 느려지는 현상 없는 폴더선택 다이얼로그 만들기

  • 요즘 스마트폰 용량이 TB급으로 늘어나면서, 사진을 찍어놓고 PC에 옮기지 않는 분들이 많을겁니다.
  • 사진 폴더에 파일이 많다보니 폴더 내부에 파일을 로딩할 때 시간이 오래걸리게 됩니다.
  • 저 같은 경우에 유튜브에서 사용하기 위한 영상을 PC로 옮기려다 보니, 이럴 때 지연되는 시간이 아깝더라구요.
  • 그래서 사진을 년/월/일 별로 폴더화 해서 저장해서 필요한 폴더만 PC로 옮기곤 합니다.
  • 그런데 이것도 매번 수동으로 하려고 하니까 귀찮더군요, 그래서 폴더로 저장하는 것을 자동화 하는 앱을 만들어 봤어요.
  • 하지만 PC에서 느려지는 문제는 당연히 스마트폰에서도 똑같이 발생하더군요
  • 자동화해서 옮길 대상 폴더를 선택하는 다이얼로그도 결국 해당 폴더에 있는 파일 정보를 훑어야 표출할 수 있기 때문에, 결국 느려지는 문제는 계쇡되게 됩니다.
  • 이 문제를 해결하기 위해서 여러 유형의 폴더선택 다이얼로그들을 찾아봤는데요…
    • directory.dart 에 존재하는 listSync 함수를 이용해서 파일 리스트를 가져오는 것만 있더군요.
    • 이 함수는 모든 정보를 가져올 때 까지 기다려야 하기 때문에, 폴더내에 파일이 많으면 느려지는 현상이 발생합니다.
    • 저는 listSync 함수가 아닌 list 함수를 이용해 봤어요.
    • list 함수는 stream을 이용하기 때문에, ListView.builder 와 연결해서 파일 정보를 가져올 때 마다 state를 수정하면서 갱신하면 됩니다. 이러면 지연 현상이 발생하지 않습니다.
광고를 클릭해주시면 블로그운영에 큰 힘이 됩니다.
  • 주요 코드부는 아래와 같습니다.
dstream = directory!.list();
dstream.listen((item) {
  debugPrint(item.path);
  if (FileSystemEntity.isDirectorySync(item.path)) {
    setState(() {
      directories.add(item);
    });
  }
}, onDone: () {
  setState(() {
    debugPrint("Done Path Find");
    isDone = true;
  });
});
  • 이때 다이얼로그를 구성하는 코드는 아래 레포지토리를 참고했어요.
    • Easy-Folder-Picker
    • InheritedWidget과 WidgetsBindingObserver를 이용한 디자인 패턴이 상당히 효과적이더라구요.
    • 물론 이 패키지도 listSync를 쓰기 때문에 지연현상은 발생합니다.
  • 제가 만든 어플의 레포지토리는 아래 링크입니다.

HEIC 파일을 JPG와 PNG로 변환해주는 프로그램

  • 예전에 heic 파일 변환 관련한 코드를 이 블로그에 올린적이 있는데요.
  • 정작 실제로 사용할 일이 생기니까, 실행파일로 만들어야 편하겠더라구요. 그래서 만들어 봤습니다. 소스코드도 함께 공개할게요. 사용방법은 아래와 같습니다.
    • h2j.exe --input HEIC_파일이_있는_폴더 --output 저장할_폴더 --mode jpg|png
    • output을 생략하면 input 폴더와 같은 폴더에 저장됩니다.
    • 변경대상 파일형식은 jpg와 png로 구분하며, 생략하면 jpg로 저장됩니다.
  • 파일 다운로드
  • 코드는 아래와 같습니다.
import argparse

from PIL import Image
from pillow_heif import register_heif_opener
import os

def heic_to_jpg(input_folder, output_folder, ext):
    """
    HEIC 파일을 JPG 파일로 변환하는 함수

    Args:
      input_folder: HEIC 파일이 있는 폴더 경로
      output_folder: 변환된 JPG 파일을 저장할 폴더 경로
    """

    for root, _, files in os.walk(input_folder):
        for file in files:
            if file.endswith('.heic'):
                heic_path = os.path.join(root, file)
                jpg_path = os.path.join(output_folder, os.path.splitext(file)[0] + '.' + ext)

                try:
                    with Image.open(heic_path) as img:
                        if ext == "jpg":
                            img.save(jpg_path, 'JPEG')
                        elif ext == "png":
                            img.save(jpg_path, 'PNG')
                        print(f"Converted {heic_path} to {jpg_path}")
                except OSError as e:
                    print(f"Error converting {heic_path}: {e}")

parser = argparse.ArgumentParser()
parser.add_argument('--input', default='', help="input folder")
parser.add_argument('--output', default='', help="output folder")
parser.add_argument('--mode', default='jpg', help="output folder")
args = parser.parse_args()
register_heif_opener()
input_folder = args.input
output_folder = args.input if not args.output else args.output

if args.mode == "jpg" or args.mode == "png":
    heic_to_jpg(input_folder, output_folder, args.mode)

AWS API-GATEWAY에서 우리쪽 서버가 발생시킨 에러코드를 그대로 전달하는 방법

  • API-GATEWAY를 사용하다 보면 에러 응답 코드라던가, 응답 형식 등을 JSON으로 규정할 수 있음을 알 수 있습니다.
  • 이러다 보니까 우리가 사용하고 있는 에러 응답 코드들을 일일이 JSON으로 다 정의해서 올려야 하는건가? 하고 의구심이 들텐데요.
    • 안정적이고 다양한 확장 가능성이 있는 “좋은” 방법입니다만, “효율적”인 방법인지는 잘 모르겠네요.
    • 왜냐면 AWS가 제공하는 대시보드 전반의 불편한 UI 때문에, 이러한 JSON 입력도 상당히 까다롭기 때문입니다.
    • 저는 그래서 간단하게 PROXY만 제공하고 싶다면 아래와 같은 방법을 추천합니다.
  • 먼저 해당하는 메소드에서 통합요청탭의 편집 버튼을 클릭해주세요.
    • alt text
  • 그런다음 아래처럼 HTTP 프록시 통합을 체크하면 끝!
    • alt text