🧐 문제상황 매일 새벽 5시마다 플러터 프로젝트 develop 브랜치에서 단위테스트를 실행시키고자 했다. 1. 이를 위해 EC2에 도커로 젠킨스를 배포했다.2. Flutter 는 Docker Hub 에 마땅한 이미지가 없어서 (개인이 올려놓은 플러터 이미지가 있긴했는데 스타수가 워낙 낮아 신뢰하기 어려웠다.) EC2 로컬에 직접 설치한상태였다. 이 상태에서 파이프라인 스크립트를 작성하고 build 를 해보았더니 젠킨스가 flutter 파일을 찾지못하고 failure해버리는 이슈가 발생했다.☺️ 문제 원인 분석 및 해결Jenkins가 Docker 컨테이너로 실행되면, 컨테이너는 자체 격리된 파일 시스템을 사용한다. 따라서, EC2 로컬에 설치된 Flutter와 Android SDK 경로를 인식하지 못하고..
최근 함수형 프로그래밍을 연습하던중 비동기 데이터를 받는 함수를 평소 사용하는 Future 대신 Task로 사용하는 것이 좀더 함수형 스타일에 가깝다는 것을 알게되었다. Future야 머.. 너무 많이 쓰이고 다른 언어에도 다 있는거라 당연하다고 치지만 Task..? 이건 Swift Concurrency 에서 보고 다른 언어 쓸 땐 못봤던 네이밍인데 이게 왜 Future 대신 함수형 프로그래밍에서 쓰이는거지..? 라는 궁금증이 생겼다. 그래서 코드를 작성해보고 로그를 확인해보니, Future와 Task의 차이에 대해 확실히 알게되었다. 위 코드를 통해 알 수 있는 차이점실행 시점함수 호출 시 즉시 실행.run() 호출 시 실행.로그의 순서fetchNumber 호출 직후 "Fetching number..
네비게이션 탭바를 Stateful 위젯으로 만들어 탭할시 파란색 아이콘 이미지로 바꿀 수 있었으나가급적 Stateless 위젯을 사용하여 최적화 시키고 싶었다.Statless 위젯을 사용하면서 이미지의 색을 바꾸는 방법에 대해 알아보자.배경 지식참고링크: https://api.flutter.dev/flutter/dart-ui/BlendMode.html Flutter의 UI렌더링 과정 이해하기 Flutter의 UI렌더링 과정은 아래와 같다개발자가 작성한 코드를 통해 위젯 트리가 생성된다.위젯 트리가 빌드된 후, Flutter는 상태와 위젯트리 생명주기를 관리하는 Element Tree, 그리고 위젯의 위치와 크기 정보를 가지고 있는 Render Tree를 만든다.상위위젯부터 하위위젯까지 제약조건이 잡히고,..
링크: https://product.kyobobook.co.kr/detail/S000003470645 Dependency Injection Principles, Practices, and Patterns | Seemann, Mark - 교보문고Dependency Injection Principles, Practices, and Patterns |product.kyobobook.co.krDependency Injection - Mark Seemann, Steven van Deursen 을 읽고 의존성 주입에 대한 포스트를 작성했습니다 :) 1. 왜 의존성 주입을 해야할까? 왜 의존성 주입을 해야할까? 결론부터 말하자면 객체간의 느슨한 관계 형성을 위함이다. 이에 대해 조금 더 자세히 들여다보자. 객체는..
Address메모리에는 주소가 있다. 이러한 주소에는 두가지 종류, 가상메모리주소와 물리적 메모리 주소가 있다. 프로그램이 실행되면 프로세스가 되며 독자적인 주소공간이 형성된다. 이때 효율적인 메모리 사용을 위해 CPU는 가상메모리(logical address, virtual address)를 참조하고 가상메모리는 실제 메모리(physical memory)를 참조하게 된다. 이러한 엮여있음을 주소바인딩이라고 한다. 가상 메모리에서 물리적 메모리로 주소변환이 되는 순간은 크게 3가지 시점으로 나누어 볼 수 있다. Compile time binding 컴파일 시점에 물리적 메모리 주소가 결정된다. 가상메모리 주소가 사실상 물리적 메모리 주소. 컴파일 바인딩에 의해 만들어진 코드를 절대코드(absolute..
Deadlock데드락은 4가지 조건을 만족시킬 때 발생한다. Mutual Exclusion(상호배제)한 프로세스 자원을 얻으면 해당 자원을 독점적으로 사용한다. No preemption (비선점)자원을 가지면 빼앗기지 않음 Hold and wait다른 자원을 점유하기 위해 기다릴 때는 내가 들고 있는 자원을 점유한 상태에서 기다린다. Circular wait자원을 기다리는 프로세스끼리 참조순환이 되어야만함사각형R은 자원, 동그라미P는 프로세스이다. 작은 점은 자원의 인스턴스 갯수를 의미한다. 화살표를 따라갔을 때 만약 사이클이 형성이 안된다면 데드락이 아니다. 만약 사이클이 있고, 자원당 인스턴스가 하나만 있으면 데드락, 자원당 인스턴스가 여러개라면 데드락 가능성이 있는 상태이다.(만약 자원당 인스턴스..
병행제어MultiLevel Queue란 Ready queue를 여러개로 분할하는 것을 말한다. Multi level Queue에서는 큐의 종류를 두가지로 나눈다. -> foreground / background. 큐를 나누는 기준은 사용자와 ineteract를 하는경우에 foreground 큐에 그렇지 않은 경우에 background 큐에 둔다. forground는 사용자와 interactive하기 때문에 더 많은 CPU time 을 준다. 보통 Time slice로 RR알고리즘을 사용하여 80%는 foreground, 20%는 FCFS 알고리즘으로 background에 할당하여 starvation을 방지한다. Multi level feedback queue 는 기존의 multilevel queue보다 ..
CPU & I/O Burst프로그램 실행은 결국 CPU로 작업하는 단계와 I/O 작업을 하는 단계를 연속해서 지나가는 과정이다. 여기서 CPU burst는 CPU가 기계어를 해석하고 있는 단계, I/O하는 단계를 I/O burst라고 부른다. 프로그램별로 burst의 간격은 다르다. 주로 사람과 ineract하는 프로그램이 위처럼 버스트가 번갈아 등장한다. 연산량을 많이 필요로하는 작업은 CPU Burst의 간격이 넓어지게된다. 만약 I/O를 길게 쓰는 프로그램이 있다면 I/O bound job(process) 라 부르고 , CPU를 길게 쓰는 프로그램을 CPU bound job(process)이라고 부른다. 이 때 Burst Time 종류에 따라 CPU 우선권이 다르게 주어진다. I/O bound jo..
프로세스의 생성프로세스는 부모 프로세스에 의해 만들어져 자식 프로세스가 만들어지는 구조이다 (최상단 부모 프로세스는 init 프로세스로 부팅 과정에서 커널에 의해 생성되는 첫 번째 사용자 공간 프로세스). 이렇게 되다보니 자연적으로 프로세스 트리가 형성된다. 이때 자식 프로세스끼리는 자원을 공유하기도 하지만 보통은 서로 독립적인 프로세스로 CPU를 두고 경쟁하지 기타 자원 공유는 잘 하지 않는다. 프로세스가 생성될 때 자식 프로세스는 부모프로세스의 공간을 복사하고 자신만의 데이터를 위에 올리게된다. 여기서 복제는 fork() 메서드에 의해, 복제한 데이터 위에 자기 데이터를 올리는건 exec() 메서드로 시스템 콜을 하여 새로운 프로그램에 메모리를 올리게 된다.프로세스의 종료 (Termination)..
Rx를 실제 사용한다고 생각해보자. Rx를 사용할 때 순서를 생각해보면 아래와 같이 크게 3가지 과정을 거칠것이다. 1. 먼저 Observable을 만든다.2. 원하는 연산자를 사용한다.3. 구독해서 사용한다. 그렇다면 위에서 반드시 만나는 문제는 어떤 Observable 과 Operator 를 사용할 것이냐이다. 이때 알아야할 지식이 바로 Hot Observable & Cold Observable 개념이다. 두 옵저버블의 특성을 알아보고 실전에서 어떻게 쓰이는지 살펴보자 Unicast vs Muticast먼저 Observable에는 개별적으로 스트림을 던지는 녀석과 던지는 스트림을 공유하는 녀석이 있다. 전자를 Unicast로, 후자인 multicast라고 부르며 Unicast 를 하는 대표적인 예로..