본문으둜 κ±΄λ„ˆλ›°κΈ°

25-03-17

πŸ“Œ Daily Report​

https://github.com/ssginc-be/DOKI/issues/111


πŸ“Œ ν”„λ‘œμ νŠΈ 상황​

생각보닀 Kibanaκ°€ 쉽고 λΉ λ₯΄κ²Œ μ‹œκ°ν™”λ˜κ³  μžˆλ‹€;

μƒˆλ²½μ— 머리 μ‹νž κ²Έ 차트 λͺ‡ 개 λ§Œλ“€μ–΄λ³΄λŠ”λ° μž¬λ°Œλ”λΌ...?

νƒœλΈ”λ‘œ ν•œλ²ˆ μ¨λ΄€μ–΄μ„œ κ·ΈλŸ°κ°€ μ•„λ‹˜ ν‚€λ°”λ‚˜ μžμ²΄κ°€ 그만큼 μ“°κΈ° μ‰½κ²Œ λ˜μ–΄μžˆλŠ”κ±΄κ°€ γ…‹γ…‹γ…‹

μš”μ¦˜ κΈ°λΆ„ μ™„μ „ λ‹€μš΄μΈλ° ν‚€λ°”λ‚˜κ°€ λ„ˆλ¬΄ κ·€μ—¬μ›Œμ„œ νžλ§λœλ‹€ πŸ₯°πŸ˜˜

λ‚΄κ°€ 뢙이고 μ‹Άμ—ˆλ˜κ±° μž˜λΌμ„œ λ„ˆλ¬΄ κΈ°λΆ„ μ‘°μ•„!!


πŸ“Œ @Transactional μžŠμ§€ λ§ˆμ„Έμš”β€‹

ν˜„μž¬μ˜ μ•Œλ¦Ό μ‹œμŠ€ν…œμ—” 이용자 μͺ½μ— ν•˜μžκ°€ ν•˜λ‚˜ μžˆλ‹€.

μ΄μš©μžκ°€ μ˜ˆμ•½μ„ ν•œ ν›„, notiλ₯Ό subscribe ν•˜κΈ° 전에 μ•Œλ¦Ό λ©”μ‹œμ§€κ°€ 가버리면 κ·Έ μ•Œλ¦Όμ„ λͺ» λ°›κ³  μžˆλ‹€.

γ…‹γ…‹γ…‹γ…‹γ…‹γ…‹γ…‹γ…‹γ…‹γ…‹γ…‹γ…‹γ…‹γ…‹γ…‹γ…‹

사싀 운영자 μͺ½μ—λŠ” νŽ˜μ΄μ§€ λ‘œλ“œλ§ˆλ‹€ μž”μ—¬ μ•Œλ¦Ό μ½μ–΄μ˜€λŠ” APIλ₯Ό μ—°κ²°ν•΄λ‘¬μ„œ λ¬Έμ œκ°€ μ—†λŠ”λ°...

μ΄μš©μžλŠ” λ”°λ‘œ μ•Œλ¦Ό μ•„μ΄μ½˜μœΌλ‘œ dock을 펼칠 일 μ—†λ‹€λ³΄λ‹ˆ ν•„μš” μ—†λŠ” 쀄 μ•Œμ•˜μ§€...

근데 그게 μ•„λ‹ˆμ—ˆμŒ γ…‹


🐞@Transactional의 μœ λ¬΄λŠ” 마치 UB와도 같은..​

μ΄μƒν•˜κ²Œ 운영자 μͺ½μ€ μ•Œλ¦Ό λ©”μ‹œμ§€κ°€ 잘 μ €μž₯λ˜λŠ”λ° 이용자 μͺ½μ„ 고치렀 ν™•μΈν•΄λ³΄λ‹ˆ, 이용자 μΈ‘ λ©”μ‹œμ§€λŠ” ν…Œμ΄λΈ”μ— μ €μž₯이 μ•ˆλ˜κ³  μžˆμ—ˆλ‹€. μ•„λ‹ˆ μ™œ?

μ„€λ§ˆ? ν•˜κ³  @Transactional을 λΆ™μ—¬λ³΄λ‹ˆ κ·Έμ œμ„œμ•Ό μ˜λ„λŒ€λ‘œ μž‘λ™ν•˜κΈ° μ‹œμž‘ν–ˆλ‹€.

COMMIT이 μ•ˆλ˜μ–΄μ„œ 그랬던 κ²ƒμœΌλ‘œ μΆ”μ •λ˜μ§€λ§Œ, μ •ν™•νžˆ μ™œ 운영자 μͺ½μ€ λ¬Έμ œκ°€ μ—†μ—ˆλŠ”μ§€ κΆκΈˆν•΄μ‘Œλ‹€.

μ–˜λ„ 슬슬 μ’€ λ”₯λ‹€μ΄λΈŒλ₯Ό ν•΄μ•Όκ² λ‹€.

NotificationService.java
/* [INTERNAL] μ˜ˆμ•½ κ²°κ³Ό μ•Œλ¦Ό - 운영자 to 이용자 */
// rid -> μ΄μš©μžκ°€ μ˜ˆμ•½ μš”μ²­ν•˜μ—¬ 승인 λŒ€κΈ°μ€‘μ΄κ±°λ‚˜
// -> μš΄μ˜μžκ°€ 승인/거절/μ·¨μ†Œν•œ μ˜ˆμ•½μ˜ id
// νŒμ—…μŠ€ν† μ–΄ idκ°€ μ•„λ‹Œ μ˜ˆμ•½ idλ₯Ό λ°›λŠ” 것이 맞음
@Transactional
public void notifyReserveResultToMember(Long rid, String resultStatus) {
// 좔후에 μ—λŸ¬ν•Έλ“€λ§ ν•„μš”
Reservation reservation = rRepo.findById(rid).get();
Long memberCode = reservation.getMember().getMemberCode(); // ν•΄λ‹Ή μ˜ˆμ•½μ˜ 이용자
...

🐞이거 λ¨Έμž„?​

뭐가 λ‹€λ₯Έ...κ±°μ£ ?

μ–΅κΉŒλ¨Έμž„

μ•„. μ°Ύμ•„λ³΄λ‹ˆκΉŒ νƒ€μž…μ΄ λ‹€λ₯΄λ”라. νŒŒλΌλ―Έν„° μˆœμ„œ 잘λͺ»λΌμ„œ λ°”κΎΈλ‹€κ°€ toString λΉΌλŠ”κ±Έ κΉŒλ¨Ήμ—ˆμ—ˆλ‹€.

Store store = storeOpt.get();
assertEquals("λ“±λ‘λœ νŒμ—…μŠ€ν† μ–΄μ˜ 이름 뢈일치", "리락쿠마 콜라보 카페 in 강남", store.getStoreName());
assertEquals("λ“±λ‘λœ νŒμ—…μŠ€ν† μ–΄μ˜ 지점 뢈일치", "신세계백화점 강남점", store.getStoreBranch());
assertEquals("λ“±λ‘λœ νŒμ—…μŠ€ν† μ–΄μ˜ μ‹œμž‘μΌ 뢈일치", LocalDate.of(2025, 3, 25), store.getStoreStartDate().toString());
assertEquals("λ“±λ‘λœ νŒμ—…μŠ€ν† μ–΄μ˜ μ’…λ£ŒμΌ 뢈일치", LocalDate.of(2025, 3, 27), store.getStoreEndDate().toString());
assertEquals("λ“±λ‘λœ νŒμ—…μŠ€ν† μ–΄μ˜ μ˜ˆμ•½ 정원 뢈일치", 20, store.getStoreCapacity().toString());