Skip to content

Commit ec4037a

Browse files
committed
feat: 이벤트 적용 완료
1 parent 6771de5 commit ec4037a

File tree

11 files changed

+84
-39
lines changed

11 files changed

+84
-39
lines changed

src/main/java/cmf/commitField/domain/commit/scheduler/CommitScheduler.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import cmf.commitField.domain.user.repository.UserRepository;
66
import lombok.RequiredArgsConstructor;
77
import lombok.extern.slf4j.Slf4j;
8+
import org.springframework.context.ApplicationEventPublisher;
89
import org.springframework.data.redis.core.StringRedisTemplate;
910
import org.springframework.scheduling.annotation.Scheduled;
1011
import org.springframework.stereotype.Service;
@@ -19,11 +20,13 @@
1920
@RequiredArgsConstructor
2021
public class CommitScheduler {
2122
private final TotalCommitService totalCommitService;
22-
private final CommitCacheService commitCacheService;
2323
private final UserRepository userRepository;
2424
private final StringRedisTemplate redisTemplate;
2525
private final AtomicInteger counter = new AtomicInteger(0);
2626

27+
private final ApplicationEventPublisher eventPublisher;
28+
29+
2730
@Scheduled(fixedRate = 60000) // 1분마다 실행
2831
public void updateUserCommits() {
2932
log.info("🔍 updateUserCommits 실행중");
@@ -62,8 +65,6 @@ private void processUserCommit(String username) {
6265
).getTotalCommitContributions();
6366

6467
newCommitCount = updateTotalCommit - currentCommit; // 새로 추가된 커밋 수
65-
System.out.println("커밋 개수 불러들이기 완료, currentCommit : "+currentCommit);
66-
System.out.println("커밋 개수 불러들이기 완료, updateTCommit : "+updateTotalCommit);
6768

6869
if(newCommitCount > 0){
6970
User user = userRepository.findByUsername(username).get();
@@ -72,10 +73,12 @@ private void processUserCommit(String username) {
7273
user.setLastCommitted(now);
7374
userRepository.save(user);
7475

75-
String redisKey = "commit_update:" + username; // 변경 알림을 위한 변수
7676
redisTemplate.opsForValue().set(activeKey, String.valueOf(updateTotalCommit), 3, TimeUnit.HOURS);
7777
redisTemplate.opsForValue().set(lastcmKey, String.valueOf(now), 3, TimeUnit.HOURS);
7878

79+
CommitUpdateEvent event = new CommitUpdateEvent(this, username, newCommitCount);
80+
eventPublisher.publishEvent(event); // 이벤트 발생
81+
System.out.println("CommitCreatedEvent published for user: " + username);
7982
}
8083

8184
// FIXME: 차후 리팩토링 필요

src/main/java/cmf/commitField/domain/commit/scheduler/CommitUpdateEvent.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,12 @@
55

66
@Getter
77
public class CommitUpdateEvent extends ApplicationEvent {
8-
private final Long userId;
9-
private final int commitCount;
8+
private final String username;
9+
private final long newCommitCount;
1010

11-
public CommitUpdateEvent(Object source, Long userId, int commitCount) {
11+
public CommitUpdateEvent(Object source, String username, long newCommitCount) {
1212
super(source);
13-
this.userId = userId;
14-
this.commitCount = commitCount;
13+
this.username = username;
14+
this.newCommitCount = newCommitCount;
1515
}
16-
1716
}
Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,32 @@
11
package cmf.commitField.domain.commit.scheduler;
22

3+
import cmf.commitField.domain.pet.service.PetService;
4+
import cmf.commitField.domain.user.service.UserService;
5+
import lombok.RequiredArgsConstructor;
36
import org.springframework.context.event.EventListener;
4-
import org.springframework.stereotype.Service;
7+
import org.springframework.stereotype.Component;
58

6-
@Service
9+
@Component
10+
@RequiredArgsConstructor
711
public class CommitUpdateListener {
12+
private final UserService userService;
13+
private final PetService petService;
14+
private final CommitUpdateService commitUpdateService;
815

916
@EventListener
1017
public void handleCommitUpdateEvent(CommitUpdateEvent event) {
18+
String username = event.getUsername();
19+
long commitCount = event.getNewCommitCount();
20+
21+
System.out.println("유저 시즌 경험치 업데이트: " + event.getUsername());
1122
// 이벤트 처리 로직
12-
Long userId = event.getUserId();
13-
int commitCount = event.getCommitCount();
23+
boolean levelUp = userService.getExpUser(username,commitCount);
24+
petService.getExpPet(username,commitCount);
25+
if(levelUp) commitUpdateService.updateUserTier(username);
1426

27+
// 모든 작업이 끝났다면
28+
userService.updateUserCommitCount(username, commitCount);
1529
// 커밋 갱신 후에 다른 서비스에서 필요한 작업 수행 (예: DB 업데이트, 상태 갱신 등)
16-
System.out.println("User ID: " + userId + " has updated " + commitCount + " commits.");
30+
System.out.println("유저명: " + username + " has updated " + commitCount + " commits.");
1731
}
1832
}

src/main/java/cmf/commitField/domain/commit/scheduler/CommitUpdateService.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import cmf.commitField.domain.user.entity.User;
77
import cmf.commitField.domain.user.repository.UserRepository;
88
import lombok.RequiredArgsConstructor;
9-
import org.springframework.context.ApplicationEventPublisher;
109
import org.springframework.stereotype.Service;
1110

1211
import java.time.LocalDateTime;
@@ -18,13 +17,10 @@ public class CommitUpdateService {
1817
private final UserRepository userRepository;
1918
private final PetService petService;
2019

21-
private final ApplicationEventPublisher eventPublisher;
22-
2320
public UserInfoDto updateUserTier(String username){
2421
User user = userRepository.findByUsername(username).get();
2522
long seasonCommitCount;
26-
// seasonCommitCount = totalCommitService.getSeasonCommits(user.getUsername(), LocalDateTime.of(2024,12,01,0,0), LocalDateTime.of(2025,2,28,23,59)).getTotalCommitContributions();
27-
seasonCommitCount = totalCommitService.getSeasonCommits(user.getUsername(), LocalDateTime.of(2025,03,01,0,0), LocalDateTime.of(2025,05,31,23,59)).getTotalCommitContributions();
23+
seasonCommitCount = totalCommitService.getSeasonCommits(user.getUsername(), LocalDateTime.of(2025,03,01,0,0), LocalDateTime.of(2025,05,31,23,59)).getTotalCommitContributions();
2824
user.setTier(User.Tier.getLevelByExp((int)seasonCommitCount));
2925
userRepository.save(user);
3026

src/main/java/cmf/commitField/domain/pet/entity/Pet.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public class Pet extends BaseEntity {
2222
private int type; // 펫 타입 넘버, 현재 0~2까지 존재
2323
private String name;
2424
private String imageUrl;
25-
private int exp; // 펫 경험치
25+
private long exp; // 펫 경험치
2626

2727
@Enumerated(EnumType.STRING) // DB에 저장될 때 String 형태로 저장됨
2828
private PetGrow grow; // 성장 정도
@@ -48,9 +48,8 @@ public Pet(String name, User user){
4848
@JoinColumn(name = "user_id", nullable = false)
4949
private User user;
5050

51-
public int addExp(int commit){
51+
public long addExp(long commit){
5252
exp+=commit;
53-
5453
return exp;
5554
}
5655
}

src/main/java/cmf/commitField/domain/pet/service/PetService.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import cmf.commitField.global.aws.s3.S3Service;
1010
import lombok.RequiredArgsConstructor;
1111
import org.springframework.stereotype.Service;
12+
import org.springframework.transaction.annotation.Transactional;
1213
import org.springframework.web.multipart.MultipartFile;
1314

1415
import java.io.IOException;
@@ -53,7 +54,8 @@ public void deletePet(Long petId) {
5354
}
5455

5556
// 펫 성장
56-
public UserPetDto getExpPet(String username, int commitCount) {
57+
@Transactional
58+
public UserPetDto getExpPet(String username, long commitCount) {
5759
User user = userRepository.findByUsername(username).get();
5860
Pet pet = user.getPets().get(0);
5961
pet.addExp(commitCount); // 경험치 증가

src/main/java/cmf/commitField/domain/user/dto/UserInfoDto.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public class UserInfoDto {
1717
private long commitCount;
1818

1919
private int petType;
20-
private int petExp;
20+
private long petExp;
2121
private String petGrow;
2222
private String tier;
2323

src/main/java/cmf/commitField/domain/user/entity/User.java

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ public class User extends BaseEntity {
3131
private String avatarUrl; //아바타
3232
private Boolean status; //로그인 true, 로그아웃 false
3333
private LocalDateTime lastCommitted; // 마지막 커밋 시간
34-
private long commitCount;
34+
private long commitCount; // 전체
35+
private long seasonCommitCount; // 이번 시즌
3536

3637
@Enumerated(EnumType.STRING) // 권한
3738
private Role role;
@@ -50,18 +51,18 @@ public enum Tier {
5051
FRUIT(283), // 열매
5152
TREE(377); // 나무
5253

53-
private final int requiredExp;
54+
private final long requiredExp;
5455

55-
Tier(int requiredExp) {
56+
Tier(long requiredExp) {
5657
this.requiredExp = requiredExp;
5758
}
5859

59-
public int getRequiredExp() {
60+
public long getRequiredExp() {
6061
return requiredExp;
6162
}
6263

6364
// 현재 경험치에 맞는 레벨 찾기
64-
public static Tier getLevelByExp(int exp) {
65+
public static Tier getLevelByExp(long exp) {
6566
Tier currentLevel = SEED;
6667
for (Tier level : values()) {
6768
if (exp >= level.getRequiredExp()) {
@@ -106,9 +107,18 @@ public User(String username, String email, String nickname, String avatarUrl, Bo
106107
this.chatMsgs = cmsg;
107108
this.lastCommitted = LocalDateTime.now();
108109
this.commitCount = 0;
110+
this.seasonCommitCount = 0;
109111
}
110112

111113
public void addPets(Pet pet){
112114
pets.add(pet);
113115
}
116+
117+
public void addExp(long commitCount){
118+
this.seasonCommitCount+=commitCount;
119+
}
120+
121+
public void addCommitCount(long commitCount){
122+
this.commitCount+=commitCount;
123+
}
114124
}

src/main/java/cmf/commitField/domain/user/service/CustomOAuth2UserService.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -75,15 +75,19 @@ public OAuth2User loadUser(OAuth2UserRequest userRequest) {
7575
pet = new Pet("알알", user); // TODO: 변경 필요
7676
petRepository.save(pet);
7777

78-
// 유저 펫, 커밋 카운트, 랭크를 서렂ㅇ
78+
// 유저 펫, 커밋 카운트, 랭크를 설정
7979
user.addPets(pet);
8080
user.setCommitCount(totalCommitService.getTotalCommitCount(user.getUsername()).getTotalCommitContributions());
81-
user.setTier(User.Tier.getLevelByExp((int) totalCommitService.getSeasonCommits(
81+
82+
long seasonCommitCount = totalCommitService.getSeasonCommits(
8283
user.getUsername(),
8384
LocalDateTime.of(2025,03,01,00,00),
84-
LocalDateTime.now()).getTotalCommitContributions()
85-
)
86-
);
85+
LocalDateTime.of(2025,05,31,23,59)
86+
).getTotalCommitContributions();
87+
88+
user.setSeasonCommitCount(seasonCommitCount);
89+
90+
user.setTier(User.Tier.getLevelByExp(seasonCommitCount));
8791

8892
// 로그인하거나 회원가입한 유저는 커밋 기록에 상관없이 Redis에 입력해둔다.
8993
commitCacheService.updateCachedCommitCount(user.getUsername(),0);

src/main/java/cmf/commitField/domain/user/service/UserService.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ public UserInfoDto showUserInfo(String username) {
4242
// 유저 정보 조회 후 변경사항은 업데이트
4343
// TODO: 스케쥴러 수정 후 펫 부분 수정 필요
4444
user.setCommitCount(totalCommit);
45-
commitUpdateService.updateUserTier(user.getUsername());
46-
petService.getExpPet(user.getUsername(), 0);
45+
// commitUpdateService.updateUserTier(user.getUsername());
46+
// petService.getExpPet(user.getUsername(), 0);
4747

4848
String key = "commit_active:" + user.getUsername();
4949
if(redisTemplate.opsForValue().get(key)==null){
@@ -64,4 +64,21 @@ public UserInfoDto showUserInfo(String username) {
6464
.petGrow(pet.getGrow().toString())
6565
.build();
6666
}
67+
68+
// 유저 성장
69+
@Transactional
70+
public boolean getExpUser(String username, long commitCount) {
71+
User user = userRepository.findByUsername(username).get();
72+
73+
// 경험치 증가 후, 만약 레벨업한다면 레벨업 시킨다.
74+
user.addExp(commitCount);
75+
76+
return !(user.getTier().equals(User.Tier.getLevelByExp(user.getSeasonCommitCount())));
77+
}
78+
79+
public void updateUserCommitCount(String username, long count){
80+
User user = userRepository.findByUsername(username).get();
81+
user.addCommitCount(count);
82+
userRepository.save(user);
83+
}
6784
}

src/main/java/cmf/commitField/global/security/SecurityConfig.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,8 @@ protected SecurityFilterChain config(HttpSecurity http) throws Exception {
7272
OAuth2User principal = oauth2Token.getPrincipal();
7373
String username = principal.getAttribute("login");
7474

75-
redisTemplate.delete("commit_active:" + username); // Redis에서 삭제
76-
redisTemplate.delete("commit_lastCommitted:" + username); // Redis에서 삭제
75+
//레디스에서 정보 삭제
76+
removeUserActive(username);
7777

7878
System.out.println("로그아웃 성공");
7979
response.setStatus(HttpServletResponse.SC_OK);
@@ -101,5 +101,6 @@ public CorsConfigurationSource corsConfigurationSource() {
101101

102102
public void removeUserActive(String username) {
103103
redisTemplate.delete("commit_active:" + username);
104+
redisTemplate.delete("commit_lastCommitted:" + username);
104105
}
105106
}

0 commit comments

Comments
 (0)