Skip to content

JaeBaeWon/backend

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐ŸŽŸ๏ธ ํ‹ฐ์ผ“ํŒ… ํ”Œ๋žซํผ ๋ฐฑ์—”๋“œ

๐Ÿ“‘ ๋ชฉ์ฐจ

  1. ์„œ๋น„์Šค ๊ฐœ์š”
  2. ๊ธฐํš ๋ฐฐ๊ฒฝ
  3. ๊ธฐ์กด ์„œ๋น„์Šค์™€์˜ ์ฐจ๋ณ„์ 
  4. ์ฃผ์š” ๊ธฐ๋Šฅ
  5. ํ•ต์‹ฌ ๊ธฐ๋Šฅ ๊ตฌํ˜„

๐ŸŽŸ๏ธ ์„œ๋น„์Šค ๊ฐœ์š”

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


๐Ÿ“Œ ๊ธฐํš ๋ฐฐ๊ฒฝ

๐ŸŽญ ๊ณต์—ฐ ์‚ฐ์—… ์„ฑ์žฅ

  • ์ „๋…„๋„ ๋™๋ถ„๊ธฐ ๋Œ€๋น„ 306์–ต ์› ์ฆ๊ฐ€
  • ๋Œ€ํ˜• ๊ณต์—ฐ๋ฟ ์•„๋‹ˆ๋ผ ์ค‘์†Œํ˜• ๊ณต์—ฐ ์‹œ์žฅ๋„ ํ™•๋Œ€ ์ค‘

๐Ÿš€ ์‹ ๊ทœ ํ”Œ๋žซํผ์˜ ๋“ฑ์žฅ

  • ์šฐ๋ฆฌ์€ํ–‰ ํ‹ฐ์ผ“ํŒ… ํ”Œ๋žซํผ ์ง„์ถœ ์˜ˆ์ •
  • ์ค‘์†Œํ˜• ๊ณต์—ฐ๊ณผ์˜ ์ƒ์ƒ ๊ฐ€์น˜ ์‹คํ˜„ ๊ฐ€๋Šฅ

๐Ÿ”Ž ๊ธฐ์กด ์„œ๋น„์Šค์™€ ์ฐจ๋ณ„์ 

1. ํ”ผ์‹ฑ ์‚ฌ์ดํŠธ ํ”ผํ•ด ๋ฐฉ์ง€

  • ๊ณต์—ฐ ์•Œ๋ฆผ ์˜ˆ์•ฝ ์‹œ, ๊ณต์‹ ์˜ˆ๋งค ์‚ฌ์ดํŠธ ์ฃผ์†Œ๋ฅผ ๋ฉ”์ผ๋กœ ๋ฐœ์†ก
  • ์‚ฌ์šฉ์ž๊ฐ€ ์•ˆ์ „ํ•˜๊ฒŒ ๋ฐ”๋กœ ์ ‘์† โ†’ ํ”ผ์‹ฑ ์œ„ํ—˜ ์ตœ์†Œํ™”

2. ์ž”์—ฌ์„ ํ™•์ธ์˜ ์–ด๋ ค์›€ ํ•ด๊ฒฐ

  • ๊ธฐ์กด ์‚ฌ์ดํŠธ: ์ž”์—ฌ์„ ํ™•์ธ ๋ถˆํŽธ
  • ๋ณธ ํ”Œ๋žซํผ: ์ƒ์„ธ ํŽ˜์ด์ง€ UI์—์„œ ์ฆ‰์‹œ ํ™•์ธ ๊ฐ€๋Šฅ

3. ๊ฒฐ์ œ ๋‹จ๊ณ„ ์ด์ „์˜ ์ด์„ ์ขŒ ๋ฌธ์ œ ํ•ด๊ฒฐ

  • ๊ธฐ์กด: ๊ฒฐ์ œ ๋‹จ๊ณ„์—์„œ ์ด์„ ์ขŒ ๋ฐœ์ƒ โ†’ ๋‹ค์‹œ ์ขŒ์„ ์„ ํƒ ํ•„์š”
  • ๊ฐœ์„ : ์ขŒ์„ ์„ ํƒ ์‹œ ์ฆ‰์‹œ ์ด์„ ์ขŒ ์—ฌ๋ถ€ ํ™•์ธ ๊ฐ€๋Šฅ

๋ฐฑ์—”๋“œ ์•„ํ‚คํ…์ฒ˜

image

๐Ÿ› ๏ธ ์ฃผ์š” ๊ธฐ๋Šฅ

โœ… ํ”ผ์‹ฑ ๋ฐฉ์ง€ ํ”„๋กœ์„ธ์Šค

image image

โœ… ์ž”์—ฌ์„ ํ™•์ธ UI

image

โœ… ์‹ค์‹œ๊ฐ„ ์ด์„ ์ขŒ ๋ฐฉ์ง€

image

โš™๏ธ ํ•ต์‹ฌ ๊ธฐ๋Šฅ ๊ตฌํ˜„

์ขŒ์„ ์„ ์  ๋™์‹œ์„ฑ ์ œ์–ด

  • ์ธ๊ธฐ ํ‹ฐ์ผ“ํŒ… ํ™˜๊ฒฝ์—์„œ ํ•œ ์ขŒ์„์— ๋‹ค์ˆ˜ ์‚ฌ์šฉ์ž๊ฐ€ ๋™์‹œ์— ์š”์ฒญ โ†’ ๋™์‹œ์„ฑ ์ด์Šˆ ๋ฐœ์ƒ
  • ํ•ด๊ฒฐ์ฑ…: Redis ๋ถ„์‚ฐ๋ฝ(Redisson) ์ ์šฉ

๐Ÿ”‘ ํ•ต์‹ฌ ์ฝ”๋“œ

// Redis Lock์œผ๋กœ ์ขŒ์„ ์ด์„ ์ขŒ ๊ด€๋ฆฌ
public boolean tryLockSeat(Long seatId) {
    RLock lock = redissonClient.getLock(SEAT_LOCK_PREFIX + seatId);
    String seatKey = SEAT_STATE_PREFIX + seatId;

    try {
        if (lock.tryLock(1, 10, TimeUnit.SECONDS)) {
            String seatStatus = redisTemplate.opsForValue().get(seatKey);

            if (!"RESERVED".equals(seatStatus)) {
                // Redis์— ์ž„์‹œ ์„ ์  ์ƒํƒœ ์ €์žฅ (TTL: 5๋ถ„)
                redisTemplate.opsForValue().set(seatKey, "RESERVED", 5, TimeUnit.MINUTES);
                return true;
            }
        }
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
    } finally {
        if (lock.isHeldByCurrentThread()) {
            lock.unlock();
        }
    }
    return false;
}

๐Ÿงช JUnit ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ

image image image image
  • ๋™์‹œ ์š”์ฒญ ํ…Œ์ŠคํŠธ (100์ขŒ์„ ร— 100๋ช… ์š”์ฒญ)
image image
  • ๊ฒฐ๊ณผ: ๋ชจ๋“  ์ขŒ์„์ด ๋‹จ ํ•œ ๋ช…๋งŒ ์„ ์  ์„ฑ๊ณต

โš ๏ธ ์ถ”ํ›„ ๊ณ ๋ ค์‚ฌํ•ญ

  • ํ˜„์žฌ Redis Lock TTL = 5๋ถ„

  • ๋ฌธ์ œ ์ƒํ™ฉ:

    • ์‚ฌ์šฉ์ž๊ฐ€ ์„ ์  ์„ฑ๊ณต ํ›„ ๊ฒฐ์ œ ์ „์— ์˜ค๋ฅ˜๋กœ ์ดํƒˆ โ†’ ์œ ๋ น๋ฝ(ghost lock) ๋ฐœ์ƒ

    • ํ•ด๋‹น ์ขŒ์„์€ 5๋ถ„๊ฐ„ ์„ ์  ๋ถˆ๊ฐ€ โ†’ ๋งค์ถœ ์†์‹ค ์œ„ํ—˜

โžก ๋Œ€์‘ ๋ฐฉ์•ˆ ํ•„์š”

  • ์žฅ์•  ๊ฐ์ง€ ์‹œ ๋ฝ ๊ฐ•์ œ ํ•ด์ œ ๋กœ์ง

  • ๊ฒฐ์ œ ํ๋ฆ„๊ณผ ์„ ์  ์ƒํƒœ๋ฅผ ์‹ค์‹œ๊ฐ„ ๋™๊ธฐํ™”

  • ์ผ์ • ์ฃผ๊ธฐ ์ ๊ฒ€(batch)์œผ๋กœ ์œ ๋ น๋ฝ ๋ณต๊ตฌ

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 5

Languages