Karl

Karl

karl@breezymind.com

๐Ÿ“ seoul
flutter

Flutter, Android Version ๋ณ€๊ฒฝ

1.๋ฒ„์ „๋ณ€๊ฒฝ * Project > pubspec.yamlย  version: 1.0.0+19 * Project > android > app > build.gradle def flutterVersionCode = localProperties.getProperty('flutter.versionCode') if (flutterVersionCode == null) { flutterVersionCode = '2' } def flutterVersionName = localProperties.getProperty('flutter.versionName') if (flutterVersionName == null) { flutterVersionName = '1.0.0+19' } * Project > android > local.propertiesย  flutter.buildMode=release flutter.versionName=1.

Kafka Connect ์™€ CDC ์— ๋Œ€ํ•ด์„œ
kafka

Kafka Connect ์™€ CDC ์— ๋Œ€ํ•ด์„œ

1.๊ฐœ์š” CDC (Change Data Capture) ๋ฅผ ํ…Œ์ŠคํŠธ ํ•ด๋ณด๊ณ ์ž MS SqlServer ๋‚ด ํ…Œ์ด๋ธ”์„ Debezium SqlServer Connector ๋กœ Kafka Cluster ์— Topic ์œผ๋กœ ๋ณ€๊ฒฝ ๋‚ด์—ญ์„ ์ „์†กํ•˜๋Š” "์†Œ์Šค ์ปค๋„ฅํ„ฐ" ๋ฅผ ๊ตฌ๋™ ์‹œํ‚ค๋Š” ๊ณผ์ •์„ ๊ธฐ๋กํ•œ๋‹ค. CDC๋Š” Source ๋ฐ์ดํ„ฐ์˜ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•˜๊ณ  Kafka Cluster ์— ์ด๋ฒคํŠธ ๋ ˆ์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋ฉฐ, CDC ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋‹ค์–‘ํ•œ Source ์—์„œ

AdTech ์˜ ๊ตฌ์„ฑ์š”์†Œ
adtech

AdTech ์˜ ๊ตฌ์„ฑ์š”์†Œ

AdTech ๋Š” ๊ด‘๊ณ ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•œ ๊ด‘๊ณ ๊ธฐ์ˆ ์„ ์ด์นญํ•œ๋‹ค. ๋‹จ์ˆœํžˆ ๋ณด๋ฉด ๊ด‘๊ณ ๋ฅผ ๊ฒŒ์žฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐ„์„ "ํŒ๋งค" ํ•˜๋Š” ๊ฒŒ์‹œ์ž์™€ ๊ทธ ๊ณต๊ฐ„์„ "๊ตฌ๋งค"ํ•˜๋Š” ๊ด‘๊ณ ์ฃผ ์‚ฌ์ด์— ์กด์žฌํ•˜๋Š” ๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ๊ณผ ์„œ๋น„์Šค๋ฅผ ์ง€ํƒฑํ•˜๋Š” ๊ธฐ์ˆ ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๊ฒ ๋‹ค. 1. ์ฃผ์š” ๊ตฌ์„ฑ์š”์†Œ ์ฃผ์š” ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ํ•˜๋‚˜ ํ•˜๋‚˜ ๋ณด๊ธฐ ์ด์ „์— SSP ์™€ DSP ๊ด€์ ์—์„œ ์‹œ์ž‘ํ•˜๋Š” ๊ฐ„๋žตํ•œ ํ๋ฆ„์„ ์ดํ•ดํ•˜๊ณ ์ž ํ•œ๋‹ค.

Kafka Streams, KTable-KStream Join
java

Kafka Streams, KTable-KStream Join

1. ๊ฐœ์š” Stateful ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์— Kafka ๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ Kafka Streams ๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค. Stateful, Stateless ํ•˜๋‹ค๋Š” ํ‘œํ˜„์ด ์žˆ๋Š”๋ฐ ์—ฌ๊ธฐ์„œ Stateless ํ•˜๋‹ค๋Š” ๊ฒƒ์€ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ์—†์ด ํ•˜๋‚˜์˜ ์ด๋ฒคํŠธ๋‚˜ ๋ฐ์ดํ„ฐ๋กœ ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งˆ๊ฐ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์˜๋ฏธ์ด๊ณ , ๋ฐ˜๋Œ€๋กœ Stateful ํ•˜๋‹ค๋Š” ๊ฒƒ์€ ์ด์ „์˜ ์—ฌ๋Ÿฌ ์ƒํƒœ์˜ ๊ฐ’๋“ค์„ ์ €์žฅํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€ ์ด๋ฒคํŠธ๋‚˜

intellij, Code Convention ๊ณผ Formatter
java

intellij, Code Convention ๊ณผ Formatter

intellij ์—์„œ Code Convention ์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์„ค์ •์„ ๊ธฐ๋กํ•œ๋‹ค. Code Convention ์€ Naver ์บ ํผ์Šค ํ•ต๋ฐ์ด Java ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. ์บ ํผ์Šค ํ•ต๋ฐ์ด Java ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜ 1. Code Style, Formatter ์„ค์ • ์•„๋ž˜ ์ฃผ์†Œ์˜ naver-intellij-formatter.xml ๋ฅผ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์•„์„œ Import Scheme ์—์„œ ๋กœ๋“œ ํ•œ๋‹ค. hackday-conventions-java/rule-config/naver-intellij-formatter.xml at master ยท naver/hackday-conventions-java์บ ํผ์Šค

Docker Compose ๋กœ Redis Cluster ๊ตฌ์ถ•ํ•˜๊ธฐ
redis

Docker Compose ๋กœ Redis Cluster ๊ตฌ์ถ•ํ•˜๊ธฐ

1. Redis ํด๋Ÿฌ์Šคํ„ฐ ํ™˜๊ฒฝ ๋‘˜๋Ÿฌ๋ณด๊ธฐ Redis Cluster ์˜ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค. ์ƒ๋‹จ์— ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์žˆ๊ณ  ์ตœ์†Œ 3๊ฐœ์˜ Node ๊ฐ€ ์กด์žฌํ•˜๊ณ  ๊ฐ ๋…ธ๋“œ๋Š” Master - Slave ๊ตฌ์กฐ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, Master ๊ฐ€ ์ฃฝ์„๋•Œ ๋ณต์ œ๋ณธ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” n๊ฐœ์˜ Slave ์ค‘ ํ•˜๋‚˜ ๊ฐ€ Master ๋ฅผ ๋Œ€์ฒด ํ•˜๋Š” ํ˜•ํƒœ์ด๋‹ค. TaskVibes: ADHD Simple Manage -

Redis, JSON vs MSGPACK
redis

Redis, JSON vs MSGPACK

1. ๊ฐœ์š” JVM ํ™˜๊ฒฝ์˜ Webflux ์„œ๋ฒ„์—์„œ Redis ์‚ฌ์šฉ์‹œ JSON ์„ ์‚ฌ์šฉํ• ๋•Œ์™€ MessagePack ์„ ์‚ฌ์šฉํ• ๋•Œ ์–ด๋–ค ์ ์ด ๋‹ค๋ฅธ์ง€ ํ™•์ธํ•˜๊ณ ์ž ํ•˜๋ฉฐ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌํ˜„ํ•˜๊ณ  ๋ฒค์น˜๋งˆํฌ ํ•˜์˜€๋‹ค. 2. ๊ตฌํ˜„ 1) Dependency implementation 'org.msgpack:jackson-dataformat-msgpack:0.9.4' 2) Configure Java-based configuration ์œผ๋กœ ReactiveRedisTemplate ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๋“ฑ๋กํ•œ๋‹ค. Key ๋Š” String ์œผ๋กœ ์ง๋ ฌํ™”ํ•˜๊ณ 

Resilience4j, CircuitBreaker & TimeLimiter ์ ์šฉ์— ๋Œ€ํ•œ ๊ธฐ๋ก
java

Resilience4j, CircuitBreaker & TimeLimiter ์ ์šฉ์— ๋Œ€ํ•œ ๊ธฐ๋ก

Resillience4j ์˜ Circuit Breaker ์™€ Time Limiter ์— ๋Œ€ํ•œ ๊ธฐ๋ก์„ ๋‚จ๊ธด๋‹ค. 1. ๊ฐœ์š” ์ผ๋ฐ˜์ ์œผ๋กœ ์„œ๋น„์Šค๋ฅผ ์šด์˜ํ•˜๋‹ค ๋ณด๋ฉด ํŠน์ • ์ด๋ฒคํŠธ๋‚˜ ์‹œ๊ฐ„๋Œ€์— ํŠธ๋ž˜ํ”ฝ์ด ๋ชฐ๋ฆฌ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๊ณ  ๋ถ€๋ถ„์ ์œผ๋กœ DB ๋‚˜ Cache ์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒ ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์ด ์žˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ์—์„œ ๋Œ€์‘ ํ•  ์ˆ˜ ์žˆ๋Š” PlanB ๋ฅผ ์ค€๋น„ ํ• 

kafka

Docker Compose ๋กœ Silicon Mac์—์„œ KRaft, Kafka Cluster ๊ตฌ์ถ•ํ•˜๊ธฐ

์˜ค๋žœ๋งŒ์— Kafka ๋ฅผ ๋ณผ ์ผ ์žˆ์–ด์„œ Docker Compose ํ™˜๊ฒฝ์œผ๋กœ Kafka 3.5.1 ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ๊ธฐ๋ณธ์ ์ธ ํ™˜๊ฒฝ์„ ํ…Œ์ŠคํŠธ ํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. 1. Kafka ํด๋Ÿฌ์Šคํ„ฐ ํ™˜๊ฒฝ ๋‘˜๋Ÿฌ๋ณด๊ธฐ Zookeeper ํ™˜๊ฒฝ์€ ์˜ค๋ž˜ ๋˜๊ธฐ๋„ ํ–ˆ๊ณ  ์ด๋ฏธ์ง€๋ฅผ ์ƒˆ๋กœ ๋ฐ›์•„์„œ ์˜ฌ๋ ค์•ผ ํ•˜๋Š” ๊ด€๊ณ„๋กœ KRaft ๋ฐฉ์‹์˜ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. ํ•ด๋‹น ๋ฐฉ์‹์˜ ์ฐจ์ด๋Š” ๋ธŒ๋กœ์ปค์˜ ID, ํ˜ธ์ŠคํŠธ, ํฌํŠธ ๋“ฑ์˜ ์ •๋ณด,

java

Spring Boot, WebClient ์งง์€ ์‚ฌ์šฉ๊ธฐ

SpringBoot WebClient์€ Spring 5.0์—์„œ ๋„์ž…๋œ Reactive HTTP ํด๋ผ์ด์–ธํŠธ์ด๋‹ค. RestTemplate์˜ ๋Œ€์•ˆ์œผ๋กœ, HTTP ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ ์œ„ํ•œ ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ธ API๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค. ์ด ๊ธฐ๋ก์€ WebFlux ๋ฅผ ํ•™์Šตํ•ด๊ฐ€๋Š” ์ž…์žฅ์—์„œ BFF ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค๋Š” ๊ฐ€์ •ํ•˜์— Member, Banner ์˜ ๋ชฉ๋ก์„ ์ œ๊ณตํ•˜๋Š” API ๋ฅผ ํ˜ธ์ถœํ•ด์„œ ํ•˜๋‚˜์˜ API ๋กœ ๋ฌถ์–ด FrontEnd ๋ฅผ ์œ„ํ•œ API ๋ฅผ ์ž‘์„ฑ ํ•˜๋Š” ๊ฒƒ์„

FastAPI (Python) vs Fiber (Go) vs Spring Webflux (Java)
benchmark

FastAPI (Python) vs Fiber (Go) vs Spring Webflux (Java)

FastAPI (Python), Fiber (Go), Spring Webflux (Java) ๊ฐ ์–ธ์–ด๋ณ„๋กœ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ  ๊ฐ ์–ธ์–ด์˜ ์Šค๋ ˆ๋“œ ๊ด€๋ฆฌ์™€ ์ด๋ฒคํŠธ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ์„ฑ๋Šฅ์„ ๋น„๊ตํ•˜๊ณ  ์‹ถ์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๊ธฐ์— ์ดˆ๋‹น ๋ช‡๊ฑด์˜ ์š”์ฒญ์„ ์–ผ๋งˆ๋‚˜ ์•ˆ์ •์ ์ด๊ณ  ๋น ๋ฅด๊ฒŒ ์‘๋‹ต ํ•˜๋Š”์ง€๋ฅผ ๋ฒค์น˜๋งˆํ‚น ํ•ด๋ณด์•˜๋‹ค.

๋‰ด์Šค ๊ธฐ์‚ฌ ์ˆ˜์ง‘ํ•ด์„œ llama2 ์— ์งˆ์˜ํ•˜๊ธฐ (feat. Silicon ๋งฅ๋ถ with GPU)
ai / ml

๋‰ด์Šค ๊ธฐ์‚ฌ ์ˆ˜์ง‘ํ•ด์„œ llama2 ์— ์งˆ์˜ํ•˜๊ธฐ (feat. Silicon ๋งฅ๋ถ with GPU)

M1/M2 ๊ฐ™์€ Silicon Mac ๊ณ„์—ด์—์„œ GPU ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ llama2 ๋ฅผ ํŒŒ์ธํŠœ๋‹ ํ•ด๋ณด๊ณ , ๋‰ด์Šค๊ธฐ์‚ฌ๋ฅผ Embedding ํ•˜์—ฌ langchain ์œผ๋กœ ์–ผ๋งˆ๋‚˜ ๋งŒ์กฑ์Šค๋Ÿฌ์šด ๋‹ต๋ณ€์„ ํ•˜๋Š”์ง€๋ฅผ ํ…Œ์ŠคํŠธ ํ•ด๋ดค๋‹ค.

Embedding์œผ๋กœ Llama2 ์‘๋‹ต ๋ณด์ •ํ•˜๊ธฐ (feat. langchain)
ai / ml

Embedding์œผ๋กœ Llama2 ์‘๋‹ต ๋ณด์ •ํ•˜๊ธฐ (feat. langchain)

๋กœ์ปฌ๋จธ์‹ ์—์„œ LlamaCpp ๋กœ Llama2๋ฅผ ๊ตฌ๋™ํ•˜๊ณ  Llama2 ๊ฐ€ ๋ถ€์กฑํ•œ ์ •๋ณด๋ฅผ ๋ฒกํ„ฐ๋””๋น„๋กœ ๋ณด์™„ํ•ด์„œ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™” ํ•˜๋Š” ๊ณผ์ •์„ ์ •๋ฆฌํ•ด๋ณธ๋‹ค.

Vector DB๋กœ ์•…ํ”Œ ๊ตฌ๋ถ„ํ•˜๊ธฐ feat. Weaviate
ai / ml

Vector DB๋กœ ์•…ํ”Œ ๊ตฌ๋ถ„ํ•˜๊ธฐ feat. Weaviate

Vector DB ๊ธฐ๋Šฅ์„ ๊ฐ„๋‹จํžˆ ํ…Œ์ŠคํŠธ ํ•˜๊ธฐ ์œ„ํ•ด ํ˜์˜คํ‘œํ˜„ ๋ฌธ์žฅ์„ DB ์— ์‚ฝ์ž…ํ•˜๊ณ , ํ…Œ์ŠคํŠธ ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฌธ์žฅ์ด ํ˜์˜คํ‘œํ˜„์— ๊ฐ€๊นŒ์šด์ง€ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณธ๋‹ค.

Vector DB๋กœ ChatGPT ๋ณด์ •ํ•˜๊ธฐ (feat. OpenAI)
ai / ml

Vector DB๋กœ ChatGPT ๋ณด์ •ํ•˜๊ธฐ (feat. OpenAI)

Vector DB๋ฅผ ์•Œ์•„๋ณด๋‹ค๊ฐ€ ๊ฐ„๋‹จํ•˜๊ฒŒ OpenAI ์—์„œ ๋ถ€์กฑํ•œ ์ •๋ณด๋ฅผ Vector DB๋ฅผ ํ†ตํ•ด ๋ณด์™„ํ•˜๋Š” ๊ณผ์ •์„ ๋‚จ๊ฒจ๋ณธ๋‹ค. 1. Vector DB์— ๋Œ€ํ•œ ์†Œ๊ฐœ 1) Vector ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฒกํ„ฐ๋Š” ํฌ๊ธฐ์™€ ๋ฐฉํ–ฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ˆ˜์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐœ๋…์œผ๋กœ ๋‹ค์–‘ํ•œ ๋ถ„์•ผ์—์„œ ์ค‘์š”ํ•œ ๊ฐœ๋…์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. 2) Vector Embedding Vector Embedding์€ ๋‹จ์–ด๋‚˜ ๋ฌธ์žฅ ๋˜๋Š” ์ด๋ฏธ์ง€, ๋™์˜์ƒ๋“ฑ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ํŠน์ง• ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•ด์„œ