๊ด€๋ฆฌ ๋ฉ”๋‰ด

๋ชฉ๋ก๐—ฃ๐—ฟ๐—ผ๐—ด๐—ฟ๐—ฎ๐—บ๐—บ๐—ถ๐—ป๐—ด๐Ÿ’ป/๐’๐ฉ๐ซ๐ข๐ง๐  (33)

๐‘†๐‘ข๐‘›๐‘ โ„Ž๐‘–๐‘›๐‘’ ๐‘Ž๐‘“๐‘ก๐‘’๐‘Ÿ ๐‘Ÿ๐‘Ž๐‘–๐‘›โœง

[Spring] Elasticsearch + Spring Boot๋กœ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ๊ตฌํ˜„

Elasticsearch๋ž€?Elasticsearch๋Š” ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ์—์„œ ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์ธ ๊ฒ€์ƒ‰์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋œ ์˜คํ”ˆ ์†Œ์Šค ๋ถ„์‚ฐ ๊ฒ€์ƒ‰ ์—”์ง„์ž…๋‹ˆ๋‹ค. JSON ๋ฌธ์„œ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ฒ€์ƒ‰ํ•˜๋ฉฐ, ์—ญ์ƒ‰์ธ(Inverted Index) ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด ๋น ๋ฅธ ๊ฒ€์ƒ‰์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. Elasticsearch์˜ ์ฃผ์š” ํŠน์ง•์ „๋ฌธ ๊ฒ€์ƒ‰(Full Text Search)ํ˜•ํƒœ์†Œ ๋ถ„์„์„ ํ†ตํ•ด ํ…์ŠคํŠธ ๊ฒ€์ƒ‰์„ ์ตœ์ ํ™”ํ•˜๊ณ  ๋™์˜์–ด ๋ฐ ์œ ์˜์–ด ๊ฒ€์ƒ‰์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.์‹ค์‹œ๊ฐ„ ๊ฒ€์ƒ‰๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ ๋ฐ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋…ธ๋“œ๋กœ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ํ™•์žฅ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.RESTful API ์ง€์›GET, POST, DELETE ๋“ฑ์˜ REST API๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์†์‰ฝ๊ฒŒ CRUD(์ƒ์„ฑ, ์กฐํšŒ, ์ˆ˜์ •, ์‚ญ์ œ)ํ• ..

[Spring] Log, ELK

๋กœ๊ทธ(Log)์‹œ์Šคํ…œ์ด๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ, ๋™์ž‘, ์ƒํƒœ ๋“ฑ์„ ๊ธฐ๋กํ•œ ์ •๋ณด์ฃผ๋กœ ๋””๋ฒ„๊น…, ๋ชจ๋‹ˆํ„ฐ๋ง, ๋ฌธ์ œ ํ•ด๊ฒฐ, ์„ฑ๋Šฅ ๋ถ„์„ ๋“ฑ์„ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.๋กœ๊ทธ์˜ ์ฃผ์š” ๋ชฉ์ ๋””๋ฒ„๊น…: ์‹œ์Šคํ…œ์—์„œ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ๋ฅผ ์ถ”์ ํ•˜๊ณ , ์ฝ”๋“œ์˜ ํ๋ฆ„์„ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ.๋ชจ๋‹ˆํ„ฐ๋ง: ์‹œ์Šคํ…œ์ด๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ์™€ ์„ฑ๋Šฅ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ด€์ฐฐ.์—๋Ÿฌ ์ถ”์ : ๋ฐœ์ƒํ•œ ์˜ค๋ฅ˜๋ฅผ ๊ธฐ๋กํ•˜๊ณ , ๋ฌธ์ œ์˜ ์›์ธ์„ ์ฐพ์•„ ์ˆ˜์ •.์„ฑ๋Šฅ ๋ถ„์„: ์‹œ์Šคํ…œ ์„ฑ๋Šฅ์„ ๋ถ„์„ํ•˜์—ฌ ์ตœ์ ํ™” ๋ฐ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์„ ์ฐพ์•„๋ƒ„. ๋กœ๊ทธ ๋ ˆ๋ฒจ์˜ ์ฃผ์š” ์ข…๋ฅ˜TRACE์„ค๋ช…: ๊ฐ€์žฅ ๋‚ฎ์€ ์ˆ˜์ค€์˜ ๋กœ๊ทธ ๋ ˆ๋ฒจ์ž…๋‹ˆ๋‹ค. ๋งค์šฐ ์„ธ๋ฐ€ํ•œ ์ •๋ณด๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ์ฃผ๋กœ ์ฝ”๋“œ ์‹คํ–‰์˜ ์„ธ๋ถ€ ์‚ฌํ•ญ, ๋ณ€์ˆ˜ ๊ฐ’, ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ๋“ฑ์˜ ์ •๋ณด๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.์šฉ๋„: ๋””๋ฒ„๊น…ํ•  ๋•Œ ์ฝ”๋“œ ํ๋ฆ„์„ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.์˜ˆ์‹œ: ๋ฉ”์„œ๋“œ..

[Spring] MDC ๋กœ๊น… & Logback ์„ค์ •

๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ™œ์šฉ ์‹œ ๋กœ๊ทธ ํ˜„์ƒ์šด์˜ ์„œ๋น„์Šค์—์„œ ์—ฌ๋Ÿฌ ์š”์ฒญ์ด ๋™์‹œ์— ๋“ค์–ด์˜ฌ ๋•Œ, ๋กœ๊ทธ๊ฐ€ ์ˆœ์„œ ์—†์ด ์ฒ˜๋ฆฌ๋˜๊ณ  ์„ž์—ฌ ์Œ“์ด๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋กœ๊ทธ ์ถ”์ ์ด ์–ด๋ ค์›Œ์ง€๊ณ , ๋ฌธ์ œ๋ฅผ ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐ ๋ถˆํŽธํ•จ์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.๋กœ๊ทธ ์ˆœ์„œ: ์š”์ฒญ์€ ์ˆœ์ฐจ์ ์œผ๋กœ ๋“ค์–ด์˜ค์ง€๋งŒ, ์ฒ˜๋ฆฌ ๋„์ค‘์—๋Š” ๋กœ๊ทธ๊ฐ€ ์„ž์—ฌ์„œ ์Œ“์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.์“ฐ๋ ˆ๋“œ ์ •๋ณด: ๋กœ๊ทธ๋Š” ์‹œ๊ฐ„ ์˜†์— ์“ฐ๋ ˆ๋“œ ์ •๋ณด๋ฅผ ํ‘œ์‹œํ•˜์ง€๋งŒ, ๊ฐ™์€ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ์žฌ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํŠน์ • ์š”์ฒญ์˜ ํ๋ฆ„์„ ์ถ”์ ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ์•ˆ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด MDC๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ์š”์ฒญ์— ๊ณ ์œ  ๊ฐ’์„ ํ• ๋‹นํ•˜๊ณ , ์ด๋ฅผ ๋กœ๊ทธ์— ์ถœ๋ ฅํ•จ์œผ๋กœ์จ ๋กœ๊ทธ๋ฅผ ๊ตฌ์ฒด์ ์œผ๋กœ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.Interceptor, Filter, AOP ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ MDC๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ณธ ์˜ˆ์ œ์—์„œ๋Š” AOP..

[Spring] SSE & Kafka ๋ฅผ ํ™œ์šฉํ•ด์„œ ์•Œ๋ฆผ ๊ธฐ๋Šฅ ๊ตฌํ˜„ํ•˜๊ธฐ

ํ•„์ž๋Š” ์ฒ˜์Œ์—๋Š” ์•Œ๋ฆผ ํ…Œ์ด๋ธ”์„ ๊ตฌํ˜„ํ•œํ›„ ๋Œ“๊ธ€์ด ๋‹ฌ๋ฆฌ๋ฉด ์•Œ๋ฆผํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ๋กœ ์ €์žฅํ•˜์˜€๊ณ , API๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ํ•ด๋‹น ์‚ฌ์šฉ์ž์˜ ์•Œ๋ฆผ ๋ฐ์ดํ„ฐ๋ฅผ DB์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜์˜€๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฐ polling ๋ฐฉ์‹์€ ์ •ํ•ด์ง„ ์ฃผ๊ธฐ๋งˆ๋‹ค ๋ฌด์กฐ๊ฑด ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ๋•Œ๋„ ํŠธ๋ž˜ํ”ฝ์„ ๋ฐœ์ƒ์‹œํ‚ค๋ฉฐ, ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜์ง€์•Š๋Š”๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ•„์ž๋Š” Kafka๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•Œ๋ฆผ ์ด๋ฒคํŠธ๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ , Server-Sent Events(SSE)๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ์— ์‹ค์‹œ๊ฐ„์œผ๋กœ ์•Œ๋ฆผ์„ ์ „๋‹ฌํ•˜๋Š” ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ•ด๋ณผ๊ฒƒ์ด๋‹ค. ๊ฒŒ์‹œํŒ์˜ ๊ธ€์— ๋Œ“๊ธ€์ด ๋‹ฌ๋ฆฌ๋ฉด ์•Œ๋žŒ์ด ์ƒ๊ธฐ๊ณ , ์„œ๋ฒ„๋Š” Kafka๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ์ ์œผ๋กœ ์•Œ๋žŒ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ์ฒ˜๋ฆฌ๋œ ์•Œ๋žŒ์€ SSE๋ฅผ ํ†ตํ•ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์— ์ „์†กํ•˜๋Š” ..

[Spring] ์„ฑ๋Šฅ ์ตœ์ ํ™” 3ํŽธ - ์ธ๋ฑ์Šค ํ™œ์šฉํ•˜๊ธฐ

์ธ๋ฑ์Šค ํ…Œ์ด๋ธ”์˜ ๋™์ž‘ ์†๋„๋ฅผ ๋†’์—ฌ์ฃผ๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ ๋ฐ์ดํ„ฐ์˜ ์œ„์น˜๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฐพ์•„์ค€๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ฑ…์˜ ์ฐพ์•„๋ณด๊ธฐ๊ฐ€ ์žˆ์„ ๋•Œ ํŠน์ • ์ฃผ์ œ๋‚˜ ๋‹จ์–ด๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ์ฑ…์˜ ๋ชจ๋“  ํŽ˜์ด์ง€๋ฅผ ์ฐพ์•„๋ณด์ง€ ์•Š๊ณ , ์ฐพ์•„๋ณด๊ธฐ์—์„œ ํ•ด๋‹น ๋‹จ์–ด๋ฅผ ์ฐพ์•„ ๋ฐ”๋กœ ํ•ด๋‹น ํŽ˜์ด์ง€๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋“ฏ์ด, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธ๋ฑ์Šค๋„ ๋น„์Šทํ•œ ์—ญํ• ์„ ํ•œ๋‹ค. ์ธ๋ฑ์Šค์˜ ์žฅ์  & ํšจ๊ณผ ๊ฒ€์ƒ‰ ์„ฑ๋Šฅ ํ–ฅ์ƒ: WHERE ์ ˆ์—์„œ ํŠน์ • ์นผ๋Ÿผ์„ ์ด์šฉํ•œ ์กฐ๊ฑด ๊ฒ€์ƒ‰์ด ๋นจ๋ผ์ง„๋‹ค. ์ธ๋ฑ์Šค๊ฐ€ ์—†์œผ๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—”์ง„์€ ํ…Œ์ด๋ธ” ์ „์ฒด๋ฅผ ์Šค์บ”ํ•˜์—ฌ ์กฐ๊ฑด์— ๋งž๋Š” ํ–‰์„ ์ฐพ์•„์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋‹ค๋ฉด ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋” ๋น ๋ฅด๊ฒŒ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์กฐ์ธ ์„ฑ๋Šฅ ํ–ฅ์ƒ: JOIN ์ ˆ์—์„œ ์กฐ์ธํ•  ๋•Œ ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—”์ง„์€ ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ ์กฐ์ธ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ๋‘ ํ…Œ์ด๋ธ” ๊ฐ„์˜ ๋งค์นญ..

[Spring] ์„ฑ๋Šฅ ์ตœ์ ํ™” 2ํŽธ - ์Šค์นด์šฐํŠธ ๋ชจ๋‹ˆํ„ฐ๋ง TOOL ์„ค์น˜

Scouter Scouter๋Š” ์˜คํ”ˆ ์†Œ์Šค ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง ํˆด๋กœ, ์ฃผ๋กœ ์ž๋ฐ”(JAVA) ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹ค์‹œ๊ฐ„ ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๋ฌธ์ œ ์ง„๋‹จ์— ์‚ฌ์šฉ๋œ๋‹ค. ์ด ํˆด์€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์˜ ์„ฑ๋Šฅ ์ง€ํ‘œ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ , ๋ถ„์„ํ•˜์—ฌ ์„ฑ๋Šฅ ์ €ํ•˜์˜ ์›์ธ์„ ํŒŒ์•…ํ•˜๊ณ  ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค. Scouter๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด CPU ์‚ฌ์šฉ๋Ÿ‰, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰, SQL ์ฟผ๋ฆฌ ์„ฑ๋Šฅ, HTTP ์š”์ฒญ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„ ๋“ฑ ๋‹ค์–‘ํ•œ ์„ฑ๋Šฅ ์ง€ํ‘œ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ˆ˜ ์žˆ๋‹ค. 1. ์Šค์นด์šฐํŠธ ๋ชจ๋‹ˆํ„ฐ๋ง TOOL ์„ค์น˜ํ•˜๊ธฐ https://github.com/scouter-project/scouter/releases Releases · scouter-project/scouter Scouter is an open source APM (Application Performan..