์Šคํ”„๋ง

ZSet์€ ์ •๋ ฌ๋œ ์ˆœ์„œ๋กœ ์ €์žฅ๋˜๋Š” ๊ณ ์œ ํ•œ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ๊ฐ ์›์†Œ๋Š” ์ ์ˆ˜(Score) ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž๋™ ์ •๋ ฌ1. Redis Sorted Set(ZSet) ์ด๋ž€?Key-Value ์ €์žฅ ๊ตฌ์กฐ์ง€๋งŒ, ๊ฐ Value์— Score(์ˆซ์ž)๊ฐ€ ์ถ”๊ฐ€๋œ๋‹ค.์ ์ˆ˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ž๋™ ์ •๋ ฌ๋จ์ค‘๋ณต๋œ ๊ฐ’์€ ์ €์žฅ๋˜์ง€ ์•Š์œผ๋ฉฐ(Unique), Score๋Š” ์ค‘๋ณต ๊ฐ€๋Šฅ๋น ๋ฅธ ์กฐํšŒ ์†๋„(O(log N))๋กœ ๋žญํ‚น, ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ, TTL ๊ธฐ๋ฐ˜ ์บ์‹ฑ ๋“ฑ์— ์œ ์šฉํ•˜๋‹ค.์ฃผ์š” ๋ช…๋ น์–ด1. ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€(ZADD)ZADD key score1 member1 [score2 member2 ... ]2. ๋ฐ์ดํ„ฐ ์กฐํšŒ(ZRANGE, ZREVRANGE)์˜ค๋ฆ„์ฐจ์ˆœ ์กฐํšŒ(ZRANGE)๋‚ด๋ฆผ์ฐจ์ˆœ ์กฐํšŒ(ZREVRANGE)3. ํŠน์ • ๊ฐ’์˜ ์ˆœ์œ„ ์กฐํšŒ์˜ค๋ฆ„์ฐจ์ˆœ ์ˆœ์œ„ ์กฐํšŒ(ZRANK)๋‚ด๋ฆผ์ฐจ์ˆœ..
์ธ๊ธฐ๊ธ€ ์š”๊ตฌ์‚ฌํ•ญ์ผ ๋‹จ์œ„๋กœ ์ƒ์œ„ 10๊ฑด ์ธ๊ธฐ๊ธ€ ์„ ์ •๋งค์ผ ์˜ค์ „ 1์‹œ ์—…๋ฐ์ดํŠธ์ข‹์•„์š” ์ˆ˜/๋Œ“๊ธ€ ์ˆ˜/์กฐํšŒ์ˆ˜ ๊ธฐ๋ฐ˜ ์ ์ˆ˜ ๊ณ„์‚ฐ์ ์ˆ˜ = (์ข‹์•„์š” ์ˆ˜ * 3) + (๋Œ“๊ธ€ ์ˆ˜ * 2) + (์กฐํšŒ์ˆ˜ * 1)์ตœ๊ทผ 7์ผ ์ธ๊ธฐ๊ธ€ ๋‚ด์—ญ ์กฐํšŒ์„ค๊ณ„๋งค์ผ ๊ฒŒ์‹œ๊ธ€ ์ƒ์„ฑ ํŠธ๋ž˜ํ”ฝ์€ ์ˆ˜๋ฐฑ~์ˆ˜์ฒœ๋งŒ ๊ฑด ์ด์ƒํ•˜๋ฃจ๋™์•ˆ ์ƒ์„ฑ๋œ ๋ชจ๋“  ๊ฒŒ์‹œ๊ธ€์— ๋Œ€ํ•ด์„œ,์ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ , ์ƒ์œ„ 10๊ฑด์„ ์ฐพ์•„์•ผํ•˜๋Š” ์ž‘์—…์ด๋Ÿฌํ•œ ์ž‘์—…์€ 1์‹œ๊ฐ„ ๋งŒ์— ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•œ๋‹ค.๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•˜๋‹ค.๋ฐฐ์น˜ ์ฒ˜๋ฆฌ๋ฅผ ๊ณ ๋ คํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.์˜ค์ „ 12์‹œ๊ฐ€ ๋˜์ž๋งˆ์ž, ์ „๋‚  ์ž‘์„ฑ๋œ ๊ฒŒ์‹œ๊ธ€์„ ๋ชจ๋‘ ์ˆœํšŒ๊ฐ ๊ฒŒ์‹œ๊ธ€์— ๋Œ€ํ•ด์„œ ์ข‹์•„์š” ์ˆ˜, ์กฐํšŒ์ˆ˜, ๋Œ“๊ธ€ ์ˆ˜๋ฅผ ์กฐํšŒ๊ฒŒ์‹œ๊ธ€์˜ ์ ์ˆ˜๋ฅผ ๊ณ„์‚ฐ๋ชจ๋“  ๊ฒŒ์‹œ๊ธ€์— ๋Œ€ํ•ด์„œ ์ƒ์œ„ 10๊ฑด์„ ์„ ์ •๋ฐฐ์น˜ ์ž‘์—…์„ ํ†ตํ•ด ๋ฌธ์ œ์—†์ด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ œํ•œ์‚ฌํ•ญ์ด ..
Apache Kafka๋Š” ๋ถ„์‚ฐ ์ŠคํŠธ๋ฆฌ๋ฐ ํ”Œ๋žซํผ์œผ๋กœ, ๋Œ€๊ทœ๋ชจ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค ์—ญํ• ์„ ํ•œ๋‹ค.Kafka๋Š” ๋†’์€ ํ™•์žฅ์„ฑ, ๋‚ด๊ฒฐํ•จ์„ฑ(fault tolerance), ๋†’์€ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ์ œ๊ณตํ•˜๋ฉฐ, ๊ธฐ์—…์˜ ๋กœ๊ทธ ์ฒ˜๋ฆฌ, ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆฌ๋ฐ, ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ• ๋“ฑ์— ๋„๋ฆฌ ์‚ฌ์šฉ๋œ๋‹ค.1. Kafka๋ž€?๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ณ  ์•ˆ์ •์ ์œผ๋กœ ์†ก์ˆ˜์‹ ํ•˜๊ธฐ ์œ„ํ•œ ๋ถ„์‚ฐ ๋ฉ”์‹œ์ง€ ์‹œ์Šคํ…œPub/Sub(๋ฐœํ–‰-๊ตฌ๋…) ๋ชจ๋ธ ๊ธฐ๋ฐ˜์˜ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ ๊ตฌ์ถ• ๊ฐ€๋Šฅ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ ์ฒ˜๋ฆฌ ๋ฐ ๋น„๋™๊ธฐ ๋ฉ”์‹œ์ง• ํ๋กœ ํ™œ์šฉ2. Kafka ์•„ํ‚คํ…์ฒ˜1. Producer(์ƒ์‚ฐ์ž)Kafka์— ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•˜๋Š” ์—ญํ• ๋ฉ”์‹œ์ง€๋ฅผ Topic์—๊ฒŒ ๊ฒŒ์‹œ(Publish) ํ•จacks ์„ค์ •์œผ๋กœ ๋ฉ”์‹œ์ง€ ์ „์†ก ๋ณด์žฅ ์ˆ˜์ค€ ์กฐ์ ˆ ๊ฐ€๋Šฅ (acks=0, 1, all..
๊ฒŒ์‹œ๊ธ€ ํ…Œ์ด๋ธ” ์„ค๊ณ„column_nameTypeDescriptionarticle_idBIGINTPrimary KeytitleVARCHAR(100)์ œ๋ชฉcontentVARCHAR(3000)๋‚ด์šฉboard_idBIGINT๊ฒŒ์‹œํŒID(Shard Key)writer_idBIGINT์ž‘์„ฑ์žIDcreated_atDATETIME์ƒ์„ฑ์‹œ๊ฐ„modified_atDATETIME์ˆ˜์ •์‹œ๊ฐ„์—ฌ๊ธฐ์„œ Shard Key๋Š” ๊ฒŒ์‹œํŒ ID์™œ? ๊ฒŒ์‹œ๊ธ€ ์„œ๋น„์Šค๋Š” ๊ฒŒ์‹œํŒ ๋‹จ์œ„๋กœ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•˜๊ธฐ์—, ๊ฒŒ์‹œํŒ ๋‹จ์œ„๋กœ ๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก์ด ์กฐํšŒ๋˜๋Š” ๊ฒƒprimary key ์ƒ์„ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ Snowflake ์‚ฌ์šฉ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ ๊ณ ์œ ํ•œ 64bit ID๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ๋„ ์ค‘๋ณต ์—†์ด ์ˆœ์ฐจ์  ID๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๊ทœ์น™[1bit][41bits:ํƒ€์ž„์Šคํƒฌํ”„][10bit..
ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ์‹œ ๋ถ€ํ„ฐ ์‹œ์ž‘๋œ ๋ฉ์ฒญํ•œ ์ง“1jdk๋ฅผ 21๋กœ ์„ค์ •ํ•˜๊ณ  ํ”„๋กœ์ ํŠธ ์„ธํŒ…์„ ์ง„ํ–‰ํ–ˆ๋Š”๋ฐ, gradle build๋Š” ๋ฌธ์ œ์—†์ด ๋˜๋Š”๋ฐ ์™œ?์ž๊พธ ์ด๋”ฐ์œ„ ์—๋Ÿฌ๊ฐ€ ๋œจ๋Š”์ง€ ์ดํ•ด๊ฐ€ ์•ˆ๋Œ....build.gradle ์—์„œ๋„ 21ํ”„๋กœ์ ํŠธ ์„ธํŒ…์—์„œ๋„ 21๋ฌด์ˆ˜ํžˆ ์„ค์ • ์ ์šฉ์„ ๋ฐ˜๋ณตํ•˜๋‹ค ๋ฐœ๊ฒฌํ•œ ๋ฉ์ฒญํ•œ ์ง“intellij ์„ธํŒ… ์ž์ฒด์—์„œ 17๋กœ ๋˜์–ด์žˆ์Œ....์ด๊ฑธ 21๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๋‹ˆ ์ •์ƒ ๋™์ž‘..... ๋ช‡๋ถ„์„ ์“ธ๋ฐ์—†์ด ๋‚ ๋ ธ๋„คใ… 
SimpleJdbcInsert๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, insert๋ฅผ ๊ตฌํ˜„ํ•˜๋˜ ์ค‘ ๋ฌธ์ œ ๋ฐœ์ƒ private Member insert(Member member) { SimpleJdbcInsert simpleJdbcInsert = new SimpleJdbcInsert(jdbcTemplate.getJdbcTemplate()) .withTableName("Member") .usingGeneratedKeyColumns("id"); SqlParameterSource params = new BeanPropertySqlParameterSource(member); var id = simpleJdbcInsert.executeAndReturnKey(params).longValue(); return Member.builder() .id(..
QueryDSL gradle ์„ค์ • plugins { id 'java' id 'org.springframework.boot' version '3.0.6' id 'io.spring.dependency-management' version '1.1.0' // id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" } group = 'dev.be' version = '0.0.1-SNAPSHOT' sourceCompatibility = '17' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation..
QueryDSL ์€ SQL, JPQL ๋“ฑ์„ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๋นŒ๋” ์˜คํ”ˆ์†Œ์Šค ํ”„๋ ˆ์ž„์›Œํฌ ์ด๋‹ค. QueryDSL JPA SQL, JPQL์„ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๋นŒ๋” API์ด๋‹ค. Entity ํด๋ž˜์Šค์™€ ๋งคํ•‘๋˜๋Š” QClass ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. QClass ? QueryDSL์€ ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ QClass๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ JPAAnnotationProcessor๊ฐ€ ์ปดํŒŒ์ผ ์‹œ์ ์— ์ž‘๋™ํ•ด์„œ @Entity ๋“ฑ์˜ ์• ๋…ธํ…Œ์ด์…˜์„ ์ฐพ์•„ ํ•ด๋‹น ํŒŒ์ผ์„ ๋ถ„์„ํ•ด์„œ QClass๋ฅผ ๋งŒ๋“ ๋‹ค. ๐Ÿš€ QClass๋Š” Entity์™€ ํ˜•ํƒœ๊ฐ€ ๋˜‘๊ฐ™์€ static class์ด๋‹ค. ๐Ÿš€ QueryDSL์€ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ, QClass๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ๐Ÿ™‹โ€โ™€๏ธ ์‚ฌ์šฉ ์ด์œ ? EntityCl..