Skip to content

๐Ÿ› ๏ธ [refactor] ๊ฐ•์˜ ์˜คํ”ˆ์‹œ ์ˆ˜๊ฐ•์ƒ ์ •๋ณด Redis์— ์บ์‹ฑํ•˜๊ธฐย #62

@binary-ho

Description

@binary-ho

๐Ÿ› ๏ธ ๋ฆฌํŒฉํ† ๋ง์ด ํ•„์š”ํ•œ ๋ถ€๋ถ„

ํ•™์ƒ์ด ์ถœ์„ ์‹œ๋„์‹œ, ์ˆ˜๊ฐ• ์‹ ์ฒญ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์œผ๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š”๋ฐ์— ์—„์ฒญ๋‚œ ์‹œ๊ฐ„์ด ์†Œ์š”๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ๋‹ค,
(1000๊ฑด ๋™์‹œ์š”์ฒญ์‹œ 10๋งŒ๊ฑด์—์„  ์•„์˜ˆ 600๊ฑด ์ด์ƒ ํƒ€์ž„์•„์›ƒ)
๊ทธ๋ž˜์„œ ์ธ๋ฑ์‹ฑ์„ ํ†ตํ•ด ํ•ด๊ฒฐ์„ ์‹œ๋„ํ•˜๋‹ˆ ์•ฝ 6.5์ดˆ๋งŒ์— ์ „๋ถ€ ์„ฑ๊ณตํ–ˆ๋‹ค -> #57

๊ทธ๋Ÿฌ๋‚˜, 6.5์ดˆ๋„ ์—ฌ์ „ํžˆ ์œ ์ € ์ž…์žฅ์—์„  ์—ฌ์ „ํžˆ ๋А๋ฆฌ๋‹ค๊ณ  ์ƒ๊ฐ๋˜์–ด, ๊ฐ•์˜๋ฅผ ์—ด ๋•Œ ์ˆ˜๊ฐ•์ƒ ์ •๋ณด๋ฅผ ์บ์‹ฑ์„ ํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.

๊ณ„ํš

1. ์บ์‹ฑ ๋Œ€์ƒ

  1. ์—ด๋ฆฐ ๊ฐ•์˜ ์ •๋ณด (hash ์ด์šฉํ•ด ๊ฐ•์˜ id๋ฅผ key๋กœ, ๊ฐ•์˜ ์ •๋ณด๋“ค์„ field์™€ value๋กœ ์ €์žฅ)
  2. ์ˆ˜๊ฐ•์ƒ์ด ์ถœ์„ ๊ฐ€๋Šฅํ•œ ๊ฐ•์˜ ๋ชฉ๋ก (key : ํ•™์ƒ id, value : ์—ด๋ฆฐ ๊ฐ•์˜ id ๋ชฉ๋ก set)

2. ๊ฐœ์„ ๋œ ์ถœ์„ ๊ณผ์ •

  1. ์ˆ˜๊ฐ•์ƒ๋“ค์€ ์ž์‹ ์ด ์Šน์ธ๋œ ๊ฐ•์˜ ์ค‘, ์ถœ์„ ๊ฐ€๋Šฅํ•œ ๊ฐ•์˜๊ฐ€ ์žˆ๋Š”์ง€ ์บ์‹œ ๋จผ์ € ํ™•์ธํ•œ๋‹ค.
  2. ์žˆ๋Š” ๊ฒฝ์šฐ ์บ์‹ฑ๋œ ์—ด๋ฆฐ ๊ฐ•์˜ ์ •๋ณด์—์„œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
  3. ์—†๋Š” ๊ฒฝ์šฐ DB์—์„œ ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
  4. ์ถœ์„์ด ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์—์„œ ์ƒˆ๋กœ ์ˆ˜๊ฐ• ์Šน์ธ๋˜๋Š” ํ•™์ƒ์˜ ๊ฒฝ์šฐ ์Šน์ธ ์ดํ›„ ๋ฐ”๋กœ ์บ์‹ฑ๋œ๋‹ค.

3. ์ˆ˜์—… ์ •๋ณด๋Š” ๊ฐ™์€ ํŠธ๋žœ์žญ์…˜, ํ•™์ƒ ์ •๋ณด๋Š” ๋น„๋™๊ธฐ ์ž์‹ ํŠธ๋žœ์žญ์…˜ (+Event๋ฅผ ํ†ตํ•œ ๊ตฌํ˜„)

์„ค๊ณ„ ๊ณผ์ •์—์„œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ๊ณ ๋ฏผํ–ˆ๋Š”๋ฐ, ๊ฒฐ๊ตญ ๊ตฌํ˜„์ค‘ Event๋ฅผ ๋ฐœํ–‰ํ•ด์„œ ์บ์‹ฑ์„ ๋”ฐ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

  1. ๊ฐ•์‚ฌ๊ฐ€ ์ˆ˜์—…์„ ์—ด ๋•Œ ๊ธฐ๋Œ€ํ•œ ํ–‰์œ„์™€ ์‘๋‹ต์€ "์ˆ˜์—…์„ ์—ฌ๋Š” ํ–‰์œ„" ์ž์ฒด์— ๋Œ€ํ•œ ๊ฒƒ์ด์—ฌํ•œ๋‹ค.
    "์—ด๋ฆฐ ์ˆ˜์—…", "์ˆ˜๊ฐ•์ƒ"์„ ์ €์žฅํ•˜๋Š” ์ž‘์—…์€ ์ˆ˜์—…์„ ์—ฌ๋Š” ํ–‰์œ„๋ฅผ ์š”์ฒญํ•˜๋Š” ๊ฐ•์‚ฌ ์ชฝ์—์„  ๊ด€์‹ฌ์‚ฌ๊ฐ€ ์•„๋‹ˆ๋‹ค.
  2. ๋”ฐ๋ผ์„œ, "์ˆ˜์—…์„ ์—ฌ๋Š” ํ–‰์œ„"์™€๋Š” ๋”ฐ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ , ์ˆ˜์—…์ด ์—ด๋ฆฌ๋ฉด ๋น ๋ฅด๊ฒŒ ๊ทธ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•ด ์ฃผ๊ณ  ์‹ถ๋‹ค.
  3. ์•„์˜ˆ ๋ณ„๊ฐœ์˜ ํŠธ๋žœ์žญ์…˜์„ ์ด์šฉํ•ด ์บ์‹ฑ ์ž์ฒด๊ฐ€ ์‹คํŒจํ•˜๋”๋ผ๋„ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์•˜์œผ๋ฉด ์ข‹๊ฒ ๋‹ค.
  4. ํ•˜์ง€๋งŒ, "์ˆ˜์—…์„ ์—ฌ๋Š” ํ–‰์œ„"์˜ ํŠธ๋žœ์žญ์…˜์ด ์‹คํŒจํ•œ๋‹ค๋ฉด ์บ์‹ฑ์€ ์ง„ํ–‰๋˜์ง€ ์•Š์•˜์œผ๋ฉด ์ข‹๊ฒ ๋‹ค.

์ด ์กฐ๊ฑด์„ ๋ชจ๋‘ ๋งŒ์กฑ์‹œํ‚ค๋Š” ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ด Event๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐ๋˜์—ˆ๋‹ค.

์ฒ˜์Œ์—” Event๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋‹จ์ˆœ ์„œ๋น„์Šค๋กœ ๊ตฌํ˜„ํ–ˆ๊ณ , @Async ์™€ @Transactional(propagation = NESTED๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„ ์ค„ ์•Œ์•˜๋‹ค.

ํ•˜์ง€๋งŒ, ํ…Œ์ŠคํŠธ ํ•ด๋ณธ ๊ฒฐ๊ณผ ์˜ˆ์ƒ๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ๋ถ€๋ชจ ํŠธ๋žœ์žญ์…˜์ด ์‹คํŒจํ•ด๋„ ์ž์‹ ํŠธ๋žœ์žญ์…˜์ด ์‹คํŒจํ•˜์ง€ ์•Š์•˜๋‹ค.

์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด TransactionalListner์˜ Phase ์„ค์ •์„ After Commit์œผ๋กœ ๋‘๋ฉด์„œ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ปค๋ฐ‹์‹œ์—๋งŒ ์ €์žฅ๋˜๋ฉด์„œ๋„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ž‘๋™ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

์ข…ํ•ฉํ•˜๋ฉด ๋‚ด ๋ชฉํ‘œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ด๋ฃฐ ์ˆ˜ ์žˆ๋‹ค.

  1. @Async๋ฅผ ํ†ตํ•ด ์ˆ˜์—…์„ ์—ฌ๋Š” ํ–‰์œ„์— ๋Œ€ํ•œ ์‘๋‹ต์„ ๋ฐ”๋กœ ๋Œ๋ ค์ฃผ๊ณ , ์บ์‹ฑ์€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ
  2. Transaction์˜ Require New ์˜ต์…˜์„ ํ†ตํ•ด ์บ์‹ฑ์„ ์œ„ํ•œ ์•„์˜ˆ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์„ ์ƒ์„ฑ
  3. Phase ์„ค์ •์„ ํ†ตํ•ด, "์ˆ˜์—…์„ ์—ฌ๋Š” ํ–‰์œ„"๊ฐ€ ์„ฑ๊ณตํ–ˆ์„ ๋•Œ๋งŒ ์บ์‹ฑํ•˜๋„๋ก ๊ตฌํ˜„

4. ์œ ์˜ํ•  ์ 

  1. Max Memory๋Š” 5MB๋กœ ์„ค์ •ํ•œ๋‹ค -> Memory๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•จ์œผ๋กœ ๋น„์ฆˆ๋‹ˆ์Šค๋ฅผ ์ƒ๊ฐํ•˜๋ฉด 5MB๋Š” ๋‹ฟ์„ ์ˆ˜ ์—†์„ ๋งŒํผ ํฌ๋‹ค. ํ•™์ƒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์ˆ˜์ ์œผ๋กœ set์œผ๋กœ ์ €์žฅํ•˜๋Š” ๊ฒฝ์šฐ ์•ฝ 200 ์ดˆ๋ฐ˜์˜ ๋ฐ”์ดํŠธ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
    1๋งŒ๋ช…์˜ ํ•™์ƒ์ด ์žˆ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ, 2MB๊ฐ€ ์ตœ๋Œ€์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด 1๋งŒ๋ช…์˜ ํ•™์ƒ์ด ๋™์‹œ์— ๊ฐ€์ž…ํ•œ๋‹ค๊ณ  ํ•ด๋„, ์ด๋ฉ”์ผ ๋ฐ์ดํ„ฐ๊ฐ€ 100 ์ดˆ๋ฐ˜๋Œ€์ด๋ฏ€๋กœ, 2MB์— ๋‹ฟ๊ธฐ ์–ด๋ ต๋‹ค.
    ๊ฒฐ๋ก ์ ์œผ๋กœ 5MB์˜ ๊ณต๊ฐ„์ด ์žˆ๋‹ค๋ฉด, 1๋งŒ๋ช…์˜ ํ•™์ƒ์ด ๋™์‹œ์— ๊ฐ€์ž…ํ•˜๋ฉด์„œ, ์ฆ‰์‹œ ์ˆ˜์—… ์ •๋ณด๋ฅผ ์บ์‹ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
    ํ˜„์žฌ 1000๋ช… ๋™์‹œ ์ถœ์„์ด ๋ชฉํ‘œ์ธ ์‹œ์ ์—์„œ ์•„์ฃผ ์ถฉ๋ถ„ํ•œ ๊ฐ’์ด๋‹ค. (ํ˜„์žฌ EC2 ์ŠคํŽ™์€ 1GiB)
  2. eviction ์ •์ฑ…์€ volitle ttl : ์•ฑ์—์„œ ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ์บ์‹ฑ์„ ํ•˜์ง€๋งŒ, ๊ฐ€์žฅ ํฐ ์šฉ๋Ÿ‰์„ ์ฐจ์ง€ํ•˜๋Š” ๊ฒƒ์€ ์ด ์ˆ˜๊ฐ•์ƒ ์ •๋ณด์ด๋‹ค. ๋ฌธ์ œ๋Š” ์ˆ˜๊ฐ•์ƒ ์ •๋ณด๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ ์ผ์ˆ˜๋ก ์˜คํžˆ๋ ค ์‚ฌ์šฉ ํ™•๋ฅ ์ด ๋†’๋‹ค๋Š” ์ ์ด๋‹ค ์ด๋Š” ๊ธฐ์กด์˜ ์บ์‹ฑ ์ •์ฑ…๋“ค๊ณผ ๋ฐ˜๋Œ€์ด๋‹ค
    ์™œ๋ƒํ•˜๋ฉด ํ•œ๋ฒˆ ์ถœ์„ํ•œ ํ•™์ƒ์€ ์˜คํžˆ๋ ค ๋˜ ์ถœ์„ํ•  ์ผ์ด ์—†๊ณ , ์ถœ์„ํ•˜์ง€ ์•Š์€ ํ•™์ƒ์ด ์ƒˆ๋กœ ์ถœ์„ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ธฐ ๋–„๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ ๋ ˆ๋””์Šค์— ์ด ์ƒํ™ฉ์— 100% ๋งž๋Š” ์ ์ ˆํ•œ ์ •์ฑ…์ด ์—†๋‹ค. (๋ณดํ†ต์€ ์ž์ฃผ ์“ฐ์ด๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋” ์‚ด๋ ค ๋†“๋Š”๋‹ค)
    ๊ทธ๋‚˜๋งˆ ์ ์ ˆํ•ด ๋ณด์ด๋Š” ๊ฒƒ์ด volitle-ttl์ด๋‹ค. (์ •์ฑ…์ด ์•„์˜ˆ ์—†๋Š” ๊ฒฝ์šฐ์—” ์ƒˆ๋กœ์šด ์ €์žฅ์ด ์•ˆ ๋œ๋‹ค.) ๊ทธ๋ž˜์„œ volitle-ttl์„ ์„ ํƒํ–ˆ๋‹ค.
    ๋ฌธ์ œ๋Š” ์•ฑ์—์„œ ์บ์‹ฑํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ์ค‘์— ์บ์‹ฑ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ˆ˜๊ฐ•์ƒ ๋ฐ์ดํ„ฐ๊ฐ€ ์ œ์ผ ์‚ฌ๋ผ์ ธ๋„ ๋ฌธ์ œ๊ฐ€ ์—†๋Š” ๋ฐ์ดํ„ฐ๋ž€ ๊ฒƒ์ด๊ณ , ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋“ค์€ ์‚ฌ๋ผ์ง€๋Š” ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ๋œ๋‹ค.

    ์ด์ œ๊นŒ์ง€ ์‚ฌ๋ผ์ ธ์„  ์•ˆ ๋˜๋Š” ๋ฐ์ดํ„ฐ๋“ค์€ ์ œํ•œ ์‹œ๊ฐ„์ด ์‹ค์ œ ๋น„์ฆˆ๋‹ˆ์Šค์ ์œผ๋กœ๋„ ์กด์žฌํ•˜๋Š” ๋ฐ์ดํ„ฐ๋“ค์ด์—ฌ์„œ ๋น„์ฆˆ๋‹ˆ์Šค์ ์ธ ์ œํ•œ ์‹œ๊ฐ„๊ณผ redis exprire time์„ ๋˜‘๊ฐ™์ด ๋งž์ท„๋‹ค. ์ด์  , ์ด ๋ฐ์ดํ„ฐ๋“ค์˜ exprire time์„ 2๋ฐฐ๋กœ ๋Š˜๋ฆฌ๊ณ , ๋”ฐ๋กœ ์œ ํšจ ์‹œ๊ฐ„์„ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์„ ๊ณ ๋ คํ•ด๋ดค๋‹ค.
    ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ์œ„ํ—˜์„ ๋Œ€๋น„ํ•ด ์ €์žฅ ์šฉ๋Ÿ‰์„ ๋Š˜๋ฆฌ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.
    ์ด ๋ฐฉ๋ฒ•์€ ๊ธฐ์กด์˜ ์ผ๋ฐ˜์ ์ธ ์บ์‹ฑ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์—์„  ๋น„์‹ผ ๋ฉ”๋ชจ๋ฆฌ ์ž์›์„ ๋” ์†Œ๋ชจํ•˜๋Š” ๊ฒƒ์ž„์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ๋˜๊ฒ ์ง€๋งŒ, ์šฐ๋ฆฌ ์„œ๋น„์Šค์—์„  ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์ถ”๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ฐ€ ์ ์Œ์œผ๋กœ ๊ณ ๋ คํ• ๋งŒํ•ด ๋ณด์ธ๋‹ค. ๋งŒ์•ฝ ์šฉ๋Ÿ‰์ด ๊ทธ๋ฆฌ ๋„‰๋„‰ํ•˜์ง€ ์•Š์•˜๋”๋ผ๋ฉด, ์œ ํšจ์‹œ๊ฐ„์„ ๋Œ€ํญ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฐ”๊ฟจ์„ ๊ฒƒ์ด๋‹ค. -> ๋˜๋‹ค๋ฅธ ์ด์Šˆ๊ฐ€ ํ•„์š”ํ•˜๋‹ค
  3. ๊ฐ•์˜๋ฅผ OPEN ์ค‘์— ์ƒˆ๋กœ์šด ํ•™์ƒ์ด ์Šน์ธ๋  ์ˆ˜ ์žˆ๋‹ค (์ถœ์„ ๊ฐ€๋Šฅํ•œ ํ•™์ƒ์ด ๋™์ ์œผ๋กœ ์ƒ๊ฒจ๋‚  ์ˆ˜ ์žˆ์Œ)
    -> ๊ฐ•์‚ฌ๊ฐ€ ํ•™์ƒ์„ ์Šน์ธํ–ˆ์„ ๋•Œ, ๊ฐ•์˜๊ฐ€ ์ด๋ฏธ ์—ด๋ ค์žˆ๋‹ค๋ฉด ๋ ˆ๋””์Šค์— ์บ์‹ฑํ•œ๋‹ค.
  4. redis transaction support : redis template์—์„œ ๊ด€๋ จ ์„ค์ •์„ true๋กœ ์„ค์ •ํ•ด์•ผ /@transactional ์„ ๋ถ™์ธ ๋ฉ”์„œ๋“œ์—์„œ RedisTemplate๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ์šฐ๋ฆฌ๊ฐ€ ํ‰์†Œ์— DB๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์™€ ๊ฐ™์ด ๋™์ž‘ํ•œ๋‹ค. (ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋ฌถ์ด๊ณ , ๋กค๋ฐฑ์‹œ ๋กค๋ฐฑ ๋“ฑ)

๋ฆฌํŒฉํ† ๋ง ์ž‘์—… ๋ธŒ๋žœ์น˜

feature/student-caching

โ˜‘ Refactoring TODO

  • ๋ ˆ๋””์Šค ์„ค์ • ์ ์šฉ
  • Open๋œ ๊ฐ•์˜ ์ •๋ณด์ธ OpenLecture ๊ตฌํ˜„
  • ์ถœ์„ ๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ•˜๋˜ AttendanceNumber Repository ์ œ๊ฑฐ
  • ์ˆ˜๊ฐ•์ƒ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” LectureStudentRepository ๊ตฌํ˜„
  • ์ˆ˜์—…์„ ์—ด ๋•Œ, OpenLecture ์ •๋ณด์™€ ์ˆ˜๊ฐ•์ƒ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„
  • ์ถœ์„ ๊ฐ€๋Šฅํ•œ ๊ฐ•์˜๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ณผ์ •์— ์บ์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ๋จผ์ € ํ™•์ธ ํ•˜๋Š” ๊ณผ์ • ์ถ”๊ฐ€
  • ํ•™์ƒ์ด ์ถœ์„์„ ์‹œ๋„ํ•  ๋•Œ๋„ ์บ์‹ฑ์„ ๋จผ์ € ํ™•์ธํ•˜๋Š” ๊ณผ์ • ์ถ”๊ฐ€
  • ํ•™์ƒ์„ ์Šน์ธํ•ด์ค„ ๋•Œ, ์—ด๋ ค์žˆ๋Š” ๊ฒฝ์šฐ ์บ์‹ฑํ•˜๋Š” ๊ณผ์ • ์ถ”๊ฐ€
  • ์ „๊ณผ์ • ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
  • Event๋ฅผ ๋ฐœํ–‰ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝ

Metadata

Metadata

Assignees

No one assigned

    Labels

    Refactor๋ฆฌํŒฉํ† ๋ง

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions