본문 바로가기

전체 글

(730)
[Kafka] 데이터 파이프라인으로 적합한 이유 카프카가 왜 데이터 파이프라인으로 활용하게 되는지 살펴보자 1. 높은 처리량 카프카는 프로듀서가 브로커로 데이터를 보낼때와 컨슈머가 브로커로부터 데이터를 받을때 모두 묶어서 전송한다. 많은 양의 데이터를 송수신할 때 맺어지는 네트워크 비용은 무시할 수없다. 동일한 양의 데이터를 보낼때 네트워크 통신 횟수를 최소한으로 줄인다면, 동일 시간 내에 더 많은 데이터 를 전송할 수 있다. 또한 파티션 단위를 통해 동일 목적의 데이터를 여러 파티션에 분배하고, 데이터를 병렬 처리할 수 있다. 파티션 개수만큼 컨슈머 개수를 늘려서 동일 시간당 데이터 처리량을 늘리는 것이다. 최소한의 네트워크 비용으로 최대한의 데이터 전송이 가능하다는 것이 결론이다. 파티션은 최소 1개이상, N개까지 가능하다. 컨슈머 개수를 한개 늘..
[Kafka] 카프카의 구조 링크드인에서 만들었다. 데이터를 생성하는 소스애플리케이션과 데이터가 최종 적재되는 타깃애플리케이션을 연결해야할때 사용한다. 소스 애플리케이션의 타깃애플리케이션의 개수가 점점 많아지면서 문제가 생겼다. 내부데이터 흐름을 개선하기 위해 한곳에 모아서 처리를 하는 방식이 가장 큰 특징이다. 카프카는 토픽이라는 개념을 바탕으로, 프로듀서와 컨슈머로 나눠지면 해당 파티션으로 전송이 된다. 프로듀서는 특정 데이터에 대해서 보내게 되면, 파티션 중 하나의 데이터가 저장되고 그 파티션의 내부구조는 큐 형태로 동일하게 구현이 되어있다. 파티션마다 다르게 큐에 담겨서 데이터가 컨슈머에게 전달이 되게 된다. (순차적으로) 큐에 데이터를 보내는 것이 프로듀서고 큐에서 데이터를 가져가는 것이 컨슈머 이다. 또한 컨슈머는 큐에 ..
[Flutter] BottomNavigation 구현 요새 앱에서 대세로 많이 쓰고 있는 패턴이다. 메인에서 바텀 네비게이션 바로 이벤트를 주자. 안드로이드 보다 쉽다. 우선 전체코드는 아래와 같다. import 'package:flutter/material.dart'; import 'package:flutter/gestures.dart'; import 'dart:ui'; import 'package:google_fonts/google_fonts.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:smithflutter/WidgetUtil.dart'; import 'package:smithflutter/utils.dart'; import 'Person.dart..
[Flutter] 외부 서버 데이터 송수신 필수적으로 외부 백엔드 서버를 호출해서 데이터를 받아와야한다. 이에 필요한 작업을 해보도록 하자 일단 유틸로 하나 만들것이다. 메소드는 Post,Get,Put,Delete로? 무튼 1. pub get || pubspec에 http추가 flutter pub add http http: ^0.13.5 2. 유틸성 코드 추가 백엔드 서버에 이러한 내용이 있다고 가정하자. @PostMapping("/sample") public String test(){ return "hi sample!"; } 플러터 소스는 아래와 같다. var url = Uri.http('localhost:8080', 'sample'); var response = await http.post(url, body: {'name': 'doodle',..
[Flutter] 내부 저장 디비를 활용해보자 플러터에서 단말기 내부 디비를 사용할 수있다. 사용해보자 1. pubspec.yaml shared_preferences: ^2.2.0 2. 인스턴스 선언 & 데이터 쓰기 class Scene extends StatelessWidget { late SharedPreferences sp; _loadData() async{ sp = await SharedPreferences.getInstance(); sp.setString("test", "smithtestthisis"); } 3. 데이터 읽기 GestureDetector( onTap: (){ Navigator.pushNamed(context, '/second', arguments: [Person('gd','smith'),Person('gd2','smith2'..
[Flutter] 위젯 별로 공통 함수로 분류하기 플러터는 소스가 너무 길어진다. 그래서 관리하기도 어렵고 소스를 이해하기도, 유지보수하기도, 그리고...가독성도 떨어진다. 그래서 유틸성으로 개발해서 관리해보자 class WidgetUtil{ Widget getListView(List persons){ return ListView.builder( shrinkWrap: true, itemCount: persons.length, itemBuilder: (BuildContext context,int index){ return Container( height: 50, child: Text(persons[index].id), ); }); } } Container( child: new WidgetUtil().getListView(persons), ) ,Contai..
[Flutter] 동적 리스트뷰 생성하기 리스트 뷰의 빌더로 사용한다. itemBuilder로 해야 대량의 데이터를 처리하기에 용이하다고 한다. Container( //Listview child: ListView.builder( shrinkWrap: true, itemCount: persons.length, itemBuilder: (BuildContext context,int index){ return Container( height: 100, child: Text(persons[index].id), ); }) ) 이런식으로 사용하면 아래와 같이 결과가 나타난다. 이런식으로 동적으로 리스트가 그려진다.
[Flutter] 정적 리스트뷰 앱에 거의 필요한 요소이다. 이전에 포스팅한 내용을 가지고, 해당 사람의 정보를 리스트뷰로 보여주자. Container( //Listview child: ListView( shrinkWrap: true, padding:const EdgeInsets.all(8), children: [ Container( height: 50, color: Colors.amber[600], child:const Center( child:Text('11111') ) ), Container( height: 50, color: Colors.amber[500], child:const Center( child:Text('22222') ) ), Container( height: 50, color: Colors.amber[400], ch..