[TIL] λ€μ μμν΄λ³΄λ νλ‘μ νΈ TIL 14μΌμ°¨..
π μ€λμ μ΄λ€ ν루μμ§..
μ€λμ ν루 μ’ μΌ νΌκ³€νλ ν루μλ€.
μ€μ μλ λΆλͺ¨λ λ°λΌμ ν μλ²μ§, ν λ¨Έλ μ°μμ κ°μ μμ
μ νκ³ μ€ν 5μμ―€ μ§μ λμ°©ν μ μμλ€.
κ·Έλ¦¬κ³ μ»κ³ λμ μΈν λ¨ΈλλμΌλ‘ κ°λ€. νμ§λ§ λλ ν΄μΌ ν λΆλμ΄ μμκΈ°μ μ§ μ μ€λ²
μ κ°μ ν
μ€νΈ μ½λ μμ±μ λ§λ¬΄λ¦¬νλ€.
λ§₯λΆμ μ¬κ³ μ²μμΌλ‘ μΉ΄νμ κ°μ μμ
μ νλλ°, μκ°λ³΄λ€ λλμ΄ λ μ’μλ€.
λ€λ€ μ΄λμ λ§₯λΆμ λ€κ³ μΉ΄νμ κ°μ μμ
μ νλ κ±΄κ° γ
γ
γ
γ
γ
λμμ± μ μ΄ ν
μ€νΈ μ½λλ λ¨μ ν
μ€νΈλ‘ νμΈν μκ° μμκ³ , ν΅ν© ν
μ€νΈλ‘λ§ νμΈμ΄ κ°λ₯νλ€λ κ²μ μκ² λμλ€!
μμ§ ν
μ€νΈ μ½λμ λ―Έν‘ν΄μ λλ¬λλ¬ μ΄μ¬ν μ§°κ³ , ν
μ€νΈ μ½λμ λν 곡λΆκ° λ νμνλ€κ³ λκΌλ€. μμ§ κ³΅λΆν΄μΌ λ κ²λ€μ΄ μ°λλ―Έκ΅°...
κ·Έλλ ν μ€νΈ μ½λλ‘ λμμ± μ μ΄κ° μ λμνλ κ²μ νμΈνκ³ ν루λ₯Ό λ§λ¬΄λ¦¬ν΄μ λ€νμ΄λ€.
π‘ μλ‘κ² μκ² λ λ΄μ©μ λκ° μλλΌ..?!
λμμ± μ μ΄ ν μ€νΈ μ½λ
@Slf4j
@SpringBootTest
@AutoConfigureMockMvc
public class CouponServiceConcurrencyTest {
@Autowired
private CouponService couponService;
@Autowired
private MemberRepository memberRepository;
@Autowired
private MemberCouponRepository memberCouponRepository;
@Autowired
private CouponRepository couponRepository;
private Long couponId;
private final int MAX_ISSUE_COUNT = 10;
private final int THREAD_COUNT = 32;
@BeforeEach
void setUp() {
Coupon coupon = Coupon.of(
"ν
μ€νΈ μΏ ν°", 5000, MAX_ISSUE_COUNT,
LocalDate.now(), LocalDate.now().plusDays(7));
couponRepository.save(coupon);
couponId = coupon.getId();
for (int i = 0; i < THREAD_COUNT; i++) {
Member member = Member.of(
"user" + i + "@email.com", "1234", "ν
μ€νΈ μ¬μ©μ " + i, 27,
String.format("010%08d", i), Authority.CUSTOMER, GenderType.M);
memberRepository.save(member);
}
}
@Test
void λμμ_100λͺ
μ΄_μΏ ν°μ_μμ²νλ©΄_μ€λ³΅μμ΄_10λͺ
λ§_μΏ ν°λ°κΈ() throws InterruptedException{
// given
ExecutorService excutor = Executors.newFixedThreadPool(THREAD_COUNT);
CountDownLatch latch = new CountDownLatch(THREAD_COUNT);
List<Member> memberList = memberRepository.findAll();
long start = System.currentTimeMillis();
// when
for (Member member : memberList) {
excutor.submit(() -> {
try {
couponService.issueCoupon(couponId, member.getId());
} catch (Exception ignored) {
} finally {
latch.countDown();
}
});
}
latch.await();
long end = System.currentTimeMillis();
// then
long count = memberCouponRepository.count();
assertEquals(MAX_ISSUE_COUNT, count);
log.info("β
Thread: {}λͺ
| β± Duration: {}ms | π Issued: {}κ°", THREAD_COUNT, end - start, count);
}
}
ποΈ λ΄μΌμ λ νμ§?!
βοΈ μμΈ νΌλ‘ νκΈ°...
βοΈ ν΄μ..