Skip to content

Commit b132666

Browse files
authored
feat: MemberStatistic 추가 (#119)
1 parent 63c7c58 commit b132666

File tree

7 files changed

+122
-3
lines changed

7 files changed

+122
-3
lines changed

backend/src/main/java/com/back/domain/member/controller/ApiV1MemberController.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,4 +326,19 @@ public ResponseEntity<ApiResponse<MemberDto>> obtainTitle(
326326
)
327327
);
328328
}
329+
330+
@GetMapping("/me/statistic")
331+
@Operation(summary = "회원 통계 확인", description = "클리어한 미션 카운트")
332+
public ResponseEntity<ApiResponse<StatisticDto>> meStatistic() {
333+
Member actor = rq.getActorFromDb();
334+
335+
return ResponseEntity
336+
.status(HttpStatus.OK)
337+
.body(new ApiResponse<>(
338+
"200",
339+
"[Member] Success: 사용자 통계 확인 (%s)".formatted(actor.getEmail()),
340+
new StatisticDto(actor.getStatistic())
341+
)
342+
);
343+
}
329344
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.back.domain.member.dto;
2+
3+
import com.back.domain.member.entity.MemberStatistic;
4+
5+
public record StatisticDto(
6+
int countDaily,
7+
int countWeekly,
8+
int countChallenge
9+
) {
10+
public StatisticDto(MemberStatistic statistic) {
11+
this(
12+
statistic.getCountDaily(),
13+
statistic.getCountWeekly(),
14+
statistic.getCountChallenge()
15+
);
16+
}
17+
}

backend/src/main/java/com/back/domain/member/entity/Member.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ public class Member extends BaseEntity {
5252
private MemberRole role = MemberRole.USER;
5353
private String apiKey = null;
5454
private String socialAccessToken = null;
55+
@OneToOne(cascade = CascadeType.ALL)
56+
private MemberStatistic statistic;
5557

5658
//생성자(회원 가입)
5759
public Member(String email, String password, String name) {
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.back.domain.member.entity;
2+
3+
import com.back.global.jpa.entity.BaseEntity;
4+
import jakarta.persistence.Entity;
5+
import jakarta.persistence.OneToOne;
6+
import lombok.*;
7+
8+
@Entity
9+
@Getter
10+
@Setter
11+
@NoArgsConstructor
12+
@AllArgsConstructor
13+
public class MemberStatistic extends BaseEntity {
14+
@OneToOne
15+
private Member member;
16+
17+
private int countDaily = 0;
18+
private int countWeekly = 0;
19+
private int countChallenge = 0;
20+
21+
public MemberStatistic(Member member) {
22+
this.member = member;
23+
}
24+
25+
public void clearDaily() {
26+
this.countDaily++;
27+
}
28+
29+
public void clearWeekly() {
30+
this.countWeekly++;
31+
}
32+
33+
public void clearChallenge() {
34+
this.countChallenge++;
35+
}
36+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.back.domain.member.repository;
2+
3+
import com.back.domain.member.entity.MemberStatistic;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
6+
public interface MemberStatisticRepository extends JpaRepository<MemberStatistic, Integer> {
7+
8+
}

backend/src/main/java/com/back/domain/member/service/MemberService.java

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.back.domain.item.repository.ItemRepository;
66
import com.back.domain.member.entity.Member;
77
import com.back.domain.member.entity.MemberGender;
8+
import com.back.domain.member.entity.MemberStatistic;
89
import com.back.domain.member.repository.MemberRepository;
910
import com.back.domain.title.entity.Title;
1011
import com.back.domain.title.repository.TitleRepository;
@@ -26,6 +27,7 @@
2627
public class MemberService {
2728
private final PasswordEncoder passwordEncoder;
2829
private final AuthService authService;
30+
private final MemberStatisticService memberStatisticService;
2931
private final MemberRepository memberRepository;
3032
private final ItemRepository itemRepository;
3133
private final TitleRepository titleRepository;
@@ -39,6 +41,8 @@ public Member signup(String email, String password, String name) {
3941

4042
password = passwordEncoder.encode(password);
4143
Member member = new Member(email, password, name);
44+
MemberStatistic memberStatistic = memberStatisticService.create(member);
45+
member.setStatistic(memberStatistic);
4246

4347
return memberRepository.save(member);
4448
}
@@ -87,6 +91,7 @@ public void genCode(Member member) {
8791

8892
//회원 탈퇴
8993
public void delete(Member member) {
94+
memberStatisticService.delete(member);
9095
memberRepository.delete(member);
9196
}
9297

@@ -135,11 +140,20 @@ public void unequipTitle(Member member) {
135140
member.setTitle(null);
136141
}
137142

138-
// *** Modify 메서드 ***
139-
public void modifyPassword(Member member, String password) {
140-
member.setPassword(passwordEncoder.encode(password));
143+
// *** 미션 클리어 카운트 ***
144+
public void clearDaily(Member member) {
145+
member.getStatistic().clearDaily();
146+
}
147+
148+
public void clearWeekly(Member member) {
149+
member.getStatistic().clearWeekly();
141150
}
142151

152+
public void clearChallenge(Member member) {
153+
member.getStatistic().clearChallenge();
154+
}
155+
156+
// *** Modify 메서드 ***
143157
public void modifyProfile(Member member, String name, LocalDate age, MemberGender gender) {
144158
member.setName(name);
145159
member.setBirth(age);
@@ -152,6 +166,10 @@ public void modifyStatus(Member member, int level, int xp, int money) {
152166
member.setMoney(money);
153167
}
154168

169+
// public void modifyPassword(Member member, String password) {
170+
// member.setPassword(passwordEncoder.encode(password));
171+
// }
172+
155173
// *** Find 메서드 ***
156174
public Optional<Member> findById(int id) {
157175
return memberRepository.findById(id);
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.back.domain.member.service;
2+
3+
import com.back.domain.member.entity.Member;
4+
import com.back.domain.member.entity.MemberStatistic;
5+
import com.back.domain.member.repository.MemberStatisticRepository;
6+
import lombok.RequiredArgsConstructor;
7+
import org.springframework.stereotype.Service;
8+
import org.springframework.transaction.annotation.Transactional;
9+
10+
@Service
11+
@RequiredArgsConstructor
12+
@Transactional
13+
public class MemberStatisticService {
14+
private final MemberStatisticRepository memberStatisticRepository;
15+
16+
public MemberStatistic create(Member member) {
17+
return memberStatisticRepository.save(new MemberStatistic(member));
18+
}
19+
20+
public void delete(Member member) {
21+
memberStatisticRepository.delete(member.getStatistic());
22+
}
23+
}

0 commit comments

Comments
 (0)