2021-02-26(Fri)

ํ•ญ๋ชฉ

๋‚ด์šฉ

ํ•™์Šต ๋‚ ์งœ

2021-02-26(๊ธˆ)

ํ•™์Šต ์‹œ๊ฐ„

11:00~24:00

ํ•™์Šต ๋ฒ”์œ„ ๋ฐ ์ฃผ์ œ

ActiveJob

ํ•™์Šต ๋ชฉํ‘œ

Tournament ํŽ˜์ด์ง€ ๋ฐฑ์—”๋“œ๋ฅผ ์™„์„ฑํ•œ๋‹ค.

๋™๋ฃŒ ํ•™์Šต ๋ฐฉ๋ฒ•

eunhkim๋‹˜๊ณผ ํ•™์Šต์„ ์ง„ํ–‰ํ•จ

์ƒ์„ธ ํ•™์Šต ๋‚ด์šฉ

์•กํ‹ฐ๋ธŒ ์žก Background job์„ ์‚ฌ์šฉํ•  ๋•Œ Sidekiq Gem์„ ์“ฐ๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ–ˆ์œผ๋‚˜ ์ด๋Š” Redis-server์— ์˜์กดํ•˜๋Š” ๋ฐฉ์‹์ด์–ด์„œ ์•„์‰ฝ์ง€๋งŒ ์ ์šฉํ•˜์ง€ ๋ชปํ–ˆ๋‹ค. subject์—์„œ๋Š” psql๋งŒ ์จ์•ผํ•œ๋‹ค๊ณ  ์ œ์•ฝ์„ ๊ฑธ์–ด๋†จ๊ธฐ ๋•Œ๋ฌธ์—.. ํ  Redis๋Š” ๋”ฐ๋กœ ์จ๋ด์•ผ๊ฒ ๋‹ค.

์ฐธ๊ณ 

CQRS(Command and Query Responsibility Segregation)..

..๋Š” ๋ช…๋ น๊ณผ ์กฐํšŒ์˜ ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿผ ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ๋ช…๋ น๊ณผ ์กฐํšŒ๋Š” ๋ฌด์—‡์ผ๊นŒ?

  • ๋ช…๋ น์€ ์‹œ์Šคํ…œ์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ž‘์—…์„ ์˜๋ฏธํ•œ๋‹ค.

  • ์กฐํšŒ๋Š” ์‹œ์Šคํ…œ์˜ ์ƒํƒœ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ž‘์—…์„ ์˜๋ฏธํ•œ๋‹ค.

์‚ฌ์‹ค ์ด ๊ฒƒ์ด ์ „๋ถ€์ด๋‹ค. ์ด ๋‹จ์ˆœํ•œ ๊ทœ์น™์ด ๋ช‡ ๊ฐ€์ง€ ์‘์š”๊ธฐ์ˆ ๊ณผ ์กฐํ•ฉ๋˜์–ด ์‹œ์Šคํ…œ์— ์ ์šฉ๋˜๋ฉด์„œ ๋‹ค์–‘ํ•˜๊ฒŒ ๊ตฌํ˜„๋œ๋‹ค.

CQRS๋Š” ์™œ ์“ธ๊นŒ? ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ์™€ ์กฐํšŒํ•  ๋•Œ ๋‹จ์ผ ๋„๋ฉ”์ธ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜๋Š” ์•„๋ž˜ ๋ฌธ์ œ๋“ค์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค.

  • ORM์€ ๋„๋ฉ”์ธ์˜ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์ ํ•ฉํ•˜์ง€๋งŒ, ์—ฌ๋Ÿฌ ์ง‘๊ณ„(๋ณต์žกํ•œ ์กฐํšŒ)์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ–์™€ ์ถœ๋ ฅํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋‹ค๋ณด๋ฉด ๋„๋ฉ”์ธ ๋ณต์žก๋„๊ฐ€ ๋†’์•„์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๋Ÿฌ ๋„๋ฉ”์ธ์ด ์กฐ์ธ์ด ๊ฑธ๋ ค์žˆ๊ณ  ๋‹ค์ˆ˜์˜ ์กฐ์ธ ์ฟผ๋ฆฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๊ทธ๋งŒํผ DB์— ๋ถ€ํ•˜๋Š” ์ปค์ง€๊ฒŒ ๋˜๋ฉฐ, ๋„๋ฉ”์ธ ๊ฐ์ฒด์˜ ๋””์ž์ธ ์ž์ฒด๋„ ์ ์  ๋ณต์žกํ•ด์ง„๋‹ค.

์ฆ‰, ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ธฐ๋Šฅ๊ณผ ์ƒํƒœ ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋ถ„๋ฆฌํ•˜์—ฌ ๋„๋ฉ”์ธ์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๋„๋ฉ”์ธ ๋ชจ๋ธ ๊ด€์ ์—์„œ ์ƒํƒœ ๋ณ€๊ฒฝ ๊ธฐ๋Šฅ์€ ์ฃผ๋กœ ํ•œ ์ง‘๊ณ„์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค.

  • ์ฃผ๋ฌธ ์ทจ์†Œ ๊ธฐ๋Šฅ๊ณผ ๋ฐฐ์†ก์ง€ ์ •๋ณด ๋ณ€๊ฒฝ ๊ธฐ๋Šฅ์€ ํ•œ ๊ฐœ์˜ Order ์ง‘๊ณ„์—์„œ ์ง„ํ–‰ํ•œ๋‹ค.

์กฐํšŒ ๊ธฐ๋Šฅ์€ ํ•˜๋‚˜์˜ ์ง‘๊ณ„๋กœ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‘ ๊ฐœ ์ด์ƒ์˜ ์ง‘๊ณ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋‹จ์ผ ๋ชจ๋ธ๋กœ ๋‘ ์ข…๋ฅ˜์˜ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋ฉด ๋ชจ๋ธ์ด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ณต์žกํ•ด์ง„๋‹ค.

์ฐธ๊ณ 

์ฐธ๊ณ 2

์•„๋ž˜ ๋‚ด์šฉ์ฒ˜๋Ÿผ PR์„ ์ž‘์„ฑํ•˜์˜€๋‹ค.

์ž‘์—…๋‚ด์šฉ or ์ด์Šˆ๋งํฌ

ํ† ๋„ˆ๋จผํŠธ ์ธ๋ฑ์Šค ํŽ˜์ด์ง€๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • My tournament ํŽ˜์ด์ง€์—๋Š” ํ˜„์žฌ ์ฐธ์—ฌํ•œ ํ† ๋„ˆ๋จผํŠธ์˜ 'next_match' ์ •๋ณด๊ฐ€ ์นด๋“œํ˜•ํƒœ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

  • ๋งŒ์•ฝ ์•„์ง ํ† ๋„ˆ๋จผํŠธ ๋งค์น˜ ์ƒ๋Œ€๊ฐ€ ์ •ํ•ด์ง€์ง€ ์•Š์€ ์ƒํƒœ๋ผ๋ฉด, default_dummy ์ •๋ณด๊ฐ€ next_match ์นด๋“œ์— ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

  • ํ† ๋„ˆ๋จผํŠธ ๋งค์น˜ ์ตœ์ดˆ์‹œ์ž‘์ผ ์ดํ›„์—๋Š” ๋งค์ผ ์ž์ •์— ํ† ๋„ˆ๋จผํŠธ ๋งค์น˜๊ฐ€ ์ƒ์„ฑ๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ์ด ๋•Œ round๋Š” ํ˜„์žฌ ํ† ๋„ˆ๋จผํŠธ์— ์ฐธ์—ฌ ์ค‘์ธ ์œ ์ € ์ˆ˜์— ๋”ฐ๋ผ ์…‹ํŒ…๋ฉ๋‹ˆ๋‹ค.

    • ex) 16๊ฐ•์— ์ฐธ์—ฌํ•œ iwoo๊ฐ€ ๋ถ€์ „์Šนํ–ˆ์„ ๋•Œ next_match ์ •๋ณด์—๋Š” ๊ฒฝ๊ธฐ์˜ˆ์ •์ผ์€ ๋‹ค์Œ๋‚ (8๊ฐ• ์˜ˆ์ •์ผ)์ด ์…‹ํŒ…๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ 16๊ฐ•์— ์ฐธ์—ฌํ•œ ์‚ฌ๋žŒ 16๋ช… ์ค‘ iwoo ์ œ์™ธํ•œ 2๋ช…๋งŒ ๋‚จ์•˜๋‹ค๋ฉด, 8๊ฐ• ์˜ˆ์ •์ผ 00์‹œ์— ํ˜„์žฌ ํ† ๋„ˆ๋จผํŠธ์— ์ฐธ์—ฌ ์ค‘์ธ 3๋ช… ๊ธฐ์ค€์œผ๋กœ 4๊ฐ•์ด round๋กœ ์…‹ํŒ…๋ฉ๋‹ˆ๋‹ค.

    • ex) 16๊ฐ•์— ์ฐธ์—ฌํ•œ iwoo๊ฐ€ ๋ถ€์ „์Šนํ–ˆ์„ ๋•Œ next_match ์ •๋ณด์—๋Š” ๊ฒฝ๊ธฐ์˜ˆ์ •์ผ์€ ๋‹ค์Œ๋‚ (8๊ฐ• ์˜ˆ์ •์ผ)์ด ์…‹ํŒ…๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ 16๊ฐ•์— ์ฐธ์—ฌํ•œ ์‚ฌ๋žŒ 16๋ช… ์ค‘ iwoo ์ œ์™ธํ•œ ๋ชจ๋‘๊ฐ€ ํ† ๋„ˆ๋จผํŠธ ๋งค์น˜์— ์ฐธ์—ฌํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด, 8๊ฐ• ์˜ˆ์ •์ผ 00์‹œ์— ํ˜„์žฌ ํ† ๋„ˆ๋จผํŠธ์— ์ฐธ์—ฌ ์ค‘์ธ 1๋ช… ๊ธฐ์ค€์œผ๋กœ ์šฐ์Šน์ž๊ฐ€ ๊ฒฐ์ •๋˜๋ฉฐ My tournament ํŽ˜์ด์ง€์—์„œ ์นด๋“œ๊ฐ€ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. ์šฐ์Šน์—ฌ๋ถ€๋Š” user_profile์— ์…‹ํŒ…๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

์ฐธ๊ณ : PR๋‹จ์œ„๊ฐ€ ๋ณ€๊ฒฝ๋จ์— ๋”ฐ๋ผ ๋ Œ๋”๋ง๊นŒ์ง€๋งŒ ๊ตฌํ˜„๋œ ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ์ด์–ด์„œ ๊ฐ ๋ฒ„ํŠผ ๋ณ„ '์ด๋ฒคํŠธ' ํ•ธ๋“ค๋ง์€ ์ถ”๊ฐ€ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

ํ† ๋„ˆ๋จผํŠธ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ

ํ† ๋„ˆ๋จผํŠธ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ

๊ตฌํ˜„๋ฐฉ๋ฒ•

ํ† ๋„ˆ๋จผํŠธ ์ธ๋ฑ์Šค

ํ† ๋„ˆ๋จผํŠธ ์ธ๋ฑ์Šค์—์„œ ์š”์ฒญํ•˜๋ฉด ์•„๋ž˜ ๋‘ ์กฐ๊ฑด์˜ ํ† ๋„ˆ๋จผํŠธ๋“ค์ด ์‘๋‹ต๋ฉ๋‹ˆ๋‹ค.

  1. ์ง„ํ–‰ ์ค‘์ธ ํ† ๋„ˆ๋จผํŠธ (completed, canceled ์ƒํƒœ๊ฐ€ ์•„๋‹Œ ํ† ๋„ˆ๋จผํŠธ)

  2. ๋‚ด๊ฐ€ ์ด๋ฏธ ํƒˆ๋ฝํ•œ ํ† ๋„ˆ๋จผํŠธ (tournament_membership์ด completed ์ƒํƒœ๊ฐ€ ์•„๋‹Œ ํ† ๋„ˆ๋จผํŠธ) ์ด ๋•Œ current_user_next_match ๊ฐ’์ด null์ด๋ฉด My Tournament์—, Opened Tournament์— ๋ Œ๋”๋ง๋˜๋Š” ๋ฐ์ดํ„ฐ๋กœ ์“ฐ์ž…๋‹ˆ๋‹ค.

ํ† ๋„ˆ๋จผํŠธ round ๊ณ„์‚ฐ

next_match_of ๋ฉ”์„œ๋“œ๋กœ ๋‹ค์Œ match๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋ฉ”์„œ๋“œ ์‹คํ–‰ ์‹œ์ ์— ์ƒ์„ฑ๋˜์–ด์žˆ๋Š” match๊ฐ€ ์—†๋‹ค๋ฉด, ๋ถ€์ „์Šน์ด๋ผ ํŒ๋‹จ๋ฉ๋‹ˆ๋‹ค.

ํŠน์ด์‚ฌํ•ญ

DB์— ์ €์žฅํ•˜๋Š” datetime์— ๋Œ€ํ•ด์„œ

  1. ํŽธ์˜๋ฅผ ์œ„ํ•ด applicatoin.rb์—์„œ time_zone์„ Seoul ๊ธฐ์ค€์œผ๋กœ ์…‹ํŒ…ํ•ด๋’€์Šต๋‹ˆ๋‹ค. ๋•๋ถ„์— DB์—๋„ KST๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํด๋ผ์ด์–ธํŠธ์— ๋ณด๋‚ด๋Š” datetime ๊ฐ’๊ณผ ๋ฐ›๋Š” datetime ๊ฐ’ ๋ชจ๋‘ KST๋กœ ํ†ต์ผํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๊ณ , ๊ทธ๋ฆฌ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. war ๋งŒ๋“œ์‹ค ๋•Œ๋„ ์‹œ๊ฐ„ ๊ฐ’์€ KST๋กœ ํ†ต์ผํ•˜๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

  2. ํ˜„์žฌ Tournament์˜ registered_user_count์— ์ œ๋Œ€๋กœ ๊ฐ’์ด ๊ธฐ์ž…๋˜๊ณ  ์žˆ์ง€ ์•Š๊ณ , ๋”ฐ๋ผ์„œ ํ† ๋„ˆ๋จผํŠธ ์นด๋“œ๋ทฐ์—๋„ 0๋ช…์œผ๋กœ ๊ธฐ์žฌ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค์Œ PR์—์„œ ์•„๋ž˜ ๋‚ด์šฉ์— ๋”ฐ๋ผ fix๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”!

    • registered_user_count column ์‚ญ์ œ

    • index ์‘๋‹ต ๊ฐ’์— registered_user_count ํ‚ค์˜ ๋ฐธ๋ฅ˜๋ฅผ ์š”์ฒญ๋  ๋•Œ๋งˆ๋‹ค ๊ณ„์‚ฐํ•ด์„œ ๋„˜๊ฒจ์ค๋‹ˆ๋‹ค.

ํ•™์Šต ๋‚ด์šฉ์— ๋Œ€ํ•œ ๊ฐœ์ธ์ ์ธ ์ดํ‰

Redis๋ฅผ ์ œ๋Œ€๋กœ ํ•™์Šตํ•˜์ง€ ๋ชปํ•œ ๊ฒƒ์ด ์•„์‰ฝ๋‹ค. ์ฃผ๋ง์—๋Š” ๊ผญ ์‹œ๊ฐ„๋‚ด์„œ ํ…Œ์ŠคํŠธ ๊ด€๋ จํ•ด์„œ๋„ ํŒŒ๋ด์•ผ๊ฒ ๋‹ค.

๋‹ค์Œ ํ•™์Šต ๊ณ„ํš

  • Rails test

Last updated