본문 바로가기

분류 전체보기58

Flutter iOS 파일 다운로드 문제 여태까지 문제가 없다가 갑자기 왜? iOS 애플리케이션에서 파일 다운로드 후 해당 파일이 3rd-party app으로 공유되지 않는 이슈가 리포트됐습니다.이를 수정하기 위해 처음 리포트됐을 때는 확인하다가 큰 문제가 아니라고 생각하고 할일에만 넣어두고 보지 않았죠.그러다 점점 문의가 쌓이고, 도저히 가만 놔둘 수 없겠다. 하는 생각이 들어 수정을 결심했습니다.하지만 아무리 AI에게 물어봐도 해결되지 않고, 구글링을 해도 동일한 케이스의 문서가 없어서 골머리를 앓았습니다.문제점파일 다운로드를 할 때, 추가적인 패키지를 쓰고싶지 않아 dio 패키지의 download 메서드를 사용하여 파일을 직접 Write 했습니다.제 생각에는 이 동작이, 시스템에서 수행하는 다운로드가 아닌 앱에서 자체 write를 하여 i.. 2025. 7. 30.
객체 지향 설계 원칙 (SOLID) - SRP / OCP 단일 책임 원칙 (SRP / Single Responsibility Principle)하나의 클래스는 하나의 책임만 가져야 합니다. 즉, 하나의 클래스는 하나의 기능에 집중해야한다는 것입니다.그 예로, 맥가이버 칼을 들 수 있습니다.이 칼은 실생활에서는 휴대성과 활용성이 뛰어납니다.하지만, 소프트웨어 관점에서는 하나의 객체가 많은 기능을 담당합니다.  (칼, 맥주/와인 오프너 ...)여러 기능을 책임지고 있기 때문에 기능을 수정하면 같은 객체 내의 다른 기능에게 이슈가 전파될 가능성이 있습니다.즉, SRP는 이 기능의 변경이 이루어질 때 연쇄(파급) 효과가 적어야 합니다. 개방-폐쇄 원칙 (OCP / Open-Closed Principle)기존의 코드를 수정하지 않고 기능을 추가할 수 있도록 설계해야 합.. 2024. 5. 30.
영속성 컨텍스트 (Persistence Context) 0. 영속성 컨텍스트란? Entity를 영구히 저장하는 환경이라고 해석해 볼 수 있습니다. Entity Manager를 이용해 저장하거나 조회하면 Entity Manager는 영속성 컨텍스트에 해당 Entity를 보관 및 관리합니다. 1. 특징 1-1. 영속성 컨텍스트가 관리하는 Entity는 반드시 식별자가 존재해야 한다. 영속성 컨텍스트는 Entity를 식별자 값(@id로 테이블의 기본키와 맵핑한 값)으로 구분하기 때문에 반드시 존재해야 합니다. 만약 객체에 식별자가 없을 경우 Exception이 발생합니다. 1-2. 1차 캐시 영속성 컨텍스트 내부에는 캐시가 존재합니다. 이를 1차 캐시라고 부르며, 영속 상태의 Entity를 이곳에 저장합니다. 이 1차 캐시는 Key-Value 형태로 저장되며 Ke.. 2024. 2. 10.
Entity의 생명주기 (Entity LifeCycle) JPA에서 Entity는 4가지의 생명주기를 가집니다. 비영속 (New / Transient) Entity를 생성하고 아직 저장하지 않은 상태입니다. 따라서, 영속성 컨텍스트 혹은 데이터베이스와는 전혀 연관이 없는 상태입니다. Member member1 = new Member(); member1.setId(1); member1.setUserName("회원1"); 영속 (Managed) Entity Manager를 통해 Entity를 영속성 컨텍스트에 저장한 상태 혹은 저장된 Entity를 조회한 상태입니다. 영속성 컨텍스트가 관리하는 Entity를 이 영속 상태라고 합니다. Member member2 = new Member(); member2.setId(2); member2.setUserName("회원2.. 2024. 2. 9.
플러터 웹뷰에서 물리 키보드 방향키가 동작하지 않는다. 메인 컴포넌트가 웹뷰로 구성된 페이지에서 물리 키보드의 방향키가 동작하지 않는다는 문의를 받았습니다. 재현해보니 정말 동작하질 않았습니다. 아이패드같은 태블릿으로 앱을 사용할 때 키보드를 쓰는 사용자는 충분히 불편하겠다 싶어 분석결과, 아래와 같이 조치했습니다. 물론 플러터 엔진의 문제로 보여 임시 조치이며, webview_flutter와 flutter_inappwebview 공통적으로 발생하는 문제입니다. 문제가 발생하는 코드 당연히 일반적인 구현입니다. @override Widget build(BuildContext context) { return Scaffold( child: SafeArea( child: InAppWebView( ... .. . ), ), ); } 조치한 코드 WebView 위젯(.. 2024. 2. 6.
Dockerfile에 환경변수를 추가해보자. 📌 지난 글 1. Dockerfile을 이용해 Docker image 생성해보자. 지난 글에서는 임의의 애플리케이션을 Dockerfile을 통해 Docker Image를 생성하는 것을 알아봤습니다. 하지만 운영할 땐 단순히 Application을 띄우는 것이 아니라 여러 가지 환경변수 등을 주입해줘야 합니다. 예를 들어, 개발환경이냐 운영환경이냐에 대한 spring profiles가 그 대표적인 예일 것입니다. 이에, 우리는 이번 게시글을 통해 Dockerfile에 환경 변수를 주입하는 법을 확인하고자 합니다. 1. 지난 글에서 생성한 Dockerfile 아래의 Dockerfile은 1. Amazon Corretto JDK 17을 가지고 있는 경량화 리눅스(Alpine)에 2. 빌드된 spring boo.. 2023. 12. 17.