Backend/Java

Five API Performance Optimization Tricks that Every Java Developer Must Know(๋ชจ๋“  ์ž๋ฐ” ๊ฐœ๋ฐœ์ž๊ฐ€ ์•Œ์•„์•ผ ํ•  ๋‹ค์„ฏ ๊ฐ€์ง€ API ์„ฑ๋Šฅ ์ตœ์ ํ™” ํŒ)

Seyun(Marco) 2024. 4. 20. 23:52
728x90

๐Ÿ’ก ์›๋ณธ๊ธ€

Five API Performance Optimization Tricks that Every Java Developer Must Know

 

Five API Performance Optimization Tricks that Every Java Developer Must Know

Why is your API response so slow? Maybe you need to solve these problems.

medium.com

์™œ ๋‹น์‹ ์˜ API ์‘๋‹ต์ด ๋Š๋ฆฐ๊ฐ€์š”? ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•  ํ•„์š”๊ฐ€ ์žˆ์„์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ์„œ, ํ”„๋ก ํŠธ์—”๋“œ ์›น์— ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ HTTP REST API์ด๋“ , ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ์„ ์œ„ํ•œ RPC API์ด๋“  ์šฐ๋ฆฌ๋Š” ํ•ญ์ƒ ๋‹ค์–‘ํ•œ API๋“ค์„ ์ž‘์„ฑํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด API๋“ค์€ ์„œ๋น„์Šค ์ดˆ๊ธฐ ๋‹จ๊ณ„์—๋Š” ์ž˜ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์‚ฌ์šฉ์ž ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ ์ฒ˜์Œ์—๋Š” ๋น ๋ฅด๊ฒŒ ์‘๋‹ตํ•˜๋˜ API๋“ค์ด ์ ์  ๋Š๋ ค์ง€๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด์„œ ์‚ฌ์šฉ์ž๋“ค์ด “๋‹น์‹ ์˜ ์‹œ์Šคํ…œ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์–ด์š”. ๊ทธ์ € ์›น ํŽ˜์ด์ง€๋ฅผ ๋ณด๊ธฐ๋งŒ ํ•˜๋Š”๋ฐ ์™œ ์ด๋ ‡๊ฒŒ ๋Š๋ฆฐ๊ฑฐ์ฃ ?” ์ด๋Ÿฌํ•œ ๋ถˆ๋งŒ์„ ํ‘œ์ถœํ•˜๊ธฐ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ, ์—ฌ๋Ÿฌ๋ถ„์€ API ์„ฑ๋Šฅ์„ ์ตœ์ ํ™” ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ ๋ คํ•ด์•ผ ํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

API ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋จผ์ € ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋Š๋ฆฐ ์‘๋‹ต์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ ์„ ํŒŒ์•…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. API ์„ค๊ณ„๋Š” ๋งŽ์€ ์ธก๋ฉด์„ ๊ณ ๋ ค์• ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ ์–ธ์–ด ์ˆ˜์ค€์€ ์ผ๋ถ€๋ถ„์— ๋ถˆ๊ณผํ•ฉ๋‹ˆ๋‹ค. ์„ค๊ณ„๊ฐ€ ์ž˜๋ชป๋œ ๋ถ€๋ถ„์ด ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์ดˆ๋ž˜ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. API ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋Š” ๋งŽ์€ ์š”์†Œ๋“ค์ด ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์š”์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋Š๋ฆฐ ์ฟผ๋ฆฌ
  • ๋ณต์žกํ•œ ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง
  • ๋‚ฎ์€ ์„ฑ๋Šฅ์˜ ์ฝ”๋“œ
  • ๋ถ€์กฑํ•œ ๋ฆฌ์†Œ์Šค

๋„ค๋ฒˆ์งธ ํฌ์ธํŠธ์ธ ๋ถ€์กฑํ•œ ๋ฆฌ์†Œ์Šค๋Š” ์ƒ๋Œ€์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์— ์ผ์ •ํ•œ ํ™•์žฅ์„ฑ์ด ์žˆ๋‹ค๋ฉด ์„œ๋ฒ„๋ฅผ ์ถ”๊ฐ€ํ•จ์œผ๋กœ์จ ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•œ ๋‹ค๋ฅธ ํฌ์ธํŠธ์— ๋Œ€ํ•ด์„œ๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋”ฐ๋ผ ํ•ด๊ฒฐ์ฑ…์„ ์ œ์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚ฎ์€ ์„ฑ๋Šฅ ์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ๋Š” ์‚ฌ์‹ค ์ €๋Š” ์ด์ „์— Java ์ฝ”๋“œ์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™”์— ๋Œ€ํ•œ ๊ธ€์„ ์ž‘์„ฑํ•œ ์ ์ด ์žˆ์œผ๋ฉฐ, ๊ด€์‹ฌ์žˆ๋Š” ๋…์ž๋“ค์€ ์ฝ์–ด๋ณด์„ธ์š”.

์ด ๊ธ€์—์„œ๋Š” ์ €๋Š” ๋ช‡ ๊ฐ€์ง€ ํšจ๊ณผ์ ์ธ API ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ์ˆ ์„ ์š”์•ฝํ•˜์˜€์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๋…์ž๋“ค์—๊ฒŒ ๋„์›€์ด ๋˜๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋ณ‘๋ ฌ ํ˜ธ์ถœ

์ด์ œ ์ฃผ๋ฌธ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ์ „์ž ์ƒ๊ฑฐ๋ž˜ ์‹œ์Šคํ…œ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ์žฌ๊ณ  ์‹œ์Šคํ…œ์„ ํ˜ธ์ถœํ•˜์—ฌ ์žฌ๊ณ  ๊ฒ€์‚ฌ์™€ ์ฐจ๊ฐ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋ฉฐ, ์‚ฌ์šฉ์ž ์ฃผ์†Œ ์ •๋ณด๋„ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ์œ„ํ—˜ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์„ ํ˜ธ์ถœํ•ด ์ด ๊ฑฐ๋ž˜๊ฐ€ ์œ„ํ—˜ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋Œ€๋ถ€๋ถ„์˜ ์„ค๊ณ„๋Š” ์ˆœ์ฐจ ์‹คํ–‰ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์„ค๊ณ„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ, ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์ง„ํ–‰ํ•˜๊ธฐ ์ „์— ์‚ฌ์šฉ์ž ์ฃผ์†Œ ์ •๋ณด๋ฅผ ์–ป๊ณ  ์žฌ๊ณ  ์ฐจ๊ฐ์„ ์™„๋ฃŒํ•ด์•ผ ํ•˜๊ธฐ ๋Œ€๋ฌธ์ž…๋‹ˆ๋‹ค. ์˜์‚ฌ(Pseudo) ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งŒ์•ฝ ์ด ๊ธฐ๋Šฅ์„ ๋ถ„์„ํ•˜๋ฉด, ์—ฌ๋Ÿฌ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ๊ฐ„์˜ ๊ฐ•ํ•œ ์˜์กด์„ฑ์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด ์„ธ ์„œ๋น„์Šค์˜ ํ˜ธ์ถœ์€ ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ์ด ์„œ๋น„์Šค๋“ค์˜ ์‹œ๊ฐ„ ์†Œ๋ชจ์ ์ธ ํ˜ธ์ถœ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ถ„ํฌ๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

  • stockService.check() 150ms.
  • addressService.getByUser() 200ms.
  • riskControlSerivce.check() 300ms.

์ด API๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ํ˜ธ์ถœ๋œ๋‹ค๋ฉด, ์ „์ฒด API์˜ ์‹คํ–‰ ์‹œ๊ฐ„์€ 650ms(150ms + 200ms + 300ms)์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ณ‘๋ ฌ ํ˜ธ์ถœ๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ์‹œ๊ฐ„์€ 300ms๊ฐ€ ๋˜๋ฉฐ, ์„ฑ๋Šฅ์€ 50% ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค. ์˜์‚ฌ(Pseudo) ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ€๊ทœ๋ชจ ํŠธ๋žœ์žญ์…˜์„ ํ”ผํ•ด๋ผ.

์†Œ์œ„ ๋งํ•˜๋Š” ๋Œ€๊ทœ๋ชจ ํŠธ๋žœ์žญ์…˜์ด๋ž€ ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ํŠธ๋žœ์žญ์…˜์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ์Šคํ”„๋ง์˜ @Trasaction ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋žœ์žญ์…˜์„ ๊ด€๋ฆฌํ•  ๊ฒฝ์šฐ, ์‹ค์ˆ˜๋กœ ๋Œ€๊ทœ๋ชจ ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•˜์ง€ ์•Š์•˜๋Š”์ง€ ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์Šคํ”„๋ง์˜ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ์›์น™์€ ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์„ ํ•˜๋‚˜์˜ ์‹คํ–‰์œผ๋กœ ๋ณ‘ํ•ฉํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋–„๋ฌธ์—, API์—์„œ ๋‹ค์ˆ˜์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ๊ฐ€ ์žˆ๊ณ  ์ด API์˜ ๋™์‹œ ์ ‘๊ทผ๋Ÿ‰์ด ์ƒ๋Œ€์ ์œผ๋กœ ๋†’์€ ๊ฒฝ์šฐ, ๋Œ€๊ทœ๋ชจ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ์ธํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๊ณผ๋„ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ Lock ์ƒํƒœ๊ฐ€ ๋˜๋ฉฐ ๋งŽ์€์ˆ˜์˜ block์ด ๋ฐœ์ƒํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ํ’€์ด ๊ณ ๊ฐˆ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์˜ˆ๋ฅผ ์ˆ˜์ •ํ•˜๋Š”๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค.

๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ž‘์„ฑํ•œ ๋น„์ง€๋‹ˆ์Šค ์ฝ”๋“œ์—์„œ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์ฝ”๋“œ๊ฐ€ ๋“ฑ์žฅํ–ˆ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. RPC์™€ ๊ฐ™์€ non-DB ์ž‘์—…์ด ์˜์†ก์„ฑ ๊ณ„์ธต ์ฝ”๋“œ์™€ ํ˜ผํ•ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ฝ”๋“œ๋Š” ํ™•์‹คํžˆ ๋Œ€๊ทœ๋ชจ ํŠธ๋žœ์žญ์…˜ ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์˜ ์ฃผ์†Œ๋ฅผ ์กฐํšŒํ•˜๊ณ  ์žฌ๊ณ ๋ฅผ ์ฐจ๊ฐํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์ฃผ๋ฌธ ๋ฐ์ดํ„ฐ์™€ ์ฃผ๋ฌธ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ insert(์‚ฝ์ž…) ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ผ๋ จ์˜ ์ž‘์—…์€ ๋™์ผํ•œ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋ณ‘ํ•ฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. RPC ์‘๋‹ต์ด ๋Š๋ฆฐ ๊ฒฝ์šฐ, ํ˜„์žฌ ์Šค๋ ˆ๋“œ๊ฐ€ ํ•ญ์ƒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ์ฐจ์ง€ํ•˜์—ฌ ๋™์‹œ์„ฑ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์ด ๊ณ ๊ฐˆ๋ฉ๋‹ˆ๋‹ค. ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ํŠธ๋žœ์žญ์…˜์ด ๋กค๋ฐฑ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, ๋กค๋ฐฑ์ด ๋Š๋ ค์„œ API ์‘๋‹ต์ด ๋Š๋ ค์ง‘๋‹ˆ๋‹ค.

์ด๋•Œ, ๋น„์ง€๋‹ˆ์Šค๋ฅผ ์ถ•์†Œํ•˜๋Š”๊ฒƒ์„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋น„ํŠธ๋žœ์žญ์…˜ ์ž‘์—…๊ณผ ํŠธ๋žœ์žญ์…˜ ์ž‘์—…์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜๋Š” ์Šคํ”„๋ง์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์ธ ํŠธ๋žœ์žญ์…˜์˜ TransactionTemplate ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ ์ ˆํ•œ ์ธ๋ฑ์Šค ์ถ”๊ฐ€

์„œ๋น„์Šค๊ฐ€ ์šด์˜ ์ดˆ๊ธฐ ๋‹จ๊ณ„์— ์žˆ์„ ๋•Œ, ์‹œ์Šคํ…œ์ด ์ €์žฅํ•ด์•ผ ํ•  ๋ฐ์ดํ„ฐ์˜ ์–‘์€ ์ ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ €์žฅํ•˜๊ณ  ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์•˜์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋น„์ง€๋‹ˆ์Šค๊ฐ€ ์„ฑ์žฅํ•จ์— ๋”ฐ๋ผ ๋‹จ์ผ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ์˜ ์–‘์ด ๊ณ„์† ์ฆ๊ฐ€ํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ฟผ๋ฆฌ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์— ์ ์ ˆํ•œ ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ”์˜ ์ธ๋ฑ์Šค๋ฅผ ๋ณด๋ ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์—ฌ๊ธฐ์„œ๋Š” MySQL๋กœ ์˜ˆ๋ฅผ ๋“ญ๋‹ˆ๋‹ค.)

SHOW INDEX FROM `your_table_name`;

ALTER TABLE ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•ด ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

ALTER TABLE `your_table_name` ADD INDEX index_name(username);

๋•Œ๋–„๋กœ, ๋ช‡๋ช‡ ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๋”๋ผ๋„ ๋ฐ์ดํ„ฐ ์ฟผ๋ฆฌ๊ฐ€ ์—ฌ์ „ํžˆ ๋Š๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ๋Š” explain ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ ๊ณ„ํš์„ ๋ณด๊ณ  SQL ๋ฌธ์ด ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด ์•„๋ž˜์™€ ๊ฐ™์ด ๋ถ„์„๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

EXPLAIN SELECT * FROM product_info WHERE type=0;

์ผ๋ฐ˜์ ์œผ๋กœ, ์ธ๋ฑ์Šค ๋ˆ„๋ฝ์˜ ๋ช‡ ๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ฐ€์žฅ์™ผ์ชฝ ์ ‘๋‘์‚ฌ(prefix) ์›์น™์ด ์ถฉ์กฑ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, tb1 ์— ๋Œ€ํ•ด ๊ฒฐํ•ฉ ์ธ๋ฐ์Šค idx(a,b,c) ๋ฅผ ์ƒ์„ฑํ–ˆ์ง€๋งŒ, SQL๋ฌธ์ด select * from tb1 where b='xxx' and c='xxxx'; ์™€ ๊ฐ™์ด ์ž‘์„ฑ๋˜์—ˆ์„ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.
  • ์ธ๋ฑ์Šค ์—ด์— ์‚ฐ์ˆ  ์—ฐ์‚ฐ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ž…๋‹ˆ๋‹ค.
    • select * from tb1 where a%10=0;
  • like ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ Fuzzy ์ฟผ๋ฆฌ์ž…๋‹ˆ๋‹ค.
    • select * from tb1 where a like '%aaa';
  • not in ๋˜๋Š” not exist ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ

์ ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜

๋งŒ์•ฝ ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฟผ๋ฆฌ๋กœ ์กฐํšŒํ• ๋•Œ, ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํŽ˜์ด์ง• ํ˜•์‹์œผ๋กœ ์ ์ง„์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์œผ๋กœ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์ „์†ก๋˜๋Š” ๋ฐ์ดํ„ฐ ์–‘์ด ์ค„์–ด๋“ค๊ณ , ๋ฐ์ดํ„ฐ ์ธ์ฝ”๋”ฉ ๋ฐ ๋””์ฝ”๋”ฉ ์‹œ๊ฐ„์ด ์ค„์–ด๋“ค๋ฉฐ, API ์‘๋‹ต ์†๋„๊ฐ€ ๋นจ๋ผ์ง‘๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ „ํ†ต์ ์œผ๋กœ limit offset ํŽ˜์ด์ง• ๋ฐฉ๋ฒ•์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. (select * from product limit 10000,20) ํŽ˜์ด์ง€ ์ˆ˜๊ฐ€ ๋งŽ์„ ๋•Œ, ์ฟผ๋ฆฌ๋Š” ์ ์  ๋Š๋ ค์ง‘๋‹ˆ๋‹ค. ์ด๋Š” limit offset ํŽ˜์ด์ง• ๋ฐฉ์‹์˜ ์›์น™์ด 10000๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•„๋‚ด๊ณ  ์ด์ „์˜ 9980๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฒ„๋ฆฌ๋Š ใ„ด๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” ์ง€์—ฐ๋œ ์ƒ๊ด€ ๊ด€๊ณ„๋ฅผ ์‚ฌ์šฉํ•ด SQL์„ ์ตœ์ ํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

select * from product where id in (select id from product limit 10000,20);

์บ์‹œ ์‚ฌ์šฉ

์บ์‹ฑ์€ ๊ณต๊ฐ„์„ ์‹œ๊ฐ„์œผ๋กœ ๋ฐ”๊พธ๋Š” ํ•ด๊ฒฐ์ฑ… ์ž…๋‹ˆ๋‹ค. ์ผ๋ถ€ ์‚ฌ์šฉ์ž์— ์˜ํ•ด ์ž์ฃผ ์ ‘๊ทผ๋˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์ง์ ‘ ์บ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ์˜ ์ฝ๊ธฐ ์†๋„๊ฐ€ ๋””์Šคํฌ IO๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ๋•Œ๋ฌธ์— ์ ์ ˆํ•œ ์บ์‹ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ API์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํžˆ ๋งํ•ด, Java HashMap, ConcurrentHashMap ๋˜๋Š” ๋กœ์ปฌ ์บ์‹œ(ex: caffeine), ๋ถ„์‚ฐ ์บ์‹œ ๋ฏธ๋“ค์›จ์–ด(ex) Memcached, Redis)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

์—ฌ๊ธฐ์—์„œ ๋‹ค์„ฏ๊ฐ€์ง€ ์ผ๋ฐ˜์ ์ธ API ์„ฑ๋Šฅ ์ตœ์ ํ™” ์š”๋ น์„ ๋‚˜์—ดํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ์š”๋ น๋“ค์€ ์‹œ์Šคํ…œ์— ์ผ์ •ํ•œ ๋™์‹œ์„ฑ ์š”์ฒญ์ด ์žˆ์„ ๋–„๋งŒ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์—ฌ๋Ÿฌ๋ถ„์˜ ์‹œ์Šคํ…œ ํŠธ๋ž˜ํ”ฝ์ด ํฌ์ง€ ์•Š๋‹ค๋ฉด, ์œ„์˜ ์ œ์•ˆ๋“ค์„ ์‹ ์ค‘ํ•˜๊ฒŒ ๊ณ ๋ คํ•ด์ฃผ์„ธ์š”. ๋” ํšจ๊ณผ์ ์ธ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์•„๋ณด์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ์ด ๊ธ€์ด ์—ฌ๋Ÿฌ๋ถ„๋“ค์—๊ฒŒ ๋„์›€๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

728x90
728x90