[Java] ์ œ๋„ค๋ฆญ ๊ฐ€๋ณ€์ธ์ž์™€ @SafeVarargs - ํ˜ธ์ถœ๋ถ€๊นŒ์ง€ ๋ฒˆ์ง€๋Š” unchecked ๊ฒฝ๊ณ  ์žก๊ธฐ
ยท
Backend/Jave&Spring
1. ๋ฌธ์ œ ์ƒํ™ฉ List์—์„œ ํŠน์ • ๊ธฐ์ค€์œผ๋กœ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๋Š” ์œ ํ‹ธ์ด ํ•„์š”ํ–ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ƒํ’ˆ ๋ชฉ๋ก์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ์ค€์œผ๋กœ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•œ๋‹ค๊ณ  ํ•˜์ž.์ƒํ’ˆ๋ฒˆํ˜ธ๊ฐ€ ๊ฐ™์œผ๋ฉด ์ค‘๋ณต์ด๋‹ค.์ƒํ’ˆ๋ฒˆํ˜ธ๊ฐ€ ๋‹ฌ๋ผ๋„ ์ƒํ’ˆ๋ช…์ด ๊ฐ™์œผ๋ฉด ๊ฐ™์€ ์ƒํ’ˆ์œผ๋กœ ๋ณธ๋‹ค.๊ธฐ์ค€์€ ๋‚˜์ค‘์— ๋Š˜์–ด๋‚  ์ˆ˜๋„ ์žˆ๋‹ค. ๊ธฐ์ค€ ๊ฐœ์ˆ˜๊ฐ€ ์œ ๋™์ ์ด๋‹ˆ ์ œ๋„ค๋ฆญ ๊ฐ€๋ณ€์ธ์ž๋กœ ๋ฐ›๋„๋ก ๊ตฌํ˜„ํ–ˆ๋‹ค.// ํ˜ธ์ถœ๋ถ€List unique = DeduplicationUtils.deduplication( products, Product::getProductCode, Product::getProductName);public final class DeduplicationUtils { private DeduplicationUtils() { } public static Li..
[Web] Shadow DOM - ์™ธ๋ถ€ ์œ„์ ฏ์„ ๋งŒ๋“ค๋ฉด์„œ ์•Œ๊ฒŒ ๋œ ๊ฒƒ๋“ค
ยท
Web
์—…๋ฌด ์ค‘ ๊ณ ๊ฐ์‚ฌ ์›น์‚ฌ์ดํŠธ์— ์ฃผ์ž…๋˜๋Š” ์œ„์ ฏ์„ ๊ตฌํ˜„ํ•ด์•ผ ํ–ˆ๋‹ค. ์œ„์ ฏ ์•ˆ์—๋Š” ์บ”๋ฒ„์Šค๋กœ ๊ทธ๋ฆฐ ์—ฌ๋Ÿฌ ์š”์†Œ๋“ค์ด ์žˆ์—ˆ๊ณ , ์–ด๋–ค ๊ณ ๊ฐ์‚ฌ์˜ ํŽ˜์ด์ง€์— ๋ถ™๋“  ๊ทธ ์‚ฌ์ดํŠธ์˜ CSS์— ๊นจ์ง€์ง€ ์•Š์•„์•ผ ํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ Shadow DOM์œผ๋กœ ์œ„์ ฏ์„ ๊ฐ์ŒŒ๋‹ค. ์ž‘์—…์„ ๋๋‚ด๊ณ  ์ •๋ฆฌํ•ด ๋ณด๋‹ˆ, ์•Œ๊ฒŒ ๋œ ๊ฒŒ ํ•˜๋‚˜๊ฐ€ ์•„๋‹ˆ์—ˆ๋‹ค. ์™œ ์ด ๊ธฐ์ˆ ์ด ํ•„์š”ํ–ˆ๋Š”์ง€, ๊ทธ๊ฒŒ ์‹ค์€ ๊ธฐ์ˆ  ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ ๋น„์ฆˆ๋‹ˆ์Šค ๋ฌธ์ œ์ด๊ธฐ๋„ ํ–ˆ๋‹ค๋Š” ๊ฒƒ. ๊ฒฉ๋ฆฌ์˜ ๊ฒฝ๊ณ„๊ฐ€ ์ •ํ™•ํžˆ ์–ด๋””๊นŒ์ง€์ธ์ง€, closed ๋ชจ๋“œ ํ•˜๋‚˜๋ฅผ ๊ณ ๋ฅธ ๊ฒŒ ์ฝ”๋“œ ๊ตฌ์กฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฐ•์ œํ–ˆ๋Š”์ง€. ๊ทธ๋ฆฌ๊ณ  ์ •์ž‘ ๊ฐ€์žฅ ๋งŽ์€ ์‹œ๊ฐ„์„ ์žก์•„๋จน์€ ๊ฑด ๋”ฐ๋กœ ์žˆ์—ˆ๋‹ค๋Š” ๊ฒƒ. ์ด ๊ธ€์€ ๊ทธ ์ˆœ์„œ ๊ทธ๋Œ€๋กœ ์ •๋ฆฌํ•œ ๊ธฐ๋ก์ด๋‹ค. 1. ์™œ Shadow DOM์ด ํ•„์š”ํ–ˆ๋Š”๊ฐ€? Shadow DOM์„ ์ฒ˜์Œ ์ ‘ํ•˜๋ฉด '์ปดํฌ๋„ŒํŠธ ์Šคํƒ€์ผ์„ ์บก์Аํ™”ํ•ด์ฃผ๋Š” ๊ฒƒ' ์ •๋„๋กœ ์ด..
[ํ›„๊ธฐ] SQLD ๊ณต๋ถ€ ๊ณผ์ • ๋ฐ ํ•ฉ๊ฒฉ ํ›„๊ธฐ (24๋…„ ํ•ฉ๊ฒฉ ver) + ๋ณด์ˆ˜ ๊ต์œก
ยท
ํ›„๊ธฐ
๋‚ด ๋ธ”๋กœ๊ทธ ์กฐํšŒ์ˆ˜ ์ƒ์œ„๊ถŒ์„ ๋‹ฌ๋ฆฌ๋Š” 22๋…„๋„์— ๋”ด '์ •๋ณด์ฒ˜๋ฆฌ๊ธฐ์‚ฌ ์‹ค๊ธฐ ํ•ฉ๊ฒฉ ํ›„๊ธฐ'์— ์ด์–ด์„œ, 24๋…„๋„์— ๋”ด SQLD ๊ณต๋ถ€ ๊ณผ์ • ๋ฐ ํ•ฉ๊ฒฉ ํ›„๊ธฐ ๊ธ€์„ ์“ฐ๊ณ ์ž ํ•œ๋‹ค. ๋ธ”๋กœ๊ทธ ์œ ์ž… ๋Š˜๋ฆด๋ ค๊ณ ... ๊ทธ๋ฆฌ๊ณ  ๊ณต๋ถ€ ๊ณผ์ •๋ฟ ์•„๋‹ˆ๋ผ ์ด ์ž๊ฒฉ์ฆ์ด ๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„œ ์‹ค์ œ๋กœ ์ทจ์—…๊ณผ ์‹ค๋ฌด์— ์–ผ๋งˆ๋‚˜ ๋„์›€์ด ๋˜์—ˆ๋Š”์ง€๋„ ๋ง๋ถ™์ด๊ณ ์ž ํ•œ๋‹ค. ์ •๋ณด์ฒ˜๋ฆฌ๊ธฐ์‚ฌ ์‹ค๊ธฐ ๊ณต๋ถ€ ๊ณผ์ • ๋ฐ ํ•ฉ๊ฒฉ ํ›„๊ธฐ์ •๋ณด์ฒ˜๋ฆฌ๊ธฐ์‚ฌ 2022๋…„๋„ 1ํšŒ์ฐจ ์‹œํ—˜์„ ๋ดค์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ „๊ณต์ž์ด๋ฉฐ ์ทจ์ค€๊ณผ ํ•จ๊ป˜ ์ •์ฒ˜๊ธฐ๋ฅผ ์ค€๋น„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์›๋ž˜ ์ „๊ณต์ž๋ผ๋ฉด 4ํ•™๋…„ ๋•Œ ๋งŽ์ด๋“ค ๋”ฐ๋Š”๋ฐ.. ์˜ฌํ•ด ์กธ์—…ํ•˜๊ณ  ์ทจ์ค€์ด๋ž‘ ๊ฐ™์ด ๋ณ‘ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๋„ˆprogrammingiraffe.tistory.com ์ด ๊ธ€์—์„œ๋„ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ๋‚˜์˜ ์ž๊ฒฉ์ฆ ๋”ฐ๋Š” ๋ฐฉ์‹์€ '์ตœ๋Œ€ํ•œ ์ ์€ ์‹œ๊ฐ„๊ณผ ๋น„์šฉ์œผ๋กœ ๊ฐ€์„ฑ๋น„ ์žˆ๊ฒŒ ๋”ฐ๊ธฐ'์ด๋‹ค. ์†”..
[ํšŒ๊ณ ] 2026๋…„ ์ƒ๋ฐ˜๊ธฐ ํšŒ๊ณ 
ยท
ํ›„๊ธฐ
๋ฒŒ์จ 2026๋…„๋„ ์ ˆ๋ฐ˜ ์ด์ƒ์ด ์ง€๋‚ฌ๋‹ค. ์–ผ๋งˆ ์ „ ํšŒ์‚ฌ์—์„œ ์ƒ๋ฐ˜๊ธฐ ๋ฆฌ๋ทฐ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ง€๋‚œ 6๊ฐœ์›”์„ ๋Œ์•„๋ณด๊ฒŒ ๋˜์—ˆ๋‹ค. ํšŒ์‚ฌ ์—…๋ฌด๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ฐœ์ธ์ ์œผ๋กœ ์–ด๋–ค ๊ณ ๋ฏผ์„ ํ–ˆ๊ณ , ๋ฌด์—‡์„ ๋ฐฐ์šฐ๊ณ  ์‹œ๋„ํ–ˆ๋Š”์ง€๋„ ํ•จ๊ป˜ ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. ๋Œ์ด์ผœ๋ณด๋ฉด ์˜ฌํ•ด ์ƒ๋ฐ˜๊ธฐ๋Š” ํฌ๊ฒŒ ์„ธ ๊ฐ€์ง€ ๋ณ€ํ™”๊ฐ€ ์žˆ์—ˆ๋‹ค. ์„œ๋น„์Šค ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค๊ฐ€ ๋นŒ๋ง ํŒŒํŠธ๋กœ ์ด๋™ํ•˜๋ฉฐ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์™€ ์ •ํ•ฉ์„ฑ์„ ๋”์šฑ ๊นŠ๊ฒŒ ๋‹ค๋ฃจ๊ฒŒ ๋˜์—ˆ๊ณ , Claude๋ฅผ ๋น„๋กฏํ•œ AI๋ฅผ ์—…๋ฌด์— ์ ๊ทน์ ์œผ๋กœ ํ™œ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐœ๋ฐœ์ž๋กœ์„œ์˜ ์—ญํ• ๊ณผ ์•ž์œผ๋กœ์˜ ๊ฒฝ์Ÿ๋ ฅ์— ๋Œ€ํ•ด ์ด์ „๋ณด๋‹ค ํ›จ์”ฌ ๋งŽ์ด ๊ณ ๋ฏผํ•˜๊ฒŒ ๋œ ์‹œ๊ธฐ์ด๊ธฐ๋„ ํ–ˆ๋‹ค. ๋นŒ๋ง ํŒŒํŠธ๋กœ ์ด๋™ ์ƒ๋ฐ˜๊ธฐ์˜ ๊ฐ€์žฅ ํฐ ๋ณ€ํ™”๋Š” ํŒ€ ๋‚ด์—์„œ ๋นŒ๋ง ํŒŒํŠธ๋กœ ์ด๋™ํ•œ ๊ฒƒ์ด๋‹ค. ๋นŒ๋ง ํŒŒํŠธ๋Š” ์„œ๋น„์Šค์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋กœ๊ทธ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ , ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ •์‚ฐ๊ณผ ํ†ต๊ณ„๋ฅผ ..
[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 ์บ์‹œ๋Š” ๋™์ž‘ ๋ฐฉ์‹ ์ž์ฒด๊ฐ€ ๋‹ค๋ฅด๋‹ค๋Š”..
[ClickHouse] ClickHouse JOIN์ด ๋А๋ฆฐ ์ด์œ ์™€ ์ตœ์ ํ™” ์ „๋žต
ยท
Database
ClickHouse๋ฅผ ์ฒ˜์Œ ์“ฐ๋‹ค ๋ณด๋ฉด ํ•œ ๋ฒˆ์ฏค ์ด๋Ÿฐ ๊ฒฝํ—˜์„ ํ•œ๋‹ค. MySQL์—์„œ๋Š” ์•„๋ฌด ๋ฌธ์ œ ์—†์ด ๋Œ์•„๊ฐ€๋˜ JOIN ์ฟผ๋ฆฌ๊ฐ€ ClickHouse์—์„œ๋Š” ์œ ๋… ๋А๋ฆฌ๊ฑฐ๋‚˜, WHERE ์กฐ๊ฑด์„ ๋‹ค ๊ฑธ์—ˆ๋Š”๋ฐ๋„ ํ’€์Šค์บ” ์ˆ˜์ค€์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ์ด๋‹ค. ์ด ๊ธ€์—์„œ๋Š” ๊ทธ ์ด์œ ๋ฅผ ClickHouse์˜ ๋‚ด๋ถ€ ๋™์ž‘ ๋ฐฉ์‹์—์„œ ์ฐพ๊ณ , ์‹ค์ œ๋กœ ์“ธ ์ˆ˜ ์žˆ๋Š” ์ตœ์ ํ™” ์ „๋žต์„ ์ •๋ฆฌํ•œ๋‹ค. ์–ด๋–ค ์ƒํ™ฉ์ธ๊ฐ€ ์ˆ˜์–ต ๊ฑด์˜ ์œ ์ € ํ–‰๋™ ๋กœ๊ทธ(page_view_log)์™€ ์ฃผ๋ฌธ ๋ฐ์ดํ„ฐ(order_log)๋ฅผ JOINํ•ด์„œ ํŽ˜์ด์ง€๋ฅผ ๋ณธ ํŠน์ • ๊ธฐ๊ฐ„, ํŠน์ • ์œ ์ €์˜ ๊ตฌ๋งค ๊ฑด์ˆ˜๋ฅผ ์ง‘๊ณ„ํ•œ๋‹ค๊ณ  ํ•ด๋ณด์ž. ์•„๋ž˜์ฒ˜๋Ÿผ ์“ฐ๋Š” ๊ฒƒ์ด ์ž์—ฐ์Šค๋Ÿฝ๋‹ค.SELECT count(*)FROM default.page_view_log p JOIN default.order_log o ON ..
giraffe_
๐ŸŒฑ ๋ฌด๋Ÿญ๋ฌด๋Ÿญ ์ž๋ผ๋‚˜๋Š” ๊ฐœ๋ฐœ ๊ธฐ๋ก