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

Develop

๐Ÿ‘จ๐Ÿป‍๐Ÿ’ป 2020 WOOWACON(์šฐ์•„ํ•œํ…Œํฌ์ฝ˜์„œํŠธ)

๐Ÿ“Œ SESSION 01: ๋ฐฐ๋‹ฌ์˜ ๋ฏผ์กฑ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์—ฌํ–‰๊ธฐ(๊น€์˜ํ•œ)

๋งค๋…„ ์ฃผ๋ฌธ ์ˆ˜๊ฐ€ ํ‰๊ท  3๋ฐฐ ์ด์ƒ ์ฆ๊ฐ€ํ•  ์ •๋„๋กœ ๋น ๋ฅด๊ฒŒ ์„ฑ์žฅํ•˜๊ณ  ์žˆ๋‹ค.

2015

  • ํ•˜๋ฃจ ์ฃผ๋ฌธ์ˆ˜ 5๋งŒ ์ดํ•˜
  • MS SQL + PHP,ASP
  • ๋Œ€๋ถ€๋ถ„ ๋ฃจ๋น„DB(MS SQL) ์Šคํ„ฐ์–ด๋“œ ํ”„๋กœ์‹œ์ € ๋ฐฉ์‹ ์‚ฌ์šฉ
  • ํ•˜๋‚˜์˜ ๋ฃจ๋น„DB๋ฅผ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์žฅ์•  ์‹œ ์ „์ฒด ์„œ๋น„์Šค์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

2016

  • ํ•˜๋ฃจ ์ฃผ๋ฌธ์ˆ˜ 10๋งŒ ๋ŒํŒŒ
  • PHP์—์„œ Java๋กœ ๋ณ€๊ฒฝ
  • ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๋„์ „ ์‹œ์ž‘ (๊ฒฐ์ œ ์„œ๋น„์Šค)
  • ๊ฒฐ์ œ, ์ฃผ๋ฌธ์ค‘๊ณ„ ๋…๋ฆฝ
  • IDC์—์„œ AWS ํด๋ผ์šฐ๋“œ ์ธํ”„๋ผ๋กœ ์ด์ „ ์‹œ์ž‘

์น˜ํ‚จ ๋””๋„์Šค

  • ์„ ์ฐฉ์ˆœ ๊ฒฐ์ œ ํ• ์ธ ์ด๋ฒคํŠธ (7์ฒœ ์› ํ• ์ธ)
  • ํ”„๋ก ํŠธ ์„œ๋ฒ„ -> ์ฃผ๋ฌธ -> ๊ฒฐ์ œ
  • ๋งŽ์€ ํŠธ๋ž˜ํ”ฝ์œผ๋กœ ์ธํ•ด ํ”„๋ก ํŠธ ์„œ๋ฒ„๊ฐ€ ์ฃฝ์–ด๋ฒ„๋ ธ๋‹ค.
  • IDC์—์„œ ํ•˜๋ฃจ ๋งŒ์— AWS๋กœ ์ด์ „ (์žฅ๋น„ 100๋Œ€ ์ฆ์„ค)
  • ํ•˜์ง€๋งŒ ์ฃผ๋ฌธ ์„œ๋ฒ„๊ฐ€ ์ฃฝ์–ด๋ฒ„๋ ค์„œ ์ฃผ๋ฌธ ์‹œ์Šคํ…œ๋„ AWS๋กœ 100๋Œ€ ์ฆ์„ค
  • ๊ฒฐ์ œ๊นŒ์ง€ ๋„˜์–ด๊ฐ”์ง€๋งŒ ์™ธ๋ถ€ PG, ์นด๋“œ์‚ฌ์—์„œ ์ฃฝ์–ด๋ฒ„๋ฆผ (2๋ฐฐ ์žฅ๋น„ ํˆฌ์ž…)

2017

  • ํ•˜๋ฃจ ์ฃผ๋ฌธ์ˆ˜ 20๋งŒ ๋ŒํŒŒ (๋งŽ์€ ์žฅ์• ์˜ ์‹œ๋Œ€)
  • ๋ฉ”๋‰ด, ์ •์‚ฐ, ๊ฐ€๊ฒŒ ๋ชฉ๋ก ์‹œ์Šคํ…œ ๋…๋ฆฝ
  • ์žฅ์•  ๋ฐœ์ƒ ์‹œ ํƒ€๊ฒฉ์ด ์‹ฌํ•จ.

2018 ์ƒ๋ฐ˜๊ธฐ

  • ์ „์‚ฌ 1์ˆœ์œ„ ๊ณผ์ œ๋Š” ์‹œ์Šคํ…œ ์•ˆ์ „์„ฑ
  • N ๊ณต๊ณ  ํญํŒŒ์‹œํ‚ค๊ณ  ์žฅ์•  ๋Œ€์‘ TF ์ฐฝ์„ค
  • ์ฟ ํฐ, ํฌ์ธํŠธ ํƒˆ๋ฃจ๋น„
  • ์˜คํ”„๋ผ์ธ ๋ชจ๋“œ ์ ์šฉ
  • ์‹ ๊ทœ ๊ฐ€๊ฒŒ์ƒ์„ธ -> 1๋ถ„~5๋ถ„ ์ฃผ๊ธฐ๋กœ ํฐ ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ ค AWS ๋‹ค์ด๋‚˜๋ชจ DB์— ์˜ฌ๋ ธ๋‹ค.

2018 ํ•˜๋ฐ˜๊ธฐ

  • ์ฃผ๋ฌธ, ๋ฆฌ๋ทฐ ํƒˆ๋ฃจ๋น„ 
  • ๋ชจ๋“  ๋ถ€๋ถ„์—์„œ ์ฃผ๋ฌธ ์‹œ์Šคํ…œ์ด ์—ฎ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ปค๋จธ์Šค ๋„๋ฉ”์ธ์—์„œ ๊ฐ€์žฅ ๋ณต์žกํ•˜๋‹ค.
  • ๋ ˆ๊ฑฐ์‹œ 3๋Œ€์žฅ - ์ฃผ๋ฌธ, ๊ฐ€๊ฒŒ/์—…์ฃผ, ๊ด‘๊ณ 
  • ๊ธฐ์กด API ๊ธฐ๋ฐ˜์ด๋ผ ์ฃผ๋ฌธ ์‹œ์Šคํ…œ์ด ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์— ์˜ํ–ฅ์„ ๋ฏธ์ณค๋‹ค. ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋ฉด์„œ ์žฅ์• ๊ฐ€ ๊ธ‰๊ฒฉํ•˜๊ฒŒ ์ค„์–ด๋“œ๋Š” ํšจ๊ณผ๋ฅผ ๋ดค๋‹ค.

๋จผ๋ฐ์ด ์•„ํ‚คํ…์ฒ˜

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

์ •๋ฆฌ

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

๐Ÿ“Œ SESSION 02: ๋ฐฐ๋ฏผ ํ”„๋ก ํŠธ์„œ๋ฒ„์˜ ์‚ฌ์‹ค๊ณผ ์˜คํ•ด(๊ถŒ์šฉ๊ทผ)

ํ”„๋ก ํŠธ ์„œ๋ฒ„๋ž€?

์‚ฌ์šฉ์ž ์ „๋ฉด ์„œ๋ฒ„ (์ „์‹œ ์‹œ์Šคํ…œ ๋“ฑ ๋‹ค์–‘ํ•œ ์šฉ์–ด๋“ค์ด ์žˆ์ง€๋งŒ ์—ฌ๊ธฐ์„  ํ”„๋ก ํŠธ ์„œ๋ฒ„๋ผ๊ณ  ๋ช…์นญํ•œ๋‹ค)

ํ”„๋ก ํŠธ ์„œ๋ฒ„์˜ ๊ธฐ์ˆ ์€ ๋‹จ์ˆœํ•˜๋‹ค?

  • Spring, MVC, Redis๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ–ˆ๋‹ค.
  • ์ˆ˜ ๋งŽ์€ ์™ธ๋ถ€ ์„œ๋น„์Šค์˜ ์‹ค์‹œ๊ฐ„ ์ƒํƒœ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
    • ex) 1๊ฐœ ๊ฐ€๊ฒŒ ๋…ธ์ถœํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์™ธ๋ถ€ ์š”์ฒญ ์ˆ˜๋Š” 13๊ฐœ๊ฐ€ ์ด๋‹ค. ์š”์ฒญ๋งˆ๋‹ค 50ms๊ฐ€ ์†Œ์š”๋œ๋‹ค๊ณ  ํ•˜๋ฉด 650ms๊ฐ€ ๊ฑธ๋ฆฌ๋ฏ€๋กœ ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„  ๋А๋ฆฌ๊ฒŒ ๋А๊ปด์งˆ ์ˆ˜ ์žˆ๋‹ค.
    • ๋”ฐ๋ผ์„œ ๋น„๋™๊ธฐ๋กœ ์ž‘์—…ํ•ด์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์Šค๋ ˆ๋“œ ์ง€์˜ฅ์„ ๋งˆ์ฃผํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋Œ€๊ธฐ ์ƒํ™ฉ์—์„œ ์Šค๋ ˆ๋“œ๊ฐ€ ์ฐจ๋‹จ๋˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” Non-Blocking I/O๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
    • Spring 5์˜ WebFlux๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ๋Š”๋ฐ ๊ธฐ์ˆ ๊ณผ ํŒจ๋Ÿฌ๋‹ค์ž„์ด ๋‹ฌ๋ผ ๊ธฐ์ˆ ์ ์ธ ํฐ ๋„์ „์ด ํ•„์š”ํ•œ ์„ ํƒ์ด์—ˆ๋‹ค.
    • ๋งŽ์€ ๋™์‹œ ์š”์ฒญ, ํŠธ๋ž˜ํ”ฝ, ์ข‹์€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ œ๊ณตํ•ด์•ผ ํ–ˆ๊ธฐ์— WebFlux๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.
  • MSA ์ตœ์ „๋ฐฉ
    • CQRS - ๋ช…๋ น๊ณผ ์กฐํšŒ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ์‹œ์Šคํ…œ
    • ์ •ํ•ฉ์„ฑ์ด ์ค‘์š”ํ•œ ์‹œ์Šคํ…œ๊ณผ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋น ๋ฅธ ์‘๋‹ต๊ณผ ์ข‹์€ ์‚ฌ์šฉ์„ฑ์„ ์ œ๊ณตํ•˜๋Š” ์‹œ์Šคํ…œ์„ ๋ถ„๋ฆฌ
    • Eventually Consistency(์ตœ์ข…์  ์ผ๊ด€์„ฑ) - ์ง์ ‘ ์š”์ฒญํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœํ–‰ํ•˜์—ฌ ์Šค์Šค๋กœ ํ•  ์ผ๋งŒ ์ž˜ํ•˜๋ฉด ๋˜์–ด์„œ ๊ฐ ์‹œ์Šคํ…œ์ด ์ •ํ•ฉ์„ฑ์ด ๋†’์•„์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฒคํŠธ๋Š” ์œ ์‹ค๋˜์ง€ ์•Š๋Š” ํ์— ๋ณด๋‚ด์–ด ์ˆ˜์‹ ํ•˜๋Š” ์‹œ์Šคํ…œ๋“ค์€ ์ด๋ฒคํŠธ๋ฅผ ์–ธ์  ๊ฐ€๋Š” ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ”„๋ก ํŠธ ์„œ๋ฒ„๋Š” ๊ฐ์ฒด, ๋„๋ฉ”์ธ ์ค‘์‹ฌ์ ์ธ ๊ฐœ๋ฐœ์„ ํ•  ์ˆ˜ ์—†๋‹ค?

  • ๊ตฌ์ฒด์ ์ธ ๋ฐ์ดํ„ฐ
    • ์ €์žฅ์†Œ์— ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž๊ฒŒ ๊ฐ€๊ณต๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ์œผ๋ฉด ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต๊ตฌํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์€ ์ˆ˜์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค.
    • ์ €์žฅ์†Œ์— ์›๋ณธ์˜ ํ˜•ํƒœ์™€ ์œ ์‚ฌํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋‹ค๋ฉด ๋ณต๊ตฌํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์€ ์งง์•„์ง„๋‹ค.
    • ์•ˆ์ •๋œ ์˜์กด ๊ด€๊ณ„ ์›์น™(SDP) - ๋ถˆ์•ˆ์ •์„ฑ = ๋‚˜๊ฐ€๋Š” ์˜์กด์„ฑ / (๋“ค์–ด์˜ค๋Š” ์˜์กด์„ฑ + ๋‚˜๊ฐ€๋Š” ์˜์กด์„ฑ) -> 1์€ ๋ถˆ์•ˆ์ •ํ•œ ์ƒํƒœ
    • ์•ˆ์ •๋œ ์ถ”์ƒํ™” ์›์น™(SAP) - ์•ˆ์ •๋œ ์ •๋„๋งŒํผ๋งŒ ์ถ”์ƒํ™”๋˜์–ด์•ผ ํ•œ๋‹ค. (๊ตฌ์ฒด์ ์ธ ๊ฒƒ์€ ์ถ”์ƒ์ ์ธ ๊ฒƒ๊ณผ ๋ฐ˜๋Œ€๋˜๋Š” ๋ง)
    • ์˜์กด ์—ญ์ „ ์›์น™(DIP) - ์•ˆ์ •ํ•œ ์ชฝ์—์„œ ๋ถˆ์•ˆ์ •์„ ์˜์กดํ•˜๋Š” ๊ฒƒ์„ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ถ”์ƒํ™”ํ•˜์—ฌ ์˜์กด์„ ์—ญ์ „ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋„๋ฉ”์ธ์— ๊ด€ํ•˜์—ฌ
    • MSA๋Š” ํฐ ๋ฌธ์ œ๋ฅผ ๋ถ„ํ• ํ•˜์—ฌ ์ž‘์€ ๋ฌธ์ œ๋ฅผ ๋งŒ๋“ค์–ด ๋ฌธ์ œ๋ฅผ ํ’€์–ด๊ฐ„๋‹ค.
    • ํ”„๋ก ํŠธ ์„œ๋ฒ„๋Š” ์ž‘์€ ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ๋ชจ์•„ ํฐ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋‚˜๊ฐ„๋‹ค.
    • Serivce๋Š” API ์ •๋ณด์™€ ๋ฐ์ดํ„ฐ๋“ค์˜ ์ •๋ณด๋ฅผ ์กฐํ•ฉํ•ด์•ผ ํ•˜๋Š”๋ฐ ์ด๋Ÿฌ๋ฉด ์„œ๋น„์Šค๋Š” ๋‘๊บผ์›Œ์งˆ ์ˆ˜ ๋ฐ–์— ์—†๋‹ค.
    • Service๋Š” ์–‡์•„์•ผ ํ•œ๋‹ค.
    • ๋น„๋Œ€ํ•ด์ง„ ์„œ๋น„์Šค๋ฅผ ๋„๋ฉ”์ธ ์ชฝ์œผ๋กœ ํก์ˆ˜ํ•˜์—ฌ ์–‡์€ ์„œ๋น„์Šค๋กœ ๋งŒ๋“ค๊ณ , ๋ฉ”์ธ์ด ๋” ๋šฑ๋šฑํ•ด์ง€๋Š” ๋งˆํ‹ด ํŒŒ์šธ๋Ÿฌ์˜ ์ด์ƒ์ ์ธ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“Œ SESSION 03: ๋ฐฐ๋‹ฌ์˜ ๋ฏผ์กฑ DB IDC ํƒˆ์ถœ๊ธฐ(๋ฐ•์ฃผํฌ)

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋ผ์šฐ๋“œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ณผ์ •์„ ๊ธฐ์Šน์ „๊ฒฐ๋กœ ๋‚˜๋ˆ ์„œ ์‚ดํŽด๋ณด๋„๋ก ํ•œ๋‹ค.

๊ธฐ: ์šฐ๋ฆฌ์—๊ฒŒ ์ฃผ์–ด์ง„ ๊ณผ์ œ

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

์Šน: ์šฐ์•„ํ•œํ˜•์ œ๋“ค์˜ ํด๋ผ์šฐ๋“œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜, ๊ทธ ์‹œ์ž‘

  • ๋‹ฌ๋ฆฌ๋Š” ์ˆ˜๋ ˆ์— ๋ฐ”ํ€ด๋ฅผ ๋‹ค๋Š” ๊ฒƒ์ด ์‰ฝ์ง€ ์•Š๋‹ค.
  • AWS ๋„์ž…, MSA ๊ตฌ์กฐ ๋„์ž…
  • ์˜์กด๋„๋ฅผ ๋‚ฎ์ถ”๋Š” ์ž‘์—…์„ ํ–ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ ์‹ฑํฌ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์„ ์™„๋ฒฝํ•˜๊ฒŒ ๊ทน๋ณตํ•˜์ง€ ๋ชปํ–ˆ๋‹ค.

์ „: ์‹คํŒจ์™€ ์„ฑ์žฅ

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

๋‘๊ฐ€์ง€ ์ „๋žต

  • ๋ฌด์ค‘๋‹จ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜
    • ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋ฒ”์œ„๊ฐ€ ๋„“๊ณ , ์„œ๋น„์Šค ์ค‘๋‹จ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ์ ํ•ฉํ•˜๋‹ค.
    • ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ค‘ ์ง€์†์ ์ธ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.
    • Validation์„ ์œ„ํ•œ ์ถฉ๋ถ„ํ•œ ์‹œ๊ฐ„์ด ํ•„์š”ํ•˜๋‹ค.
    • Master-Standby ๊ตฌ์กฐ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ดํ›„ ์ด์Šˆ ๋ฐœ์ƒ ์‹œ ๋น ๋ฅธ ๋กค๋ฐฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๋น ๋ฅธ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜
    • ์„œ๋น„์Šค ์šด์˜ ์‹œ๊ฐ„์ด ์ œํ•œ ๋˜์–ด ์žˆ๊ฑฐ๋‚˜, ๋‚ด๋ถ€ ์šด์˜์„ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ ํ•ฉํ•˜๋‹ค.
    • ์„œ๋น„์Šค ์ค‘๋‹จ์œผ๋กœ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ ๊ณผ์ •์„ ์ƒ๋žต ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฒฐ: ๋ถˆ๊ฐ€๋Šฅํ•  ์ค„ ์•Œ์•˜๋˜ ์ผ

  • 600๊ฐœ ์ด์ƒ์˜ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋กœ ๊ตฌ์„ฑ
  • ์•„ํ‚คํ…์ฒ˜ ์ตœ์ ํ™”, ๋ก ์นญ ์‹œ๊ฐ„ ๋‹จ์ถ•, ์žฅ์•  ํ™•์‚ฐ ๋ฐฉ์ง€
  • ์„œ๋น„์Šค ๋‹จ์œ„ ์„ฑ๋Šฅ ์ตœ์ ํ™”(์Šค์ผ€์ผ ์—…, ์Šค์ผ€์ผ ์•„์›ƒ์„ ์ ์ ˆํ•˜๊ฒŒ ํ™œ์šฉ), ๊ฐ•ํ™”๋œ ๋ชจ๋‹ˆํ„ฐ๋ง

๐Ÿ“Œ SESSION 04: ๊ฒ‰๋ฐ”์†์ด‰ ์น˜ํ‚จ์˜ ๊ณจ๋“ ํƒ€์ž„์„ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด ๋ฐฐ๋ฏผ์ด ํ•˜๋Š” ์ผ(์ด์žฌ์ผ)

๋ฌธ์ œ์ 

  • ์›๋ž˜ ๋„์ฐฉ ์˜ˆ์ • ์‹œ๊ฐ„๋ณด๋‹ค ๋Šฆ๊ฒŒ ๋ฐฐ๋‹ฌ๋  ํ™•๋ฅ ์ด ๋†’์„ ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฌด๋ฆฌํ•œ ๋ฐฐ์ฐจ๋กœ ์‚ฌ๊ณ ๊ฐ€ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค.
  • ์ด์™€ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•œ๋‹ค.

AI ์ถ”์ฒœ๋ฐฐ์ฐจ(beta)

  • 1๋‹จ๊ณ„: ๋น„์šฉ์„ ๊ณ„์‚ฐํ•˜์ž
  • 2๋‹จ๊ณ„: ๊ฒฝ๋กœ ์„ ํƒ (๋‚ด ์น˜ํ‚จ์€ ์–ด๋””์— ๋ผ์–ด๋“ค์ง€?) - ๋ชจ๋“  ๊ฒฝ๋กœ ๊ณ„์‚ฐ
    • ํ•˜๋‚˜์˜ ์ฃผ๋ฌธ์— ๋Œ€ํ•ด ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ๋งŽ์€๋ฐ ๋ฌธ์ œ๋Š” ๋งŽ์€ ์ฃผ๋ฌธ์ด ์ผ์–ด๋‚œ๋‹ค.
    • Greedy Algorithm(ํƒ์š• ์•Œ๊ณ ๋ฆฌ์ฆ˜) ํ™œ์šฉ
      • ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ธฐ ๋ณด๋‹ค ์ตœ๋Œ€ํ•œ ๊ทผ์‚ฌ๊ฐ’์„ ๊ตฌํ•œ๋‹ค.
      • n๊ฐœ ๋ฐฐ๋‹ฌ ์ˆ˜ํ–‰ํ•˜๋Š” ์ตœ์  ๊ฒฝ๋กœ = n-1๊ฐœ ๋ฐฐ๋‹ฌ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ตœ์ ์˜ ๊ฒฝ๋กœ ์ค‘ ๋ฐฐ๋‹ฌ์„ ์‚ฌ์ด ์‚ฌ์ด์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒฝ๋กœ์ค‘ ์ตœ์ ์˜ ๊ฒฝ๋กœ
      • ์ตœ์ ์˜ ๋น„์šฉ๋ณด๋‹ค, ๊ฐ€๋Šฅํ•œ ๋‚ฎ์€ ๋น„์šฉ์„ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  • 3๋‹จ๊ณ„: ์ตœ์ ์˜ ๋ผ์ด๋” ์„ ์ •
    • ์‹ ๊ทœ ๋น„์šฉ - ์ด์ „ ๋น„์šฉ์ด ๊ฐ€์žฅ ์ ์€ ๋ผ์ด๋” ์„ ์ •
  • 4๋‹จ๊ณ„: ๊ฑฐ๋ฆฌ๊ฐ€ ์ง์„ ๊ฑฐ๋ฆฌ๋Š” ์ข€ ๊ทธ๋ ‡์ž–์•„์š”?
    • ์ง์„ ์œผ๋กœ ๊ฑฐ๋ฆฌ๋ฅผ ์ธก์ •ํ•œ๋‹ค๋ฉด ์‚ฐ์„ ๋„˜์–ด๊ฐˆ ์ˆ˜๋„ ์žˆ๋‹ค.
    • OSRM - ์ตœ์  ๊ฒฝ๋กœ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์˜คํ”ˆ์†Œ์Šค ํˆด
  • ๊ณ ๋ฏผ๊ฑฐ๋ฆฌ
    • ๊ผญ ์ •ํ™•ํ•œ ์‹ค๊ฑฐ๋ฆฌ๋Š” ์•„๋‹ˆ์—ฌ๋„ ๋œ๋‹ค.
    • ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ๋Š” Cached์—ฌ์•ผ ํ•œ๋‹ค.
    • ๋ฏธ๋ฆฌ ๋ชจ๋‘ ๊ณ„์‚ฐํ•ด์„œ ์ €์žฅํ•  ์ˆ˜๋Š” ์—†์„๊นŒ? - REDIS ์„ ํƒ

๋งˆ์ง€๋ง‰ ๋‚œ๊ด€

  • ๋ฉ์น˜๊ฐ€ ํฐ ๋ฐ์ดํ„ฐ
  • ๋ฐ”์ด๋„ˆ๋ฆฌ ์••์ถ• ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๋Š”๋ฐ ๋น ๋ฅธ ๊ตฌํ˜„์„ ์œ„ํ•ด ๋ฐ”์ดํŠธ๋กœ ์ „์†ก

๐Ÿ“Œ SESSION 07: ์ˆ˜์‹ญ์–ต๊ฑด์—์„œ QUERYDSL ์‚ฌ์šฉํ•˜๊ธฐ(์ด๋™์šฑ)

์ ์žฌ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ 1000๋งŒ๊ฑด์—์„œ 10์–ต๊ฑด๊นŒ์ง€ ๋˜๋Š” ๊ณผ์ •์—์„œ ์–ป์€ Querydsl-JPA ๊ฐœ์„  TIP์— ๋Œ€ํ•ด ์†Œ๊ฐœํ•˜๊ณ ์ž ํ•œ๋‹ค.

์›Œ๋ฐ์—…

  • extends / implements ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ
  • ๋งค๋ฒˆ ์ธํ„ฐํŽ˜์ด์Šค/Impl ๊ตฌ์กฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
  • ๊ผญ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ƒ์†/๊ตฌํ˜„ ๋ฐ›์ง€ ์•Š๊ฑฐ๋‚˜, ํŠน์ • ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š๋”๋ผ๋„ Queydsl์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•œ๋‹ค.
  • JPAQueryFactory๋งŒ ์žˆ์œผ๋ฉด Querydsl์€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. (extends/implements ์ œ๊ฑฐ ๊ฐ€๋Šฅ)
  • if๋ฌธ์œผ๋กœ ๋ถ„๊ธฐ์ฒ˜๋ฆฌํ•˜๋ฉด ์–ด๋–ค ์ฟผ๋ฆฌ์ธ์ง€ ํŒŒ์•…ํ•˜๊ธฐ ํž˜๋“ค๊ธฐ ๋•Œ๋ฌธ์— ๋™์ ์ฟผ๋ฆฌ๋Š” BooleanExpression๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์„ฑ๋Šฅ๊ฐœ์„  - Select

  • exist ๋ฉ”์„œ๋“œ๋ฅผ ๊ธˆ์ง€ํ•œ๋‹ค.
    • exists๊ฐ€ ๋น ๋ฅธ ์ด์œ ๋Š” ์กฐ๊ฑด์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ 1๊ฐœ๋งŒ ์ฐพ์œผ๋ฉด ๋‹ค์Œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœํšŒํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๊ธˆ์ง€ํ•˜๋Š” ์ด์œ ๋Š” Querydsl์˜ exsists๋Š” ์‹ค์ œ๋กœ count() > 0 ์œผ๋กœ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๋Œ€๋กœ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค.
    • JPQL์€ from ์—†์ด๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.
    • limit 1๋กœ ์กฐํšŒ๋ฅผ ์ œํ•œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๋Š”๋ฐ ์กฐํšŒ ๊ฒฐ๊ณผ๊ฐ€ ์—†์œผ๋ฉด null์ด๋ผ์„œ ์ฒดํฌํ•ด์ค˜์•ผ ํ•œ๋‹ค. (์ด ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•˜๋ฉด ์„ฑ๋Šฅ์ƒ ํฐ ์ฐจ์ด๊ฐ€ ์—†๋‹ค)
  • Cross Join ํšŒํ”ผํ•ด์•ผ ํ•œ๋‹ค. ๋ฌต์‹œ์  Join์œผ๋กœ Cross Join์ด ๋ฐœ์ƒํ•˜๋Š”๋ฐ Hibernate ์ด์Šˆ๋ผ์„œ Spring Data JPA๋„ ๋™์ผํ•˜๊ฒŒ ๋ฐœ์ƒํ•œ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ช…์‹œ์  Join์œผ๋กœ Inner join์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ์ด๋‹ค.
  • Entity ๋ณด๋‹ค Dto๋ฅผ ์šฐ์„ ์œผ๋กœ ํ•œ๋‹ค. Entity ์กฐํšŒ์‹œ Hibernate ์บ์‹œ ๋ถˆํ•„์š”ํ•œ ์ปฌ๋Ÿผ์„ ์กฐํšŒํ•˜๋ฉฐ OneToOne N+1 ์ฟผ๋ฆฌ ๋“ฑ ๋‹จ์ˆœ ์กฐํšŒ ๊ธฐ๋Šฅ์—์„œ๋Š” ์„ฑ๋Šฅ ์ด์Šˆ ์š”์†Œ๊ฐ€ ๋งŽ๋‹ค.
    • ์กฐํšŒ ์ปฌ๋Ÿผ์„ ์ตœ์†Œํ™” ํ•ด์•ผ ํ•˜๋Š”๋ฐ ์šฐ๋ฆฌ๊ฐ€ ๋ฏธ๋ฆฌ ์•Œ๊ณ  ์žˆ๋Š” ์ปฌ๋Ÿผ์€ ์ œ์™ธํ•˜๋ฉด ์ข‹๋‹ค.
  • Select ์ปฌ๋Ÿผ์— Entity ์ž์ œ - id ์ปฌ๋Ÿผ์„ ์กฐํšŒํ•˜๋Š” ๊ฒƒ์ด ์„ฑ๋Šฅ์ƒ ์ด์ ์ด ํฌ๋‹ค.
  • Group By ์ตœ์ ํ™”
    • MySQL์—์„œ Group By๋ฅผ ์‹คํ–‰ํ•˜๋ฉด Filesort ๊ฐ€ ํ•„์ˆ˜๋กœ ๋ฐœ์ƒํ•œ๋‹ค.
    • MySQL์—์„œ order by null์„ ์‚ฌ์šฉํ•˜๋ฉด ์ œ๊ฑฐ ๊ฐ€๋Šฅํ•˜๋‹ค.
    • Querydsl์—์„œ order by null ๋ฌธ๋ฒ•์„ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์กฐ๊ฑด ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•ด์„œ ์ ์šฉํ•œ๋‹ค.
    • ์ •๋ ฌ์ด ํ•„์š”ํ•ด๋„ ์กฐํšŒ ๊ฒฐ๊ณผ๊ฐ€ 100๊ฑด ์ดํ•˜๋ผ๋ฉด, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ •๋ ฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ๋‹จ, ํŽ˜์ด์ง•์ผ ๊ฒฝ์šฐ order by null์„ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•œ๋‹ค.
  • ์ปค๋ฒ„๋ง ์ธ๋ฑ์Šค
    • ์ฟผ๋ฆฌ๋ฅผ ์ถฉ์ ์‹œํ‚ค๋Š”๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ์ปฌ๋Ÿผ์„ ๊ฐ–๊ณ  ์žˆ๋Š” ์ธ๋ฑ์Šค
    • select/where/order by/group by ๋“ฑ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ์ปฌ๋Ÿผ์— ์ธ๋ฑ์Šค์— ํฌํ•จ๋œ ์ƒํƒœ
    • JPQL์€ from์ ˆ์˜ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • Cluster Key(PK)๋ฅผ ์ปค๋ฒ„๋ง ์ธ๋ฑ์Šค๋กœ ๋น ๋ฅด๊ฒŒ ์กฐํšŒ ํ›„, ์กฐํšŒ๋œ Key๋กœ SELECT ์ปฌ๋Ÿผ๋“ค์„ ํ›„์† ์กฐํšŒํ•œ๋‹ค.
    • ๋‘ ๋ฒˆ์˜ ๋„คํŠธ์›Œํฌ ์ฐจ์ด๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋น„์Šทํ•œ ์„ฑ๋Šฅ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

์„ฑ๋Šฅ๊ฐœ์„  - Update/Insert

  • ์ผ๊ด„ Update ์ตœ์ ํ™”
    • ๋ฌด๋ถ„๋ณ„ํ•œ DirtyChecking์„ ๊ผญ ํ™•์ธํ•ด๋ด์•ผ ํ•œ๋‹ค.
    • 1๋งŒ๊ฑด ๋‹จ์ผ ์ปฌ๋Ÿผ ๊ธฐ์ค€ ์•ฝ 2000๋ฐฐ๋‚˜ ์ฐจ์ด๋‚œ๋‹ค.
    • ์ผ๊ด„ Update๊ฐ€ ํ•ญ์ƒ ์ข‹์€ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ํ•˜์ด๋ฒ„๋„ค์ดํŠธ ์บ์‹œ๋Š” ์ผ๊ด„ ์—…๋ฐ์ดํŠธ์‹œ ์บ์‹œ ๊ฐฑ์‹ ์ด ์•ˆ๋˜๊ณ  ์—…๋ฐ์ดํŠธ ๋Œ€์ƒ๋“ค์— ๋Œ€ํ•œ Cache Eviction์ด ํ•„์š”ํ•˜๋‹ค.
    • DirtyChecking์€ ์‹ค์‹œ๊ฐ„ ๋น„์ฆˆ๋‹ˆ์Šค ์ฒ˜๋ฆฌ ๋ฐ ์‹ค์‹œ๊ฐ„ ๋‹จ๊ฑด ์ฒ˜๋ฆฌ์‹œ ์ ํ•ฉํ•˜๋‹ค.
    • Querydsl.update๋Š” ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ผ๊ด„๋กœ Update ์ฒ˜๋ฆฌ์‹œ ์ ํ•ฉํ•˜๋‹ค.
  • ์ง„์งœ Entity๊ฐ€ ํ•„์š”ํ•œ๊ฒŒ ์•„๋‹ˆ๋ผ๋ฉด Querydsl๊ณผ Dto๋ฅผ ํ†ตํ•ด ๊ผญ ํ•„์š”ํ•œ ํ•ญ๋ชฉ๋“ค๋งŒ ์กฐํšŒํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•œ๋‹ค.
  • JPA๋กœ Bulk Insert๋Š” ์ž์ œํ•œ๋‹ค.
    • JdbcTemplate๋กœ Bulk Insert๋Š” ์ฒ˜๋ฆฌ๋˜๋Š”๋ฐ ์ปดํŒŒ์ผ์ฒดํฌ, ์ฝ”๋“œ-ํ…Œ์ด๋ธ” ๋ถˆ์ผ์น˜ ์ฒดํฌ ๋“ฑ Type Safe ๊ฐœ๋ฐœ์ด ์–ด๋ ต๋‹ค.
    • Type Safaํ•œ Bulk Insert๋ฅผ ํ•  ์ˆ˜ ์—†์„๊นŒ?
      • Querydsl != Querydsl-jpa
      • JdbcTemplate๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , Querydsl-SQL์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€ ์•Š๋‚˜?
      • ๋กœ์ปฌ PC์— DB๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‹คํ–‰ ํ›„, ๋กœ์ปฌ DB ์ •๋ณด๋ฅผ ๋“ฑ๋กํ•ด์„œ flyway๋กœ ํ…Œ์ด๋ธ” ์ƒ์„ฑ ํ›„ Querydsl-SQL ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ํ…Œ์ด๋ธ” Scanํ•œ๋‹ค๋ฉด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋ฒˆ๊ฑฐ๋กญ๋‹ค.. -> EntityQL๋กœ ๊ฐ€๋Šฅ? -> ๋‹จ์ ์ด ๋ช…ํ™•ํ•ด์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์žˆ๋‹ค.

๋งˆ๋ฌด๋ฆฌ

  • ์ƒํ™ฉ์— ๋”ฐ๋ผ ORM / ์ „ํ†ต์  Query ๋ฐฉ์‹์„ ๊ณจ๋ผ ์‚ฌ์šฉํ•  ๊ฒƒ
  • JPA / Querydsl๋กœ ๋ฐœ์ƒํ•˜๋Š” ์ฟผ๋ฆฌ ํ•œ๋ฒˆ ๋” ํ™•์ธํ•˜๊ธฐ
  • ์‹ ์ž… ๊ฐœ๋ฐœ์ž์—๊ฒŒ JPA ์ฑ…์ด๋‚˜, RealMySQL ์ฑ…์„ ๊ถŒํ•˜๊ณ  ์žˆ๋‹ค.