๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์ „์ฒด ๊ธ€

(68)
[๋ฆฌ๋ทฐ] "์„ฑ๊ณต๊ณผ ์‹คํŒจ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” 1%์˜ ๋„คํŠธ์›Œํฌ ์›๋ฆฌ" ์ฝ๊ฒŒ ๋œ ๊ณ„๊ธฐ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ๊ณผ ์„œ๋ฒ„ ์ธํ”„๋ผ ์—…๋ฌด๋ฅผ ํ•˜๋ฉฐ ์•„๋ž˜ ๊ฐ™์€ ๊ถ๊ธˆ์ฆ์ด ์ƒ๊ฒผ๋‹ค.ํ•œ ์„œ๋ฒ„์—์„œ ๋‘ ํ”„๋กœ์„ธ์Šค ๊ฐ„ HTTP ํ˜ธ์ถœ(localhost ํ˜ธ์ถœ) ์‹œ ์žฌ์‹œ๋„ ๋กœ์ง์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ• ๊นŒ?๊ฐ™์€ ์„œ๋ธŒ๋„ท์—์„œ ์„œ๋ฒ„ to ์„œ๋ฒ„๋กœ 200GB ํŒŒ์ผ์„ ์˜ฎ๊ฒจ์•ผ ํ–ˆ๋‹ค. ๋ฌด์—‡์„ ๊ณ ๋ คํ•ด์•ผ ํ• ๊นŒ?์†Œ์ผ“์€ ๋ฌด์—‡์ธ๊ฐ€? OS์˜ ํ”„๋กœํ† ์ฝœ ์Šคํƒ์—์„œ ์ˆ˜์‹ ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ค ํ”„๋กœ์„ธ์Šค๋กœ ์ „๋‹ฌํ• ์ง€ ์–ด๋–ป๊ฒŒ ์•Œ๊นŒ?๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ์˜ ๋ฆฌ๋ˆ…์Šค ์„œ๋ฒ„์—์„œ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ์™œ ๋Š˜๋ ค์•ผ ํ• ๊นŒ?NAT๋Š” ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”๊ฐ€?์ด๋Ÿฌํ•œ ๊ถ๊ธˆ์ฆ์„ ์š”์ฆ˜์€ AI๋กœ๋„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‚ด ์ง€์‹์œผ๋กœ๋Š” AI๊ฐ€ ํ•˜๋Š” ๋ง์„ ๊ฒ€์ฆํ•  ์ˆ˜ ์—†์–ด์„œ ์ง์ ‘ ์ฑ…์„ ์ฝ๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค. ์ฑ… ๋ฆฌ๋ทฐ์™€ ํ•จ๊ป˜ ๊ถ๊ธˆํ–ˆ๋˜ ๊ฒƒ๋“ค์— ์Šค์Šค๋กœ ๋‹ต๋ณ€ํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. ์ถœํ‡ด๊ทผ ์‹œ๊ฐ„๊ณผ ์‹์‚ฌ ์‹œ๊ฐ„ ํ‹ˆํ‹ˆ์ด ์ฝ์—ˆ๊ณ  3์ฃผ ์ •๋„ ๊ฑธ๋ฆฐ..
Opensearch ์— Index State Management๋ฅผ ์ ์šฉํ•ด ์ˆ˜์ง‘ํ•œ ๋กœ๊ทธ ๊ด€๋ฆฌํ•˜๊ธฐ OpenSearch๋Š” Kibana ๋Œ€์ฒด๋กœ OpenSearch Dashboard๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ๋กœ๊ทธ ์ˆ˜์ง‘์„ ์œ„ํ•ด OpenSearch๋ฅผ ์“ด๋‹ค๋ฉด, ์ธ๋ฑ์Šค์— ๋ฌดํ•œ์ • ๋กœ๊ทธ๊ฐ€ ์Œ“์—ฌ ๋””์Šคํฌ๋ฅผ ์žก์•„๋จน๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค. ISM(Index State Management)์€ ์ด ์ธ๋ฑ์Šค๋ฅผ ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž๊ฒŒ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. (Kibana์—์„œ๋Š” ILM(Index Lifecycle Management)์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.) ์ด ๊ธ€์˜ ๋ชฉ์ ์€ ISM์„ ์–ด๋–ป๊ฒŒ ์„ค์ •ํ•˜๋Š”์ง€ ๋น ๋ฅด๊ฒŒ ์•Œ๊ณ , ์ค‘์š”ํ•œ ์–ด๋–ค Policy(State + Action + Transition)๋ฅผ ์„ค๊ณ„ํ• ์ง€ ๊ณ ๋ฏผํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์„ ํˆฌ์žํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.ISM ๊ตฌ์„ฑ ์š”์†ŒISM์€ ํฌ๊ฒŒ ์•„๋ž˜ 4๊ฐ€์ง€๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.Policy์ธ๋ฑ์Šค ์ƒ๋ช…์ฃผ๊ธฐ ์ •์ฑ… ์ „์ฒด๋ฅผ ์ •์˜ํ•˜๋Š” ..
Spring ์—์„œ SSE Spec ์ถฉ์กฑ์‹œํ‚ค๊ธฐ SSE ์˜ Spec ์€ id, event, data, retry ๋กœ ์ •ํ•ด์ ธ์žˆ์Šต๋‹ˆ๋‹ค.(SSE(Server-Sent Events) Spec ์€ ์ •ํ•ด์ ธ ์žˆ๋‹ค)Spring ์—์„œ๋Š” SSE Spec ์„ Flux ๋˜๋Š” SseEmitter ๋ฅผ ํ™œ์šฉํ•ด Spec ์„ ์ถฉ์กฑ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์•Œ์•„๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. 1. FluxSSE๋Š” ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์†์ ์œผ๋กœ ํ˜๋ ค๋ณด๋‚ด๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. "๋ฐ์ดํ„ฐ๋ฅผ ํ˜๋ ค๋ณด๋‚ธ๋‹ค"๋ผ๋Š” ๊ฐœ๋…์„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ํ‘œ์ค€ ๋ช…์„ธ๋กœ ๋ฆฌ์•กํ‹ฐ๋ธŒ ์ŠคํŠธ๋ฆผ์ฆˆ(Reactive Streams) ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.๋ฆฌ์•กํ‹ฐ๋ธŒ ์ŠคํŠธ๋ฆผ์ฆˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐœํ–‰(Publisher) → ๊ตฌ๋…(Subscriber) ํ๋ฆ„์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ์ด๋ฅผ ๊ตฌํ˜„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ Project Reactor์ด๊ณ  ๊ทธ ํ•ต์‹ฌ ํƒ€์ž…์ด Flux์™€ Mo..
Spring MVC ์—์„œ Flux<T> ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ๊นŒ? Spring MVC์—์„œ ๋น„๋™๊ธฐ ์Šคํƒ์„ ์ง€์›ํ•˜๊ฒŒ ๋˜๋ฉด์„œ SSE๋ฅผ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ WebClient๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ Flux๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ Flux๋ฅผ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋ฐ˜ํ™˜ํ•˜๋ฉด MVC๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ๋‚ด์šฉ์€ Flux์˜ ๋ฐœํ–‰/๊ตฌ๋… ๋ชจ๋ธ์„ ์ดํ•ดํ•˜๋ฉด ๋” ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ Spring Boot 3.x ๊ธฐ๋ฐ˜์ž…๋‹ˆ๋‹ค. 1. Web๊ณผ WebFlux ์˜์กด์„ฑ์„ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋ฉด?Spring Boot์—์„œ spring-boot-starter-web๊ณผ spring-boot-starter-webflux ์˜์กด์„ฑ์„ ํ•จ๊ป˜ ์ถ”๊ฐ€ํ•˜๋ฉด Boot์˜ ์ž๋™ ๊ตฌ์„ฑ์— ์˜ํ•ด MVC(Tomcat)๋กœ ๋„์›Œ์ง‘๋‹ˆ๋‹ค.dependencies { implementation 'org.springframework.boot:..
SSE(Server-Sent Events) Spec ์€ ์ •ํ•ด์ ธ ์žˆ๋‹ค ์„œ๋ฒ„ ๊ด€๋ จ ์˜ˆ์‹œ ์ฝ”๋“œ๋Š” Java/Spring ์œผ๋กœ ์ง„ํ–‰๋˜๋ฉฐ, SSE Spec(์‘๋‹ต ํ˜•์‹)์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋Š” ๊ฒƒ์œผ๋กœ ์„œ๋ฒ„์—์„œ SSE ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์—๋Š” ๋‹ค์Œ ๊ธ€์„ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”. ํด๋ผ์ด์–ธํŠธ ์˜ˆ์‹œ ์ฝ”๋“œ์— ๋Œ€ํ•ด ๋” ์•Œ๊ณ ์‹ถ๋‹ค๋ฉด '์ฐธ๊ณ ' ์˜ ์ƒ๋‹จ 2๊ฐœ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”. 0. SSE ์˜ Spec์€ ์ •ํ•ด์ ธ ์žˆ๋‹ค.SSE๋Š” HTML ์ŠคํŽ™(WHATWG) ์— ์ •์˜๋˜์–ด ์žˆ๊ณ , HTTP ์ŠคํŽ™(IETF)๊ณผ๋Š” ๋ณ„๊ฐœ์ž…๋‹ˆ๋‹ค.WHATWG → SSE (EventSource, Event Stream ํฌ๋งท) ์ •์˜IETF → HTTP/1.1, HTTP/2, HTTP/3 ์ •์˜ HTTP ๋ฒ„์ „์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋Š” ๊ฑด SSE ์˜ Spec์ด ์•„๋‹ˆ๋ผ HTTP๊ฐ€ SSE๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด HTTP/2.0 ๊ณผ HTTP/1.1 ์€ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋ฐฉ์‹์ด..
Spring Boot์˜ Graceful Shutdown ์˜ต์…˜์„ Async์šฉ ์“ฐ๋ ˆ๋“œ ํ’€๊ณผ ํ•จ๊ป˜ ์“ฐ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ? (SmartLifeCycle, Phased ์™€ ํ•จ๊ป˜ timeout-per-shutdown-phase ์˜คํ•ด ๋ฐ”๋กœ์žก๊ธฐ) ์ด ๊ธ€์—์„œ๋Š” Graceful Shutdown์„ "์šฐ์•„ํ•œ ์ข…๋ฃŒ"๋กœ ์–ธ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. 1. ์šฐ์•„ํ•œ ์ข…๋ฃŒ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ์„ค์ • ์šฐ์•„ํ•œ ์ข…๋ฃŒ ํ…Œ์ŠคํŠธ๋Š” IDE์—์„œ ์‹คํ–‰ ์‹œ ์›ํ™œํ•˜๊ฒŒ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์„ค๋ช…๋˜์–ด ์žˆ์–ด, Linux ์„œ๋ฒ„์—์„œ jar๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ข…๋ฃŒํ•˜๋ฉฐ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.Using graceful shutdown with your IDE may not work properly if it does not send a proper SIGTERM signal. See the documentation of your IDE for more details. 1.1 application.yml ์„ค์ • application.yml์— ์šฐ์•„ํ•œ ์ข…๋ฃŒ๋ฅผ ์„ค์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์Šคํ”„๋ง ๋ถ€ํŠธ 3.4๋ถ€ํ„ฐ๋Š” ์šฐ์•„ํ•œ ์ข…๋ฃŒ๊ฐ€ ๊ธฐ๋ณธ์œผ๋กœ ์„ค์ •๋˜๋ฉฐ, ..
Disk I/O ๋ฐ”์šด๋“œ ์„œ๋ฒ„๋ฅผ ์œ„ํ•œ ํŽ˜์ด์ง€ ์บ์‹œ(Page Cache) "์›น ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ๋Œ€๊ทœ๋ชจ ์„œ๋น„์Šค๋ฅผ ์ง€ํƒฑํ•˜๋Š” ๊ธฐ์ˆ "์˜ ๋‚ด์šฉ์„ ์žฌ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ํŽ˜์ด์ง€ ์บ์‹œ๋ž€?OS๋Š” ๋””์Šคํฌ ์•ก์„ธ์Šค๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.ํ”„๋กœ์„ธ์Šค A๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ๋‚œ ํ›„, ๋” ์ด์ƒ ๊ทธ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š” ์—†์–ด์กŒ๋‹ค๊ณ  ํ•ด์„œ OS๋Š” ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋ฐ”๋กœ ํ•ด์ œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.๋ฉ”๋ชจ๋ฆฌ์— ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ๋‚จ๊ฒจ๋‘๋Š”๋ฐ, ์ด๊ฒƒ์ด ๋ฐ”๋กœ ํŽ˜์ด์ง€ ์บ์‹œ์ž…๋‹ˆ๋‹ค. ์ด ๋•๋ถ„์— ํ”„๋กœ์„ธ์Šค B๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ํ•„์š”ํ•  ๋•Œ ๋””์Šคํฌ๋ฅผ ๋‹ค์‹œ ์ฝ์ง€ ์•Š๊ณ  ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋ฐ”๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. * OS์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ๋งˆ๋‹ค ๋””์Šคํฌ ์ฝ๋Š” ๋ฐฉ๋ฒ•์ด ๋‹ค๋ฅผํ…๋ฐ?๋ฆฌ๋ˆ…์Šค์—๋Š” ext3, ext2 ๊ฐ™์€ ์—ฌ๋Ÿฌ ํŒŒ์ผ ์‹œ์Šคํ…œ์ด ์žˆ๊ณ  ๊ฐ๊ฐ ๋””์Šคํฌ๋ฅผ ์ฝ๋Š” ๋ฐฉ๋ฒ•์ด ๋‹ค๋ฅด์ง€๋งŒ, VFS(Virtual File System)๊ฐ€ ์–ด๋–ค ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๋“  ํŽ˜์ด์ง€ ์บ์‹œ๋ฅผ ๋™์ผํ•˜๊ฒŒ ์ œ๊ณตํ•ด์ค€๋‹ค๊ณ ..
search_after API ๋กœ OpenSearch์—์„œ 10,000๊ฑด ์ด์ƒ Pagination ์•ˆ๋˜๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐํ•˜๊ธฐ best practice ๊ฐ€ ์•„๋‹ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฐธ๊ณ  ํ•ด์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.๋ฌธ์ œ ์ƒํ™ฉOpenSearch์—์„œ from๊ณผ size๋ฅผ ํ™œ์šฉํ•ด ํŽ˜์ด์ง• ์ฟผ๋ฆฌ๋ฅผ ์š”์ฒญํ•˜๋˜ ์ค‘, ๋ฐ์ดํ„ฐ๊ฐ€ 10,000๊ฑด์„ ๋„˜์–ด๊ฐ€๋ฉด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค."Result window is too large, from + size must be less than or equal to: [10000] but was [10008]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level setting."OpenSearch(El..