Project/์‹นํ‹”์›€

[์‹นํ‹”์›€] 11/13 ๊ฐœ๋ฐœ์ผ์ง€ ์ฟ ํฐ ๋ฐœ๊ธ‰ ์‹œ ๋™์‹œ์„ฑ ๋ฌธ์ œ ํ•ด๊ฒฐ 1 : ๋™์‹œ์„ฑ ๋ฌธ์ œ ๋ฐœ์ƒ ๋ฐ ๋‚™๊ด€์ , ๋น„๊ด€์ , ๋ถ„์‚ฐ ๋ฝ

ํ•œ33 2024. 11. 17. 19:06

๐Ÿ’ก ๋ชฉํ‘œ

์ฟ ํฐ 300 ๊ฐœ๋ฅผ ์œ ์ € 1000 ๋ช…์ด 5์ดˆ๋™์•ˆ ๋ฐœ๊ธ‰์„ ๋ฐ›๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ๋Š”๋ฐ, ์ค‘๋ณต๋œ ์ฟ ํฐ์ด ๋ฐœ๊ธ‰๋œ๋‹ค๋“ ์ง€, ์ˆ˜๋Ÿ‰ 300 ๊ฐœ๋ฅผ ๋„˜์–ด์„œ์„œ ๋ฐœ๊ธ‰์ด ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฝ์„ ๊ฑธ์–ด ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ํ•„์š”๊ฐ€ ์žˆ์—ˆ๋‹ค.

 

 

๐Ÿ“ Test : ๋ฝ์„ ์ ์šฉํ•˜์ง€ ์•Š์€ ์ƒํƒœ์˜ ๋™์‹œ์„ฑ ๋ฌธ์ œ ํ™•์ธ

  • Number of Threads (users) : 1000
  • Ramp-up period (seconds) : 5
  • Loop Count : 1
  • ๋ฐœ๊ธ‰ํ•œ ์œ ํšจ ์ฟ ํฐ ์ˆ˜ : 300
  • ์‹ค์ œ ์ฟ ํฐ์„ ๋ฐœ๊ธ‰๋ฐ›์€ ์œ ์ € ์ˆ˜ : 595

 

์œ„ ์ด๋ฏธ์ง€์™€ ๊ฐ™์ด ๋‚จ์€ ์ฟ ํฐ ์ˆ˜๋„ ์ž˜ ์ค„์ง€ ์•Š๊ณ  ์ค‘๋ณต์œผ๋กœ ๋ฐœ๊ธ‰๋˜๋Š” ์ฟ ํฐ์ด ๋งŽ์ด ๋ฐœ์ƒ.

์‹ค์ œ๋กœ ๊ฐ™์€ ์ฝ”๋“œ์˜ ์ฟ ํฐ์„ ๋ฐœ๊ธ‰๋ฐ›์€ ์œ ์ €๋„ ๋งŽ๋‹ค.

์‘๋‹ต ์ฒ˜๋ฆฌ์†๋„๋Š” ํ‰๊ท  ์•ฝ 171 ms ๊ฐ€ ๋‚˜์™”๋‹ค.

 

๊ฒฐ๋ก 

๋งŽ์€ ํŠธ๋ž˜ํ”ฝ์ด ๋ชฐ๋ ธ์„ ๋•Œ ์ฟ ํฐ ๋ฐœ๊ธ‰ ์š”์ฒญ์—์„œ ๋™์‹œ์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์ด์— ๋งž๋Š” ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ ๋‚™๊ด€์  ๋ฝ, ๋น„๊ด€์  ๋ฝ, ๋ถ„์‚ฐ ๋ฝ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜๋‹ค.


๐ŸŒฑ ๋‚™๊ด€์  ๋ฝ ( Optimistic Lock )

@Entity
public class Product {
    @Id
    private Long id;

    @Version
    private int version;

    private String name;
    private int quantity;
    // getters and setters
}

 

๐Ÿ“š ์ƒํ™ฉ ์˜ˆ์‹œ

A ์™€ B ๊ฐ€ ๋™์‹œ์— ๊ฐ™์€ Product ๋ฅผ ์กฐํšŒํ•ด์„œ ์ˆ˜์ •ํ•œ๋‹ค๊ณ  ๊ฐ€์ •

์กฐํšŒ ์‹œ์ ์˜ version ์€ 1 ์ด๋ผ๊ณ  ํ–ˆ์„ ๋•Œ,

A ๊ฐ€ Product ๋ฅผ ์ˆ˜์ •ํ•ด์„œ version ์„ 2 ๋กœ ์˜ฌ๋ฆฐ๋‹ค.

๊ทธ ๋•Œ B ๊ฐ€ ์ˆ˜์ •์„ ์š”์ฒญํ•˜๋ฉด ์—ฌ์ „ํžˆ B ์—์„œ version ์€ 1 ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ถฉ๋Œ์„ ๊ฐ์ง€ํ•˜๊ณ  ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ.

-> B ๋Š” ์ˆ˜์ •์„ ๋กค๋ฐฑํ•˜๊ณ  ๋‹ค์‹œ ์ž‘์—…์„ ์‹œ๋„ํ•ด์•ผํ•œ๋‹ค.

๐Ÿ“š ์žฅ์ 

  • ๋ฝ์ด ๊ฑธ๋ฆฌ์ง€ ์•Š์Œ: ๋ฐ์ดํ„ฐ์— ๋ฝ์„ ๊ฑธ์ง€ ์•Š๊ณ  ์ˆ˜์ •ํ•˜๋ฏ€๋กœ ๋™์‹œ์„ฑ ์„ฑ๋Šฅ์ด ์ข‹๋‹ค. ์ฆ‰, ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ๋ฝ์— ๋ง‰ํžˆ์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‚ฎ์€ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ: ๋น„๊ด€์  ๋ฝ๊ณผ ๋‹ฌ๋ฆฌ, ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์ „๊นŒ์ง€๋Š” ๋ฝ์„ ๊ฑธ์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ์ด ์ค„์–ด๋“ ๋‹ค.

๐Ÿ“š ๋‹จ์ 

  • ์ถฉ๋Œ ๋ฐœ์ƒ ์‹œ ์žฌ์‹œ๋„ ํ•„์š”: ๋งŒ์•ฝ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ํŠธ๋žœ์žญ์…˜์„ ๋‹ค์‹œ ์‹œ๋„ํ•ด์•ผ ํ•œ๋‹ค. ์ถฉ๋Œ์ด ๋นˆ๋ฒˆํ•˜๋‹ค๋ฉด ๋น„๊ด€์  ๋ฝ์ด ๋” ์ ํ•ฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ถฉ๋Œ ๊ฐ์ง€ ๋ฐ ๊ด€๋ฆฌ ๋ณต์žก์„ฑ: ์ถฉ๋Œ์„ ๊ฐ์ง€ํ•˜๊ณ  ์žฌ์‹œ๋„ํ•˜๋Š” ๋กœ์ง์„ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๋ณต์žก์„ฑ์ด ์ƒ๊ธด๋‹ค.

๐Ÿ“š ์š”์•ฝ

๋‚™๊ด€์  ๋ฝ์€ ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ์ด ๋‚ฎ์€ ๊ฒฝ์šฐ์— ์œ ์šฉํ•˜๋ฉฐ, ์ถฉ๋Œ ์‹œ์—๋Š” ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ ์žฌ์‹œ๋„๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐ์ดํ„ฐ ์ถฉ๋Œ์ด ์ž์ฃผ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š” ํ™˜๊ฒฝ์—์„œ ์„ฑ๋Šฅ ์ตœ์ ํ™”์— ์ข‹๋‹ค.


๐ŸŒฑ ๋น„๊ด€์  ๋ฝ ( Pessimistic Lock )

import javax.persistence.LockModeType;

@Transactional
public Product updateProductQuantity(Long productId, int newQuantity) {
    Product product = entityManager.find(Product.class, productId, LockModeType.PESSIMISTIC_WRITE);
    product.setQuantity(newQuantity);
    return product;
}

 

์œ„ ์ฝ”๋“œ์—์„œ LockModeType.PESSIMISTIC_WRITE ์˜ต์…˜์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋น„๊ด€์  ๋ฝ์„ ์„ค์ •ํ•˜๊ณ , ํ•ด๋‹น ๋ฐ์ดํ„ฐ์— ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•œ๋‹ค.

๐Ÿ“š ์ƒํ™ฉ ์˜ˆ์‹œ

A ๊ฐ€ Product ์˜ quantity ๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค๊ณ  ๊ฐ€์ •.

A ๋Š” ๋จผ์ € ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ SELECT ... FOR UPDATE ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋น„๊ด€์  ๋ฝ์„ ์„ค์ •

A ์˜ ํŠธ๋žœ์žญ์…˜์ด ๋๋‚˜๊ธฐ ์ „๊นŒ์ง€ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋Š” ํ•ด๋‹น Product ์ฟผ๋ฆฌ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.

 

์ดํ›„ A ๊ฐ€ quantity ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ์ปค๋ฐ‹ํ•˜๋ฉด ๋ฝ์ด ํ•ด์ œ๋œ๋‹ค.

๐Ÿ“š ์žฅ์ 

  • ๊ฐ•๋ ฅํ•œ ์ถฉ๋Œ ๋ฐฉ์ง€: ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๊ฐ•๋ ฅํžˆ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์–ด ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์ด ๋ณด์žฅ๋œ๋‹ค.
  • ์žฌ์‹œ๋„๊ฐ€ ํ•„์š” ์—†์Œ: ๋ฐ์ดํ„ฐ ์ˆ˜์ • ์ „๋ถ€ํ„ฐ ๋ฝ์ด ๊ฑธ๋ ค ์žˆ์–ด ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ์ถฉ๋Œ๋กœ ์ธํ•œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋‚˜ ์žฌ์‹œ๋„ ๋กœ์ง์ด ํ•„์š” ์—†๋‹ค.

๐Ÿ“š ๋‹จ์ 

  • ์„ฑ๋Šฅ ์ €ํ•˜: ๋น„๊ด€์  ๋ฝ์€ ํŠธ๋žœ์žญ์…˜์ด ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋ฝ์„ ์œ ์ง€ํ•˜๋ฏ€๋กœ, ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ๋ฐœ์ƒํ•ด ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฐ๋“œ๋ฝ ์œ„ํ—˜: ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์ด ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฅผ ๋™์‹œ์— ๋ฝ์„ ๊ฑธ๋ ค๊ณ  ํ•  ๋•Œ, ๋ฐ๋“œ๋ฝ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“š ์š”์•ฝ

๋น„๊ด€์  ๋ฝ์€ ๋ฐ์ดํ„ฐ ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ฑฐ๋‚˜, ๊ฐ•๋ ฅํ•œ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ์ ํ•ฉํ•˜๋‹ค.

ํ•˜์ง€๋งŒ ์„ฑ๋Šฅ ์ €ํ•˜์™€ ๋ฐ๋“œ๋ฝ ์œ„ํ—˜์ด ์žˆ์–ด, ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ์ด ์ ์€ ๊ฒฝ์šฐ๋ผ๋ฉด ๋‚™๊ด€์  ๋ฝ์ด ๋” ๋‚˜์€ ์„ ํƒ์ผ ์ˆ˜ ์žˆ๋‹ค.


๐ŸŒฑ ๋ถ„์‚ฐ ๋ฝ ( Distributed Lock ) - Redisson

import org.redisson.api.RLock;
import java.util.concurrent.TimeUnit;

// ๋ฝ์„ ์„ค์ •ํ•˜๊ณ  ์‚ฌ์šฉํ•  ํ‚ค ์ด๋ฆ„ ์ •์˜
String lockKey = "product:lock";

// ๋ฝ์„ ๊ฐ€์ ธ์˜ค๊ธฐ
RLock lock = redissonClient.getLock(lockKey);

try {
        // ๋ฝ์„ ํš๋“ํ•˜๋ ค๊ณ  ์‹œ๋„, 10์ดˆ ๋™์•ˆ ๊ธฐ๋‹ค๋ฆฌ๊ณ  5์ดˆ ๋™์•ˆ ๋ฝ ์œ ์ง€
        if (lock.tryLock(10, 5, TimeUnit.SECONDS)) {
        // ๋ฝ์„ ํš๋“ํ–ˆ๋‹ค๋ฉด ์‹คํ–‰ํ•  ์ฝ”๋“œ
        System.out.println("Lock acquired, executing critical section.");
// ์ค‘์š”ํ•œ ์ž‘์—… ์ˆ˜ํ–‰ (์˜ˆ: ์žฌ๊ณ  ์ˆ˜๋Ÿ‰ ๊ฐ์†Œ ๋“ฑ)
    } else {
            // ๋ฝ์„ ์–ป์ง€ ๋ชปํ•˜๋ฉด ์‹คํ–‰ํ•  ์ฝ”๋“œ
            System.out.println("Could not acquire lock, try again later.");
    }
            } catch (InterruptedException e) {
        e.printStackTrace();
} finally {
        // ๋ฝ ํ•ด์ œ
        if (lock.isHeldByCurrentThread()) {
        lock.unlock();
        System.out.println("Lock released.");
    }
            }

 

๐Ÿ“š ์ƒํ™ฉ ์˜ˆ์‹œ

A ๊ฐ€ Product ์˜ quantity ๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค๊ณ  ๊ฐ€์ •.

ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋งŒ Product ๋ฅผ ํ™•์ธํ•˜๊ณ  ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— 

๋จผ์ € ์š”์ฒญ์ด ๋“ค์–ด์˜จ A ๊ฐ€ ๋ฝ์„ ํš๋“ํ•˜๊ณ  Product ๋ฅผ ํ™•์ธ, ๋ณ€๊ฒฝ.

 

B ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ๊ณ ๊ฐ A ์˜ ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ฑฐ๋‚˜ "์žฌ์‹œ๋„" ์™€ ๊ฐ™์€ ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๊ฒŒ ํ•จ.

๊ณ ๊ฐ A์˜ ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๋ฝ์ด ํ•ด์ œ๋˜๊ณ , ๊ณ ๊ฐ B๊ฐ€ ๋ฝ์„ ํš๋“ํ•˜์—ฌ ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ˆ˜ํ–‰

 

  • lock.tryLock(10, 5, TimeUnit.SECONDS): ๋ฝ์„ ํš๋“ํ•  ๋•Œ 10์ดˆ ๋™์•ˆ ๊ธฐ๋‹ค๋ฆฌ๋ฉฐ, ๋ฝ์„ ํš๋“ํ•˜๋ฉด 5์ดˆ ๋™์•ˆ ์œ ์ง€, ์ด๋กœ์จ ๋ฐ๋“œ๋ฝ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • isHeldByCurrentThread(): ๋ฝ์„ ํ˜„์žฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ณด์œ ํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์—ฌ, ํ˜„์žฌ ์Šค๋ ˆ๋“œ๋งŒ ๋ฝ์„ ํ•ด์ œํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.
  • unlock(): ์ž‘์—…์ด ๋๋‚˜๋ฉด ๋ฝ์„ ํ•ด์ œํ•˜์—ฌ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

 

๐Ÿ“š ์žฅ์ 

  • ๊ฐ„ํŽธํ•œ ์‚ฌ์šฉ: Redisson์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฝ ์„ค์ •๊ณผ ํ•ด์ œ ๋กœ์ง์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • TTL ๊ด€๋ฆฌ ์šฉ์ด: ์ž๋™์œผ๋กœ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์ด ์„ค์ •๋˜๋ฏ€๋กœ, ๋ฐ๋“œ๋ฝ ๋ฐฉ์ง€๊ฐ€ ์‰ฝ๋‹ค.
  • ๋†’์€ ์„ฑ๋Šฅ๊ณผ ํ™•์žฅ์„ฑ: Redis๋ฅผ ํ™œ์šฉํ•ด ๋†’์€ ์„ฑ๋Šฅ๊ณผ ํ™•์žฅ์„ฑ์„ ์ œ๊ณตํ•˜๋ฉฐ, ๋‹ค์ค‘ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ๋ฝ์„ ์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“š ๋‹จ์ 

  • Redis ์˜์กด์„ฑ: Redis ์„œ๋ฒ„์˜ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋ฝ ๊ด€๋ฆฌ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค.
  • TTL ์„ค์ • ์ฃผ์˜ ํ•„์š”: ๋„ˆ๋ฌด ์งง๊ฒŒ ์„ค์ •ํ•  ๊ฒฝ์šฐ, ์ž‘์—…์ด ๋๋‚˜๊ธฐ ์ „์— ๋ฝ์ด ํ•ด์ œ๋  ์œ„ํ—˜์ด ์žˆ๋‹ค.

๐Ÿ“š ์š”์•ฝ

๋น„๊ด€์  ๋ฝ์€ ๋ฐ์ดํ„ฐ ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ฑฐ๋‚˜, ๊ฐ•๋ ฅํ•œ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ์ ํ•ฉํ•˜๋‹ค.

ํ•˜์ง€๋งŒ ์„ฑ๋Šฅ ์ €ํ•˜์™€ ๋ฐ๋“œ๋ฝ ์œ„ํ—˜์ด ์žˆ์–ด, ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ์ด ์ ์€ ๊ฒฝ์šฐ๋ผ๋ฉด ๋‚™๊ด€์  ๋ฝ์ด ๋” ๋‚˜์€ ์„ ํƒ์ผ ์ˆ˜ ์žˆ๋‹ค.

Redisson์„ ์ด์šฉํ•œ Redis ๊ธฐ๋ฐ˜์˜ ๋ถ„์‚ฐ ๋ฝ์€ ๋‹ค์ค‘ ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์ž์› ์ ‘๊ทผ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์ด๋‹ค.

Redisson์ด ์ œ๊ณตํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฝ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๋ฉด ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ ๋ฐ๋“œ๋ฝ ๋ฐฉ์ง€์™€ ์„ฑ๋Šฅ ์ตœ์ ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.


๐Ÿ’ก ๊ฒฐ๋ก 

์ฟ ํฐ์ด ๋ฐœ๊ธ‰ ๋  ๋•Œ ์ฟ ํฐ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•ด์„œ ์ฟ ํฐ ๋ฐœ๊ธ‰ ์ƒํƒœ๋ฅผ ์ž์ฃผ ์ˆ˜์ •ํ•ด์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚™๊ด€์  ๋ฝ์€ ์ถฉ๋Œ ์ฒ˜๋ฆฌ๋‚˜ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ๋ณต์žกํ•ด ์งˆ ์ˆ˜ ์žˆ๊ณ ,

 

๋น„๊ด€์  ๋ฝ์€ ์ฟ ํฐ ๋ฐœ๊ธ‰๊ณผ ๊ฐ™์€ ๊ณ ์† ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ์ƒํ™ฉ์—์„œ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ƒ๊ฐํ•˜๋ฉด ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š๋‹ค.

 

์ดํ›„ ํ™•์žฅ์„ฑ์„ ๊ณ ๋ คํ•ด ๋ถ„์‚ฐ ์บ์‹œ ์‹œ์Šคํ…œ์ธ Redisson ์„ ์ด์šฉํ•œ ๋ถ„์‚ฐ ๋ฝ์„ ์‚ฌ์šฉํ•ด๋ณด๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค.