[ClickHouse] ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์กฐ - Shard, Replica, Distributed ํ…Œ์ด๋ธ”
ยท
Backend/Database
ClickHouse๋ฅผ ์ฒ˜์Œ ์ ‘ํ–ˆ์„ ๋•Œ ๊ฐ€์žฅ ํ˜ผ๋ž€์Šค๋Ÿฌ์› ๋˜ ๊ฑด ์šฉ์–ด์˜€๋‹ค. MySQL์ด๋‚˜ MariaDB์—์„œ๋Š” ๊ทธ๋ƒฅ ํ…Œ์ด๋ธ” ๋งŒ๋“ค๊ณ  ์ฟผ๋ฆฌ ๋‚ ๋ฆฌ๋ฉด ๋๋Š”๋ฐ, ClickHouse๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ "Shard", "Replica", "Distributed ํ…Œ์ด๋ธ”", "ZooKeeper"๊ฐ€ ํŠ€์–ด๋‚˜์˜จ๋‹ค. ์‹ฌ์ง€์–ด ํ…Œ์ด๋ธ”๋„ ๋‘ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” ClickHouse ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์–ด๋–ค ๊ตฌ์กฐ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š”์ง€, ๊ฐ ๊ฐœ๋…์ด ๋ฌด์Šจ ์—ญํ• ์„ ํ•˜๋Š”์ง€ ํ•œ ๋ˆˆ์— ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ์ •๋ฆฌํ•ด๋ณธ๋‹ค. ClickHouse๋Š” ์™œ ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์กฐ๋ฅผ ์“ธ๊นŒ? ClickHouse๋Š” ๋Œ€์šฉ๋Ÿ‰ ๋ถ„์„ ์ฟผ๋ฆฌ์— ์ตœ์ ํ™”๋œ ์ปฌ๋Ÿผํ˜• DB๋‹ค. ์ˆ˜์–ต ๊ฑด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ง‘๊ณ„ํ•˜๋Š” ๊ฒŒ ์ฃผ ๋ชฉ์ ์ด๋‹ค ๋ณด๋‹ˆ, ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ์„œ๋ฒ„์— ๋‚˜๋ˆ  ์ €์žฅํ•˜๊ณ  ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ตฌ์กฐ๊ฐ€ ๊ธฐ๋ณธ์ด ..
[Java/Spring] Heap ์บ์‹œ vs Offheap ์บ์‹œ - ์บ์‹œ ํžˆํŠธ์ธ๋ฐ ์™œ ๋А๋ฆด๊นŒ?
ยท
Backend/Jave&Spring
๋ฐฐ๊ฒฝ์–ผ๋งˆ ์ „ ์—…๋ฌด์—์„œ ์บ์‹œ๋ฅผ ์ ์šฉํ–ˆ๋Š”๋ฐ๋„ ์„ฑ๋Šฅ์ด ๋‚˜์•„์ง€์ง€ ์•Š๋Š” ์ด์ƒํ•œ ์ƒํ™ฉ์„ ๊ฒช์—ˆ๋‹ค.์บ์‹œ ํžˆํŠธ๋Š” ์ •์ƒ์ด์—ˆ๋‹ค. ๊ทผ๋ฐ ๋А๋ ธ๋‹ค. ๋ฌธ์ œ๋Š” 8500๊ฐœ์งœ๋ฆฌ Map์„ ์บ์‹œ์—์„œ ๊บผ๋‚ด๋Š” ๋กœ์ง์— ์žˆ์—ˆ๋‹ค. getDataMap()์€ ๋ถ„๋ช… ์บ์‹œ์—์„œ ์‘๋‹ตํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ์š”์ฒญ์ด ๋ชฐ๋ฆด ๋•Œ๋งˆ๋‹ค ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐ˜๋ณต๋๋‹ค.@Cacheable(value = "dataCache", key = "'dataMap'")public Map getDataMap() { return dataRepository.findAll();} ์›์ธ์„ ํŒŒ๊ณ ๋“ค๋‹ค ๋ณด๋‹ˆ ๋‚ด๊ฐ€ ์บ์‹œ ์„ค์ • ํŒŒ์ผ์—์„œ ๋ฌด์‹ฌ์ฝ” ์„ ์“ฐ๊ณ  ์žˆ์—ˆ๋‹ค๋Š” ๊ฑธ ์•Œ๊ฒŒ ๋๋‹ค. 50 ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋•Œ ์ฒ˜์Œ์œผ๋กœ ์ œ๋Œ€๋กœ ์ดํ•ดํ–ˆ๋‹ค. Heap ์บ์‹œ์™€ Offheap ์บ์‹œ๋Š” ๋™์ž‘ ๋ฐฉ์‹ ์ž์ฒด๊ฐ€ ๋‹ค๋ฅด๋‹ค๋Š”..
[Spring/Redis] lettuce-core ๋ฒ„์ „ ๋ฌธ์ œ - Caused by: io.lettuce.core.RedisCommandExecutionException: NOAUTH Authentication required.
ยท
Backend/Jave&Spring
โš ๏ธ ๋ฌธ์ œ ์ƒํ™ฉ Spring Boot์—์„œ Gradle์— ์žˆ๋Š” Dependency์˜ ๋ฒ„์ „์„ ์ •๋ฆฌํ•˜๋˜ ์ค‘์— Redis ์‚ฌ์šฉ์„ ์œ„ํ•œ Lettuce ์˜์กด์„ฑ์„ ์ˆ˜์ •ํ•˜๋˜ ์ค‘ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ๊ธฐ์กด์—๋Š” ์‚ฌ์šฉํ•˜๋Š” Lettuce ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ฒ„์ „์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ช…์‹œ์ ์œผ๋กœ ์ ์–ด์คฌ์—ˆ๋‹ค.implementation 'io.lettuce:lettuce-core:6.0.0.RELEASE' ํ•˜์ง€๋งŒ ํ˜„์žฌ Spring Boot ๋ฒ„์ „์— ๋งž๊ฒŒ ์‚ฌ์šฉํ•˜๋„๋ก ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ฒ„์ „์„ ๋•Œ๋„๋ก ์ˆ˜์ •ํ•ด์คฌ๋‹ค.implementation 'io.lettuce:lettuce-core' ๋นŒ๋“œ๋Š” ์ œ๋Œ€๋กœ ๋˜์ง€๋งŒ ๋Ÿฐํƒ€์ž„ ์ค‘์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. โ—๏ธ์—๋Ÿฌ ๋ฉ”์‹œ์ง€Caused by: io.lettuce.core.RedisCommandExecuti..
[Spring] CollectionUtils ํ™œ์šฉํ•œ null, empty ์ฒดํฌ
ยท
Backend/Jave&Spring
์ž๋ฐ”์—์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•  ๋•Œ ์–ธ์ œ๋‚˜ ์กฐ์‹ฌํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ NullPointerException์ด๋‹ค.์‹ค์ œ๋กœ ์ตœ๊ทผ ์‹ค๋ฌด์—์„œ null ์ฒดํฌ๋ฅผ ๊ผผ๊ผผํžˆ ์•ˆํ–ˆ๋‹ค๊ฐ€ ์šด์˜์—์„œ ์—๋Ÿฌ๊ฐ€ ์ฐํžˆ๋Š” ์‚ฌํƒœ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๐Ÿ˜ฑ ๊ทธ๋ฆฌ๊ณ  List๊ฐ€ null ์ธ์ง€์™€ ๋น„์—ˆ๋Š”์ง€๋ฅผ ๋ชจ๋‘ ํ™•์ธํ•ด์ค˜์•ผ ํ•  ์ผ์ด ์ƒ๊ฒผ๋Š”๋ฐ, Spring์—์„œ ์ œ๊ณตํ•˜๋Š” CollectionUtils์„ ์“ฐ๋ฉด ํ•œ ๋ฒˆ์— ์ฒดํฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•˜๊ณ ์ž ํ•œ๋‹ค. 1. null vs empty์šฐ์„  null๊ณผ empty์˜ ์ฐจ์ด์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด์ž.์•„๋ž˜ ๊ทธ๋ฆผ์€ null๊ณผ empty์˜ ์ฐจ์ด๋ฅผ ์•„์ฃผ ์ž˜ ์„ค๋ช…ํ•ด์ฃผ๋Š” ์งค์ด๋‹ค. ์™ผ์ชฝ ์นธ์„ ๋ณด๋ฉด ํœด์ง€์˜ ์ฃผ์š” ๋‚ด์šฉ๋ฌผ์ธ ํฐ ๋ถ€๋ถ„(๋ฐ์ดํ„ฐ)๊ฐ€ ์—†๊ณ , ํœด์ง€๋ฅผ ๋‹ด๊ณ  ์žˆ๋˜ ํœด์ง€์‹ฌ(๊ฐ์ฒด)๋Š” ์žˆ๋Š” ์ƒํƒœ์ด๋‹ค.์˜ค๋ฅธ์ชฝ ์นธ์„..
[ํšŒ๊ณ ] ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ, ๋Œ€์™ธํ™œ๋™ ํšŒ๊ณ 
ยท
Project
์˜ค๋žœ๋งŒ์— ์“ฐ๋Š” ํ”„๋กœ์ ํŠธ์™€ ๋Œ€์™ธํ™œ๋™ ํšŒ๊ณ ์ž…๋‹ˆ๋‹ค๐Ÿ™‚ ํ”„๋กœ์ ํŠธ์™€ ์ทจ์—… ์ค€๋น„๋กœ ์ •์‹ ์—†๋Š” ๋‚˜๋‚ ์„ ๋ณด๋‚ด๊ณ  ์žˆ๋Š”๋ฐ, ๊ฒฝํ—˜ ์ •๋ฆฌ๋ฅผ ์œ„ํ•ด ๊ฑฐ์˜ 1๋…„ ๋™์•ˆ ์ง„ํ–‰ํ–ˆ๋˜ ํ™œ๋™์„ ๋˜๋Œ์•„ ๋ณด๊ณ  ์‹ถ์–ด์„œ ์ ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.(์ทจ์—… ์ „์— ์‹œ๊ฐ„๋˜๋Š”๋Œ€๋กœ ๋น„๊ณต๊ฐœ๋กœ ๋‚ด์šฉ์„ ์กฐ๊ธˆ์”ฉ ์ ๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค! ๊ทธ๋ฆฌ๊ณ  ๊ณต๊ฐœ๋œ ์ง€๊ธˆ์€ ์ทจ์—…ํ•œ ์ƒํƒœ์ž…๋‹ˆ๋‹ค)+ ์ง€๊ธˆ์€ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค...1. ์‹œ์ž‘ ๊ณ„๊ธฐ ์ž‘๋…„๋ถ€ํ„ฐ ์ทจ์—… ์ค€๋น„์™€ ๋ณ‘ํ–‰ํ•˜๋ฉฐ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ทจ์ค€ ์ค‘์—๋„ ๊ฐœ๋ฐœ์„ ์†์— ๋†“๊ณ  ์‹ถ์ง€ ์•Š์•˜๊ณ , ํ˜‘์—…ํ•˜๋Š” ๊ฐ์„ ์œ ์ง€ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์ „๊ณต๊ณผ SSAFY์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์•„์‰ฌ์› ๋˜ ์ ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์‹ค์‚ฌ์šฉ ์„œ๋น„์Šค๋ฅผ ๋ชป ๋งŒ๋“ค์–ด๋ดค๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋ฌด๋ž˜๋„ ํฌํŠธํด๋ฆฌ์˜ค์— ์“ธ ํ”„๋กœ์ ํŠธ๋ฅผ ์งง์€ ๊ธฐ๊ฐ„ ๋™์•ˆ ๊ฐœ๋ฐœํ•˜๋‹ค๋ณด๋‹ˆ, ๋‹จ์ˆœํžˆ ๊ตฌํ˜„ํ•˜๊ณ  ๋ฐฐํฌํ•˜..
[Spring /JUnit] Mock ๊ฐ์ฒด์™€ ์ฃผ์†Œ๊ฐ’ ๋น„๊ต ๋ฌธ์ œ - Argument(s) are different! : org.mockito.exceptions.verification.opentest4j.ArgumentsAreDifferent
ยท
Backend/Jave&Spring
โ—๏ธ์—๋Ÿฌ ๋ฉ”์‹œ์ง€org.mockito.exceptions.verification.opentest4j.ArgumentsAreDifferent      ๐Ÿ’ป ๊ฐœ๋ฐœ ํ™˜๊ฒฝFramework : `Spring Boot 3.2.3`DB : `MySQL`(๋กœ์ปฌ), `H2`(ํ…Œ์ŠคํŠธ)Library : `JPA`, `QueryDSL 5.0.0`Test : `JUnit`     ๐Ÿ”Ž ์›์ธSpring์—์„œ Junit์œผ๋กœ Controller ๋‹จ์˜ ๊ฒŒ์‹œ๊ธ€ ์ˆ˜์ • ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•˜๋Š”๋ฐ, `verify()` ๋ถ€๋ถ„์—์„œ ๊ฒ€์ฆ์—๋Ÿฌ๊ฐ€ ๋‚ฌ๋‹ค.  @Nested @DisplayName("๊ตฌ์ธ ๊ฒŒ์‹œ๊ธ€ ์ˆ˜์ •") public class updateHiringPostTest { private Long postId; pr..
giraffe_
'๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก (2 Page)