2021-07-14(Wed)

Facts (์‚ฌ์‹ค, ๊ฐ๊ด€)

  • ๊ฐ์‚ฌ์ผ๊ธฐ๋ฅผ 8์ผ์งธ ์ ๋Š” ๊ฒƒ์„ ์„ฑ๊ณตํ–ˆ๋‹ค.

  • ๋ฃจํ‹ด์— ๋„ฃ์„ ํ™œ๋™์„ ์ •๋ฆฌํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.

  • ๋žœ๋”ฉ๊ณผ์ œ ํ”ผ๋“œ๋ฐฑ์— ๋‹ตํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ๊ฐœ์„ ํ–ˆ๋‹ค.

  • Table lock์— ๋Œ€ํ•ด์„œ ์กฐ์‚ฌ๋ฅผ ์ง„ํ–‰ํ–ˆ๋‹ค.

Feelings (๋Š๋‚Œ, ์ฃผ๊ด€)

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

๋‹ค๋“ค ๋ฐ”์˜๋‹ค๋ณด๋‹ˆ ๋žœ๋”ฉ ๊ณผ์ œ ํ”ผ๋“œ๋ฐฑ์€ ์žฌ์›๋‹˜๋งŒ ์ง„ํ–‰ํ•ด์ฃผ์…จ๋‹ค. ๊ดœ์ฐฎ๋‹ค, ์งˆ ์ข‹์€ ํ”ผ๋“œ๋ฐฑ๊ณผ ํ‚ค์›Œ๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋‚˜๋Š” ์ž˜ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ์ž˜ํ•ด์™”๊ณ , ์•ž์œผ๋กœ๋„ ์ž˜ํ•ด๋ด์•ผ๊ฒ ๋‹ค.

์†”์งํžˆ ๋ฃจ๋น„์Šคํƒ€์ผ ๊ฐ€์ด๋“œ์˜ negative conditions ๊ฒ€์‚ฌ๋ฅผ ์ง€์–‘ํ•˜๋ผ๋Š” ๊ฒƒ์€ ์•„๋ž˜ 1,2,3๋ฒˆ ์ผ€์ด์Šค ์ค‘ 3๋ฒˆ ์ผ€์ด์Šค๋ฅผ ์„ ํƒํ•˜๋ผ๋Š” ๊ฒƒ์œผ๋กœ ์ดํ•ดํ–ˆ์—ˆ๊ธด ํ•œ๋ฐ, ํŒ€ ์ปจ๋ฒค์…˜์„ ๋”ฐ๋ผ๊ฐ€์ž :)

action if !obj.nil? # 1๋ฒˆ ์ผ€์ด์Šค
action if not obj.nil? # 2๋ฒˆ ์ผ€์ด์Šค
action unless obj.nil? # 3๋ฒˆ ์ผ€์ด์Šค

๋™์‹œ์„ฑ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•œ ์œ ํ‹ธ ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์•˜๋Š”๋ฐ, ๋‚˜๋ฆ„ ์ž˜ ๋งŒ๋“  ๊ฒƒ ๊ฐ™์•„์„œ ๊ธฐ๋ถ„์ข‹์•˜๋‹ค. Proc & yield ํ™œ์šฉ๋ฒ•์„ ๋งŒ์กฑ์Šค๋Ÿฝ๊ฒŒ ์ตํžŒ ๊ฒƒ ๊ฐ™์•„์„œ ๋ฟŒ๋“ฏํ•˜๋‹ค.

Findings (๋ฐฐ์šด ์ )

DB, ruby์™€ rails๋ฅผ ํŒŒ๋ณด๋Š” ํ•˜๋ฃจ์˜€๋‹ค.

DB

  • SQL column์„ ์ƒ์„ฑํ•  ๋•Œ, limit ๊ตฌ๋ฌธ์„ ํ™œ์šฉํ•ด์„œ bytes๊นŒ์ง€ ์‹ ๊ฒฝ์จ์„œ ๋งŒ๋“ค์–ด์•ผํ•˜๋Š” ๊ฒƒ์„ ์ƒˆ์‚ผ ๊นจ๋‹ฌ์•˜๋‹ค.

  • InnoDB์˜ Snapshot์— ๋Œ€ํ•ด ํ•™์Šตํ–ˆ๋‹ค.

  • Non repetable read ์™€ Phantom read ์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•ด ํ•™์Šตํ–ˆ๋‹ค.

    • ํ›„์ž๋Š” ์ „์ž์™€ ๋‹ฌ๋ฆฌ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์ˆ˜์ •์ด ๋ถˆ๊ฐ€ํ•˜์ง€๋งŒ, ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ์ƒ์„ฑ์€ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์—์„œ ๋ฐœ์ƒํ•œ๋‹ค.

  • MySQL์—์„œ๋Š” REPEATABLE READ์™€ READ COMMITTED ๋ ˆ๋ฒจ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์—์„œ SELECT ์ฟผ๋ฆฌ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ฌ ๋•Œ, ํ…Œ์ด๋ธ”์— lock์„ ๊ฑธ์ง€ ์•Š๊ณ , ํŠธ๋žœ์žญ์…˜ ์ตœ์ดˆ์— snapshot์„ ๊ตฌ์ถ•ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

    • ๋•Œ๋ฌธ์— REPEATABLE READ์—์„œ phantom read๋„ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

  • WHERE 1=1 ๊ตฌ๋ฌธ์„ ์™œ ์“ฐ๋Š”์ง€ ํ™•์ธํ•˜์˜€๋‹ค.

    • ๋””๋ฒ„๊น…์ด ์‰ฝ๋‹ค.

    • ๋™์  ์ฟผ๋ฆฌ ๋“ฑ ์กฐ๊ฑด์„ ๊ฒ€์‚ฌํ•˜๋ฉฐ ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ ค์•ผํ•  ๋•Œ ๊ตฌ๋ฌธ์„ ๋ง๋ถ™์ด๊ธฐ ์‰ฝ๋‹ค.

Ruby์™€ Rails

  • ActiveRecord์˜ ๋ฉค๋ฒ„๋ณ€์ˆ˜์— ๊ฐ’์„ ๋Œ€์ž…ํ•  ๋•Œ, self๋ฅผ ๋ถ™์—ฌ์•ผํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜์˜€๋‹ค.

    • ๊ฒฐ๊ตญ =๊ณผ ํ•จ๊ป˜ ์“ธ ๋•Œ๋Š” self๋ฅผ ๋ถ™์—ฌ์•ผํ•œ๋‹ค. = ์—ฐ์‚ฐ์ž๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•œ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ๊ณผ ์ง€์—ญ๋ณ€์ˆ˜ ํ• ๋‹น ๊ฐ„์— ๊ตฌ๋ณ„์ด ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ.

  • ๋™์‹œ์„ฑ ํ…Œ์ŠคํŠธ์‹œ ์“ธ๋งŒํ•œ ์œ ํ‹ธ ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์ตํ˜”๋‹ค.

    • Proc & yield๋ฅผ ์‘์šฉํ•˜์—ฌ, ์›ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์›ํ•˜๋Š” ๊ฐฏ์ˆ˜์˜ ์“ฐ๋ ˆ๋“œ์—์„œ ์›ํ•˜๋Š” ํšŸ์ˆ˜๋งŒํผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์œ ํ‹ธ ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

Affimation (์ž๊ธฐ ์„ ์–ธ)

  • ๋‚˜๋Š” ๋ฌด์ง€๋ฅผ ์ธ์ง€ํ•˜์—ฌ ์ ๊ทน์ ์œผ๋กœ ๋“œ๋Ÿฌ๋‚ด๊ณ ,

  • ๋ฌด์ง€๋ฅผ ์•„๋Š” ์˜์—ญ์œผ๋กœ ๋ฐ”๊พธ์–ด๋‚ด๋ฉฐ,

  • ๊ฒฐ๊ตญ์—” ์„ฑ์žฅํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋‹ค.

Last updated