Skip to content

Commit deb86fd

Browse files
committed
feat: 동기 테스트 코드 추가 (기록용)
1 parent 363b6d4 commit deb86fd

File tree

3 files changed

+82
-7
lines changed

3 files changed

+82
-7
lines changed

Diff for: src/main/java/com/softeer/podoarrival/event/controller/ArrivalEventSyncController.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,6 @@ public class ArrivalEventSyncController {
2222
// @PostMapping("/application")
2323
@Operation(summary = "선착순 응모용 Api")
2424
public CommonResponse<ArrivalApplicationResponseDto> arrivalEventApplication(@Auth AuthInfo authInfo) {
25-
return new CommonResponse<>(arrivalEventSyncService.applyEvent(authInfo));
25+
return new CommonResponse<>(arrivalEventSyncService.applyEventWithRedis(authInfo));
2626
}
2727
}

Diff for: src/main/java/com/softeer/podoarrival/event/repository/ArrivalUserRepository.java

+3
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,8 @@
33
import com.softeer.podoarrival.event.model.entity.ArrivalUser;
44
import org.springframework.data.jpa.repository.JpaRepository;
55

6+
import java.util.Optional;
7+
68
public interface ArrivalUserRepository extends JpaRepository<ArrivalUser, Long> {
9+
Optional<ArrivalUser> findByPhoneNum(String phoneNum);
710
}

Diff for: src/main/java/com/softeer/podoarrival/event/service/ArrivalEventSyncService.java

+78-6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.softeer.podoarrival.event.service;
22

3+
import com.softeer.podoarrival.event.exception.EventClosedException;
34
import com.softeer.podoarrival.event.exception.ExistingUserException;
45
import com.softeer.podoarrival.event.model.dto.ArrivalApplicationResponseDto;
56
import com.softeer.podoarrival.event.model.entity.ArrivalUser;
@@ -14,8 +15,14 @@
1415
import org.slf4j.Logger;
1516
import org.slf4j.LoggerFactory;
1617
import org.springframework.stereotype.Service;
18+
import org.springframework.transaction.annotation.Transactional;
1719

1820
import java.time.LocalDate;
21+
import java.time.LocalDateTime;
22+
import java.util.Optional;
23+
import java.util.concurrent.CompletableFuture;
24+
import java.util.concurrent.ConcurrentHashMap;
25+
import java.util.concurrent.atomic.AtomicInteger;
1926

2027
@Slf4j
2128
@Service
@@ -29,9 +36,14 @@ public class ArrivalEventSyncService {
2936
private boolean CHECK = false;
3037

3138
private final String ARRIVAL_SET = "arrivalset";
32-
private static int MAX_ARRIVAL = 30000; // default
39+
private static int MAX_ARRIVAL = 40000; // default
40+
private static int count = 1;
3341

34-
public ArrivalApplicationResponseDto applyEvent(AuthInfo authInfo) {
42+
private static AtomicInteger countAtomic = new AtomicInteger(1);
43+
private static ConcurrentHashMap<String, Integer> hashMap = new ConcurrentHashMap<>();
44+
45+
46+
public ArrivalApplicationResponseDto applyEventWithRedis(AuthInfo authInfo) {
3547
String redisKey = LocalDate.now() + ARRIVAL_SET;
3648

3749
if(CHECK){
@@ -61,11 +73,71 @@ public ArrivalApplicationResponseDto applyEvent(AuthInfo authInfo) {
6173
.build()
6274
);
6375
log.info("[당첨] 유저 전화번호 = {}, 등수 = {}", authInfo.getPhoneNum(), grade);
64-
try {
65-
Thread.sleep(15);
66-
} catch (InterruptedException e) {
67-
throw new RuntimeException(e);
76+
// try {
77+
// Thread.sleep(15);
78+
// } catch (InterruptedException e) {
79+
// throw new RuntimeException(e);
80+
// }
81+
return new ArrivalApplicationResponseDto(true, authInfo.getName(), authInfo.getPhoneNum(), grade);
82+
} else {
83+
CHECK = true;
84+
return new ArrivalApplicationResponseDto(false, authInfo.getName(), authInfo.getPhoneNum(), grade);
85+
}
86+
}
87+
88+
@Transactional
89+
public synchronized ArrivalApplicationResponseDto applyEventWithSynchronized(AuthInfo authInfo) {
90+
91+
if(CHECK){
92+
return new ArrivalApplicationResponseDto(false, authInfo.getName(), authInfo.getPhoneNum(), -1);
93+
}
94+
95+
Optional<ArrivalUser> findUser = arrivalUserRepository.findByPhoneNum(authInfo.getPhoneNum());
96+
97+
int grade = count++;
98+
if(grade<=MAX_ARRIVAL) {
99+
if(findUser.isEmpty()) {
100+
arrivalUserRepository.save(
101+
ArrivalUser.builder()
102+
.name(authInfo.getName())
103+
.phoneNum(authInfo.getPhoneNum())
104+
.role(Role.ROLE_USER)
105+
.arrivalRank(grade)
106+
.build()
107+
);
108+
return new ArrivalApplicationResponseDto(true, authInfo.getName(), authInfo.getPhoneNum(), grade);
109+
} else {
110+
throw new ExistingUserException("이미 응모한 전화번호입니다.");
68111
}
112+
} else {
113+
CHECK = true;
114+
return new ArrivalApplicationResponseDto(false, authInfo.getName(), authInfo.getPhoneNum(), grade);
115+
}
116+
}
117+
118+
@Transactional
119+
public ArrivalApplicationResponseDto applyEventWithJava(AuthInfo authInfo) {
120+
if(CHECK){
121+
return new ArrivalApplicationResponseDto(false, authInfo.getName(), authInfo.getPhoneNum(), -1);
122+
}
123+
124+
//첫번째 응답
125+
if(hashMap.containsKey(authInfo.getPhoneNum())){
126+
throw new ExistingUserException("이미 응모한 전화번호입니다.");
127+
}
128+
129+
int grade = countAtomic.getAndIncrement();
130+
// 선착순 순위에 들었다면
131+
if(grade <= MAX_ARRIVAL){
132+
arrivalUserRepository.save(
133+
ArrivalUser.builder()
134+
.name(authInfo.getName())
135+
.phoneNum(authInfo.getPhoneNum())
136+
.role(Role.ROLE_USER)
137+
.arrivalRank(grade)
138+
.build()
139+
);
140+
log.info("전화번호 = {}", authInfo.getPhoneNum());
69141
return new ArrivalApplicationResponseDto(true, authInfo.getName(), authInfo.getPhoneNum(), grade);
70142
} else {
71143
CHECK = true;

0 commit comments

Comments
 (0)