From 19c5944f198257b765a27caf52553c5942af1a3a Mon Sep 17 00:00:00 2001 From: Jeyong Date: Mon, 14 Apr 2025 22:59:38 +0900 Subject: [PATCH 1/4] =?UTF-8?q?[refactor]=20Record=20StartTime=EC=97=90?= =?UTF-8?q?=EC=84=9C=20@CreateDate=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weakness/domain/Record/entity/ActivityRecord.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Record/entity/ActivityRecord.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Record/entity/ActivityRecord.java index cbc1d81..4312443 100644 --- a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Record/entity/ActivityRecord.java +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Record/entity/ActivityRecord.java @@ -8,7 +8,6 @@ import jakarta.persistence.*; import lombok.*; import org.hibernate.validator.constraints.Range; -import org.springframework.data.annotation.CreatedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; import java.time.DayOfWeek; @@ -32,7 +31,6 @@ public class ActivityRecord { @JoinColumn(name = "group_id") private Group group; - @CreatedDate private LocalDateTime startTime; // 인증 시작 시간 private LocalDateTime endTime; // 인증 종료 시간 From 08193f8c7602629ee0144b9868f63733845b9d5b Mon Sep 17 00:00:00 2001 From: Jeyong Date: Wed, 16 Apr 2025 14:42:37 +0900 Subject: [PATCH 2/4] =?UTF-8?q?[feat]=20Chat=20=EB=8F=84=EB=A9=94=EC=9D=B8?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weakness/domain/Chat/entity/Chat.java | 33 +++++++++++++++++++ .../weakness/domain/Chat/enums/ChatRole.java | 6 ++++ .../Chat/repository/ChatRepository.java | 9 +++++ 3 files changed, 48 insertions(+) create mode 100644 MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Chat/entity/Chat.java create mode 100644 MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Chat/enums/ChatRole.java create mode 100644 MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Chat/repository/ChatRepository.java diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Chat/entity/Chat.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Chat/entity/Chat.java new file mode 100644 index 0000000..63e71c5 --- /dev/null +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Chat/entity/Chat.java @@ -0,0 +1,33 @@ +package MathCaptain.weakness.domain.Chat.entity; + +import MathCaptain.weakness.domain.Chat.enums.ChatRole; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import java.time.LocalDateTime; + +@Getter +@Entity +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@EntityListeners(AuditingEntityListener.class) +public class Chat { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private Long userId; + + @Enumerated(EnumType.STRING) + private ChatRole role; + + private String message; + + @CreatedDate + @Column(updatable = false) + private LocalDateTime sendTime; +} diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Chat/enums/ChatRole.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Chat/enums/ChatRole.java new file mode 100644 index 0000000..ae9ea9b --- /dev/null +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Chat/enums/ChatRole.java @@ -0,0 +1,6 @@ +package MathCaptain.weakness.domain.Chat.enums; + +public enum ChatRole { + USER, + ASSISTANT +} diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Chat/repository/ChatRepository.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Chat/repository/ChatRepository.java new file mode 100644 index 0000000..e996a51 --- /dev/null +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Chat/repository/ChatRepository.java @@ -0,0 +1,9 @@ +package MathCaptain.weakness.domain.Chat.repository; + +import MathCaptain.weakness.domain.Chat.entity.Chat; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ChatRepository extends JpaRepository { +} From 33acdc7b8606ade3f89beecb3f4c953bbd961ae0 Mon Sep 17 00:00:00 2001 From: Jeyong Date: Wed, 16 Apr 2025 14:44:01 +0900 Subject: [PATCH 3/4] =?UTF-8?q?[fix]=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?=EB=B0=8F=20=EC=82=AC=EC=9A=A9=EC=9E=90=20id=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/request/FitnessLogEnrollRequest.java | 5 +++++ .../Record/entity/UserLog/ExerciseInfo.java | 5 +++++ .../Record/entity/UserLog/FitnessDetail.java | 19 ++++++++++++++++--- .../Record/entity/UserLog/RunningDetail.java | 13 +++++++++++-- .../Record/entity/UserLog/StudyDetail.java | 13 +++++++++++-- .../Record/service/ActivityDetailService.java | 17 +++-------------- .../domain/Record/service/RecordService.java | 15 +++++++++------ 7 files changed, 60 insertions(+), 27 deletions(-) diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Record/dto/request/FitnessLogEnrollRequest.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Record/dto/request/FitnessLogEnrollRequest.java index 52fd389..70901d0 100644 --- a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Record/dto/request/FitnessLogEnrollRequest.java +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Record/dto/request/FitnessLogEnrollRequest.java @@ -1,6 +1,7 @@ package MathCaptain.weakness.domain.Record.dto.request; import MathCaptain.weakness.domain.Record.entity.UserLog.ExerciseInfo; +import jakarta.validation.constraints.NotNull; import lombok.Getter; import lombok.NoArgsConstructor; @@ -11,11 +12,15 @@ @NoArgsConstructor public class FitnessLogEnrollRequest extends ActivityLogEnrollRequest { + @NotNull private Long activityTime; + @NotNull private LocalDateTime startTime; + @NotNull private LocalDateTime endTime; + @NotNull private List exerciseInfoList; } diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Record/entity/UserLog/ExerciseInfo.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Record/entity/UserLog/ExerciseInfo.java index 56b0181..adef5cf 100644 --- a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Record/entity/UserLog/ExerciseInfo.java +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Record/entity/UserLog/ExerciseInfo.java @@ -1,5 +1,6 @@ package MathCaptain.weakness.domain.Record.entity.UserLog; +import jakarta.persistence.Column; import jakarta.persistence.Embeddable; import lombok.Getter; import lombok.NoArgsConstructor; @@ -9,12 +10,16 @@ @NoArgsConstructor public class ExerciseInfo { + @Column(nullable = false) private String exerciseName; + @Column(nullable = false) private int weight; + @Column(nullable = false) private int reps; + @Column(nullable = false) private int sets; private ExerciseInfo(String exerciseName, int weight, int reps, int sets) { diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Record/entity/UserLog/FitnessDetail.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Record/entity/UserLog/FitnessDetail.java index c9995da..bfd1d8d 100644 --- a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Record/entity/UserLog/FitnessDetail.java +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Record/entity/UserLog/FitnessDetail.java @@ -12,13 +12,17 @@ @Entity @Getter @NoArgsConstructor +@Table(name = "fitness_detail") public class FitnessDetail { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @Column(nullable = false, unique = true) + @Column(nullable = false) + private Long userId; + + @Column(nullable = false) private Long activityId; private Long duration; @@ -26,16 +30,25 @@ public class FitnessDetail { private LocalDate date; @ElementCollection + @CollectionTable( + name = "fitnessdetail_exerciseinfolist", + joinColumns = @JoinColumn(name = "fitness detail_id") + ) private List exerciseInfoList; - private FitnessDetail(Long activityId, Long duration, LocalDate date, List exerciseInfoList) { + private FitnessDetail(Long activityId, Long userId, Long duration, LocalDate date, List exerciseInfoList) { this.activityId = activityId; + this.userId = userId; this.duration = duration; this.date = date; this.exerciseInfoList = exerciseInfoList; } public static FitnessDetail of(ActivityRecord record, FitnessLogEnrollRequest request) { - return new FitnessDetail(record.getId(), record.getDurationInMinutes(), record.getEndTime().toLocalDate(), request.getExerciseInfoList()); + return new FitnessDetail(record.getId(), record.getUser().getUserId(), record.getDurationInMinutes(), record.getEndTime().toLocalDate(), request.getExerciseInfoList()); + } + + public static FitnessDetail of(ActivityRecord record, List exerciseInfoList) { + return new FitnessDetail(record.getId(), record.getUser().getUserId(), record.getDurationInMinutes(), record.getEndTime().toLocalDate(), exerciseInfoList); } } diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Record/entity/UserLog/RunningDetail.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Record/entity/UserLog/RunningDetail.java index 09d9f8c..df95e60 100644 --- a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Record/entity/UserLog/RunningDetail.java +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Record/entity/UserLog/RunningDetail.java @@ -11,12 +11,16 @@ @Entity @Getter @NoArgsConstructor +@Table(name = "running_detail") public class RunningDetail { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + @Column(nullable = false) + private Long userId; + @Column(nullable = false, unique = true) private Long activityId; @@ -28,8 +32,9 @@ public class RunningDetail { private String memo; - private RunningDetail(Long activityId, Long duration, Long distance, LocalDate date, String memo) { + private RunningDetail(Long activityId, Long userId, Long duration, Long distance, LocalDate date, String memo) { this.activityId = activityId; + this.userId = userId; this.duration = duration; this.distance = distance; this.date = date; @@ -37,6 +42,10 @@ private RunningDetail(Long activityId, Long duration, Long distance, LocalDate d } public static RunningDetail of(ActivityRecord record, RunningLogEnrollRequest request) { - return new RunningDetail(record.getId(), record.getDurationInMinutes(), request.getDistance(), record.getEndTime().toLocalDate() ,request.getMemo()); + return new RunningDetail(record.getId(), record.getUser().getUserId(), record.getDurationInMinutes(), request.getDistance(), record.getEndTime().toLocalDate() ,request.getMemo()); + } + + public static RunningDetail of(ActivityRecord record, Long distance, String memo) { + return new RunningDetail(record.getId(), record.getUser().getUserId(), record.getDurationInMinutes(), distance, record.getEndTime().toLocalDate(), memo); } } diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Record/entity/UserLog/StudyDetail.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Record/entity/UserLog/StudyDetail.java index c35947d..c39d3d0 100644 --- a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Record/entity/UserLog/StudyDetail.java +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Record/entity/UserLog/StudyDetail.java @@ -11,12 +11,16 @@ @Entity @Getter @NoArgsConstructor +@Table(name = "study_detail") public class StudyDetail { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + @Column(nullable = false) + private Long userId; + @Column(nullable = false, unique = true) private Long activityId; @@ -28,8 +32,9 @@ public class StudyDetail { private String memo; - private StudyDetail(Long activityId, String subject, Long duration, LocalDate date, String memo) { + private StudyDetail(Long activityId, Long userId, String subject, Long duration, LocalDate date, String memo) { this.activityId = activityId; + this.userId = userId; this.subject = subject; this.duration = duration; this.date = date; @@ -37,6 +42,10 @@ private StudyDetail(Long activityId, String subject, Long duration, LocalDate da } public static StudyDetail of(ActivityRecord record, StudyLogEnrollRequest request) { - return new StudyDetail(record.getId(), request.getSubject(), record.getDurationInMinutes(), record.getEndTime().toLocalDate(),request.getMemo()); + return new StudyDetail(record.getId(), record.getUser().getUserId(), request.getSubject(), record.getDurationInMinutes(), record.getEndTime().toLocalDate(),request.getMemo()); + } + + public static StudyDetail of(ActivityRecord record, String subject, Long duration, String memo) { + return new StudyDetail(record.getId(), record.getUser().getUserId(), subject, duration, record.getEndTime().toLocalDate(), memo); } } diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Record/service/ActivityDetailService.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Record/service/ActivityDetailService.java index 161dc6e..8d97ad4 100644 --- a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Record/service/ActivityDetailService.java +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Record/service/ActivityDetailService.java @@ -26,27 +26,23 @@ public class ActivityDetailService { private final FitnessLogRepository fitnessLogRepository; private final StudyLogRepository studyLogRepository; private final RunningLogRepository runningLogRepository; - private final RecordRepository recordRepository; @Transactional - public FitnessLogResponse enrollFitnessLog(Long activityId, FitnessLogEnrollRequest request) { - ActivityRecord record = findRecordBy(activityId); + public FitnessLogResponse enrollFitnessLog(ActivityRecord record, FitnessLogEnrollRequest request) {; FitnessDetail fitnessDetail = FitnessDetail.of(record, request); fitnessLogRepository.save(fitnessDetail); return FitnessLogResponse.of(fitnessDetail); } @Transactional - public RunningLogResponse enrollRunningLog(Long activityId, RunningLogEnrollRequest request) { - ActivityRecord record = findRecordBy(activityId); + public RunningLogResponse enrollRunningLog(ActivityRecord record, RunningLogEnrollRequest request) { RunningDetail runningDetail = RunningDetail.of(record, request); runningLogRepository.save(runningDetail); return RunningLogResponse.of(runningDetail); } @Transactional - public StudyLogResponse enrollStudyLog(Long activityId, StudyLogEnrollRequest request) { - ActivityRecord record = findRecordBy(activityId); + public StudyLogResponse enrollStudyLog(ActivityRecord record, StudyLogEnrollRequest request) { StudyDetail studyDetail = StudyDetail.of(record, request); studyLogRepository.save(studyDetail); return StudyLogResponse.of(studyDetail); @@ -70,7 +66,6 @@ public RunningLogResponse getRunningLog(Long activityId) { return RunningLogResponse.of(runningDetail); } - /// 로직 private StudyDetail findStudyLogBy(Long activityId) { @@ -88,10 +83,4 @@ private FitnessDetail findFitnessLogBy(Long activityId) { .orElseThrow(() -> new ResourceNotFoundException("해당 기록을 찾을 수 없습니다.")); } - - private ActivityRecord findRecordBy(Long activityId) { - return recordRepository.findById(activityId) - .orElseThrow(() -> new ResourceNotFoundException("해당 기록을 찾을 수 없습니다.")); - } - } diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Record/service/RecordService.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Record/service/RecordService.java index fb3e914..dc69023 100644 --- a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Record/service/RecordService.java +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/domain/Record/service/RecordService.java @@ -46,21 +46,21 @@ public class RecordService { /// 기록 // 기록 저장 + @Transactional public RecordSummaryResponse endActivity(Users user, Long groupId, ActivityLogEnrollRequest logRequest, CategoryStatus activityType) { // 활동 기록 저장 RelationBetweenUserAndGroup relation = findRelationByMemberAndGroup(user, groupId); ActivityRecord record = ActivityRecord.of(relation, logRequest); updateGoalAchieve(relation, record); - Long activityId = recordRepository.save(record).getId(); + recordRepository.save(record); // 활동 로그 저장 및 응답 생성 - return createRecordSummaryResponse(activityType, activityId, logRequest, record, relation); + return createRecordSummaryResponse(activityType, logRequest, record, relation); } private RecordSummaryResponse createRecordSummaryResponse( CategoryStatus activityType, - Long activityId, ActivityLogEnrollRequest logRequest, ActivityRecord record, RelationBetweenUserAndGroup relation) { @@ -71,13 +71,16 @@ private RecordSummaryResponse createRecordSummaryResponse( switch (activityType) { case FITNESS: - fitnessLogResponse = activityDetailService.enrollFitnessLog(activityId, (FitnessLogEnrollRequest) logRequest); + log.info("피트니스 로그 저장 시작"); + fitnessLogResponse = activityDetailService.enrollFitnessLog(record, (FitnessLogEnrollRequest) logRequest); break; case RUNNING: - runningLogResponse = activityDetailService.enrollRunningLog(activityId, (RunningLogEnrollRequest) logRequest); + log.info("러닝 로그 저장 시작"); + runningLogResponse = activityDetailService.enrollRunningLog(record, (RunningLogEnrollRequest) logRequest); break; case STUDY: - studyLogResponse = activityDetailService.enrollStudyLog(activityId, (StudyLogEnrollRequest) logRequest); + log.info("스터디 로그 저장 시작"); + studyLogResponse = activityDetailService.enrollStudyLog(record, (StudyLogEnrollRequest) logRequest); break; default: throw new IllegalArgumentException("지원되지 않는 인증 타입입니다: " + activityType); From 5a9a4381395398a62533923e4f87d01165ce1632 Mon Sep 17 00:00:00 2001 From: Jeyong Date: Wed, 16 Apr 2025 14:44:29 +0900 Subject: [PATCH 4/4] =?UTF-8?q?[fix]=20=EB=8B=A4=EC=A4=91=20DB=20->=20?= =?UTF-8?q?=EB=8B=A8=EC=9D=BC=20DB=20=ED=86=B5=ED=95=A9=20(PostgreDB)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/MathCaptain/weakness/TestInit.java | 97 +++++++++- .../weakness/WeaknessApplication.java | 2 + .../global/config/PrimaryDBConfig.java | 170 +++++++++--------- .../global/config/SecondDBConfig.java | 134 +++++++------- 4 files changed, 246 insertions(+), 157 deletions(-) diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/TestInit.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/TestInit.java index 58a8f1c..cbb613f 100644 --- a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/TestInit.java +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/TestInit.java @@ -7,7 +7,14 @@ import MathCaptain.weakness.domain.Group.repository.GroupRepository; import MathCaptain.weakness.domain.Group.repository.RelationRepository; import MathCaptain.weakness.domain.Record.entity.ActivityRecord; +import MathCaptain.weakness.domain.Record.entity.UserLog.ExerciseInfo; +import MathCaptain.weakness.domain.Record.entity.UserLog.FitnessDetail; +import MathCaptain.weakness.domain.Record.entity.UserLog.RunningDetail; +import MathCaptain.weakness.domain.Record.entity.UserLog.StudyDetail; import MathCaptain.weakness.domain.Record.repository.record.RecordRepository; +import MathCaptain.weakness.domain.Record.repository.userLog.FitnessLogRepository; +import MathCaptain.weakness.domain.Record.repository.userLog.RunningLogRepository; +import MathCaptain.weakness.domain.Record.repository.userLog.StudyLogRepository; import MathCaptain.weakness.domain.Recruitment.dto.request.CreateRecruitmentRequest; import MathCaptain.weakness.domain.Recruitment.entity.Comment; import MathCaptain.weakness.domain.Recruitment.entity.Recruitment; @@ -25,13 +32,15 @@ import org.springframework.transaction.annotation.Transactional; import java.time.DayOfWeek; +import java.time.LocalDate; import java.time.LocalDateTime; +import java.util.List; @Slf4j @Component @RequiredArgsConstructor @Transactional -@DependsOn("primaryEntityManagerFactory") +@DependsOn("entityManagerFactory") public class TestInit { private final UserRepository userRepository; @@ -41,6 +50,9 @@ public class TestInit { private final RecruitmentRepository recruitmentRepository; private final CommentRepository commentRepository; private final RecordRepository recordRepository; + private final FitnessLogRepository fitnessLogRepository; + private final RunningLogRepository runningLogRepository; + private final StudyLogRepository studyLogRepository; @PostConstruct @@ -158,25 +170,53 @@ public void init() { LocalDateTime startOfWeek = LocalDateTime.now().with(java.time.temporal.TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)); // User ID: 4 -> currentProgress: 5 - createActivityRecords(userRepository.findByUserId(4L).orElseThrow(() -> new IllegalArgumentException("해당 유저가 없습니다.")), group3, startOfWeek, 5); + createActivityRecords(userRepository.findByUserId(4L) + .orElseThrow(() -> new IllegalArgumentException("해당 유저가 없습니다.")), + group3, startOfWeek, 5, CategoryStatus.RUNNING, chestList); // User ID: 5 -> currentProgress: 8 - createActivityRecords(userRepository.findByUserId(5L).orElseThrow(() -> new IllegalArgumentException("해당 유저가 없습니다.")), group3, startOfWeek, 8); + createActivityRecords(userRepository.findByUserId(5L) + .orElseThrow(() -> new IllegalArgumentException("해당 유저가 없습니다.")), + group3, startOfWeek, 8, CategoryStatus.RUNNING, chestList); // User ID: 6 -> currentProgress: 10 - createActivityRecords(userRepository.findByUserId(6L).orElseThrow(() -> new IllegalArgumentException("해당 유저가 없습니다.")), group3, startOfWeek, 10); + createActivityRecords(userRepository.findByUserId(6L) + .orElseThrow(() -> new IllegalArgumentException("해당 유저가 없습니다.")), + group3, startOfWeek, 10, CategoryStatus.RUNNING, chestList); // User ID: 7 -> currentProgress: 7 - createActivityRecords(userRepository.findByUserId(7L).orElseThrow(() -> new IllegalArgumentException("해당 유저가 없습니다.")), group3, startOfWeek, 7); + createActivityRecords(userRepository.findByUserId(7L) + .orElseThrow(() -> new IllegalArgumentException("해당 유저가 없습니다.")), + group3, startOfWeek, 7, CategoryStatus.RUNNING, chestList); // User ID: 8 -> currentProgress: 6 - createActivityRecords(userRepository.findByUserId(8L).orElseThrow(() -> new IllegalArgumentException("해당 유저가 없습니다.")), group3, startOfWeek, 6); + createActivityRecords(userRepository.findByUserId(8L) + .orElseThrow(() -> new IllegalArgumentException("해당 유저가 없습니다.")), + group3, startOfWeek, 6, CategoryStatus.RUNNING, chestList); + + createActivityRecords(userRepository.findByUserId(1L) + .orElseThrow(() -> new IllegalArgumentException("해당 유저가 없습니다.")), + group1, startOfWeek, 4, CategoryStatus.FITNESS, chestList); + createActivityRecords(userRepository.findByUserId(1L) + .orElseThrow(() -> new IllegalArgumentException("해당 유저가 없습니다.")), + group1, startOfWeek, 3, CategoryStatus.FITNESS, backList); + createActivityRecords(userRepository.findByUserId(1L) + .orElseThrow(() -> new IllegalArgumentException("해당 유저가 없습니다.")), + group1, startOfWeek, 3, CategoryStatus.FITNESS, legList); + + createActivityRecords(userRepository.findByUserId(2L). + orElseThrow(() -> new IllegalArgumentException("해당 유저가 없습니다.")), + group2, startOfWeek, 3, CategoryStatus.STUDY, chestList); log.info("======== 🏃‍♂️테스트 목표 기록 생성 완료 ========="); } // Helper 메서드: ActivityRecord 생성 (이번 주 내에서만 생성되도록 수정) - private void createActivityRecords(Users user, Group group, LocalDateTime startOfWeek, int recordCount) { + private void createActivityRecords( + Users user, Group group, LocalDateTime startOfWeek, + int recordCount, CategoryStatus category, + List exerciseInfoList + ) { for (int i = 0; i < recordCount; i++) { // 시작 시간은 주어진 startOfWeek에서 i일을 더한 값 LocalDateTime startTime = startOfWeek.plusDays(i % 7); @@ -195,6 +235,49 @@ private void createActivityRecords(Users user, Group group, LocalDateTime startO // 저장소에 저장 recordRepository.save(record); + + if (category == CategoryStatus.FITNESS) { + fitnessLogCreate(record); + } else if (category == CategoryStatus.RUNNING) { + runningLogCreate(record); + } else if (category == CategoryStatus.STUDY) { + studyLogCreate(record); + } } } + + ExerciseInfo chest1 = ExerciseInfo.of("덤벨 프레스", 70, 10, 5); + ExerciseInfo chest2 = ExerciseInfo.of("벤치 프레스", 80, 10, 5); + ExerciseInfo chest3 = ExerciseInfo.of("밀리터리 프레스", 60, 10, 5); + ExerciseInfo chest4 = ExerciseInfo.of("디클라인 벤치 프레스", 70, 10, 5); + List chestList = List.of(chest1, chest2, chest3, chest4); + + ExerciseInfo back1 = ExerciseInfo.of("데드 리프트", 120, 10, 5); + ExerciseInfo back2 = ExerciseInfo.of("랫풀다운", 80, 10, 5); + ExerciseInfo back3 = ExerciseInfo.of("시티드 로우", 70, 10, 5); + List backList = List.of(back1, back2, back3); + + ExerciseInfo leg1 = ExerciseInfo.of("스쿼트", 100, 10, 5); + ExerciseInfo leg2 = ExerciseInfo.of("레그 프레스", 150, 10, 5); + ExerciseInfo leg3 = ExerciseInfo.of("레그 익스텐션", 80, 10, 5); + ExerciseInfo leg4 = ExerciseInfo.of("레그 컬", 70, 10, 5); + List legList = List.of(leg1, leg2, leg3, leg4); + + + + private void studyLogCreate(ActivityRecord record) { + StudyDetail log = StudyDetail.of(record, "수학", 60L, "지수함수의 미분"); + studyLogRepository.save(log); + } + + private void runningLogCreate(ActivityRecord record) { + RunningDetail log = RunningDetail.of(record, 5L, "원인재에서 동춘역까지"); + runningLogRepository.save(log); + } + + private void fitnessLogCreate(ActivityRecord record) { + FitnessDetail log = FitnessDetail.of(record, chestList); + fitnessLogRepository.save(log); + } } +// \ No newline at end of file diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/WeaknessApplication.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/WeaknessApplication.java index 7093ed3..517ec3a 100644 --- a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/WeaknessApplication.java +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/WeaknessApplication.java @@ -5,10 +5,12 @@ import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; import org.springframework.context.annotation.ComponentScan; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; +import org.springframework.transaction.annotation.EnableTransactionManagement; @EnableJpaAuditing @SpringBootApplication(exclude = SecurityAutoConfiguration.class) @ComponentScan(basePackages = "MathCaptain") +@EnableTransactionManagement public class WeaknessApplication { public static void main(String[] args) { diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/global/config/PrimaryDBConfig.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/global/config/PrimaryDBConfig.java index 37cab1f..04ba225 100644 --- a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/global/config/PrimaryDBConfig.java +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/global/config/PrimaryDBConfig.java @@ -1,85 +1,85 @@ -package MathCaptain.weakness.global.config; - -import com.zaxxer.hikari.HikariDataSource; -import jakarta.persistence.EntityManagerFactory; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; -import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Primary; -import org.springframework.data.jpa.repository.config.EnableJpaRepositories; -import org.springframework.orm.jpa.JpaTransactionManager; -import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; -import org.springframework.transaction.PlatformTransactionManager; -import org.springframework.transaction.annotation.EnableTransactionManagement; - -import javax.sql.DataSource; -import java.util.HashMap; -import java.util.Map; - -@Configuration -@EnableTransactionManagement -@EnableJpaRepositories( - basePackages = { - "MathCaptain.weakness.domain.User.repository", - "MathCaptain.weakness.domain.Record.repository.record", - "MathCaptain.weakness.domain.Group.repository", - "MathCaptain.weakness.domain.Notification.repository", - "MathCaptain.weakness.domain.Recruitment.repository" - }, - entityManagerFactoryRef = "primaryEntityManagerFactory", - transactionManagerRef = "primaryTransactionManager" -) -public class PrimaryDBConfig { - - @Bean(name = "primaryDataSource") - @Primary - @ConfigurationProperties("spring.datasource.hikari") - public HikariDataSource primaryDataSource(@Qualifier("primaryDataSourceProperties") DataSourceProperties properties) { - return properties.initializeDataSourceBuilder().type(HikariDataSource.class).build(); - } - - @Bean(name = "primaryDataSourceProperties") - @Primary - @ConfigurationProperties("spring.datasource") - public DataSourceProperties primaryDataSourceProperties() { - return new DataSourceProperties(); - } - - @Bean - @Primary - @ConfigurationProperties("spring.jpa") - public JpaProperties primaryJpaProperties() { - return new JpaProperties(); - } - - @Primary - @Bean(name = "primaryEntityManagerFactory") - public LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory( - EntityManagerFactoryBuilder builder, - @Qualifier("primaryDataSource") DataSource dataSource - ) { - Map jpaProperties = new HashMap<>(); - jpaProperties.put("hibernate.hbm2ddl.auto", "create"); - jpaProperties.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect"); - jpaProperties.put("hibernate.format_sql", true); - - return builder - .dataSource(dataSource) - .packages("MathCaptain.weakness.domain") - .properties(jpaProperties) // ⬅️ 이 부분이 핵심 - .persistenceUnit("primary") - .build(); - } - - @Primary - @Bean(name = "primaryTransactionManager") - public PlatformTransactionManager primaryTransactionManager( - @Qualifier("primaryEntityManagerFactory") EntityManagerFactory entityManagerFactory) { - - return new JpaTransactionManager(entityManagerFactory); - } -} \ No newline at end of file +//package MathCaptain.weakness.global.config; +// +//import com.zaxxer.hikari.HikariDataSource; +//import jakarta.persistence.EntityManagerFactory; +//import org.springframework.beans.factory.annotation.Qualifier; +//import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; +//import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties; +//import org.springframework.boot.context.properties.ConfigurationProperties; +//import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder; +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +//import org.springframework.context.annotation.Primary; +//import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +//import org.springframework.orm.jpa.JpaTransactionManager; +//import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +//import org.springframework.transaction.PlatformTransactionManager; +//import org.springframework.transaction.annotation.EnableTransactionManagement; +// +//import javax.sql.DataSource; +//import java.util.HashMap; +//import java.util.Map; +// +//@Configuration +//@EnableTransactionManagement +//@EnableJpaRepositories( +// basePackages = { +// "MathCaptain.weakness.domain.User.repository", +// "MathCaptain.weakness.domain.Record.repository.record", +// "MathCaptain.weakness.domain.Group.repository", +// "MathCaptain.weakness.domain.Notification.repository", +// "MathCaptain.weakness.domain.Recruitment.repository" +// }, +// entityManagerFactoryRef = "primaryEntityManagerFactory", +// transactionManagerRef = "primaryTransactionManager" +//) +//public class PrimaryDBConfig { +// +// @Bean(name = "primaryDataSource") +// @Primary +// @ConfigurationProperties("spring.datasource.hikari") +// public HikariDataSource primaryDataSource(@Qualifier("primaryDataSourceProperties") DataSourceProperties properties) { +// return properties.initializeDataSourceBuilder().type(HikariDataSource.class).build(); +// } +// +// @Bean(name = "primaryDataSourceProperties") +// @Primary +// @ConfigurationProperties("spring.datasource") +// public DataSourceProperties primaryDataSourceProperties() { +// return new DataSourceProperties(); +// } +// +// @Bean +// @Primary +// @ConfigurationProperties("spring.jpa") +// public JpaProperties primaryJpaProperties() { +// return new JpaProperties(); +// } +// +// @Primary +// @Bean(name = "primaryEntityManagerFactory") +// public LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory( +// EntityManagerFactoryBuilder builder, +// @Qualifier("primaryDataSource") DataSource dataSource +// ) { +// Map jpaProperties = new HashMap<>(); +// jpaProperties.put("hibernate.hbm2ddl.auto", "create"); +// jpaProperties.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect"); +// jpaProperties.put("hibernate.format_sql", true); +// +// return builder +// .dataSource(dataSource) +// .packages("MathCaptain.weakness.domain") +// .properties(jpaProperties) +// .persistenceUnit("primary") +// .build(); +// } +// +// @Primary +// @Bean(name = "primaryTransactionManager") +// public PlatformTransactionManager primaryTransactionManager( +// @Qualifier("primaryEntityManagerFactory") EntityManagerFactory entityManagerFactory) { +// +// return new JpaTransactionManager(entityManagerFactory); +// } +//} \ No newline at end of file diff --git a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/global/config/SecondDBConfig.java b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/global/config/SecondDBConfig.java index 3aad619..7a7bbe3 100644 --- a/MathCaptain/weakness/src/main/java/MathCaptain/weakness/global/config/SecondDBConfig.java +++ b/MathCaptain/weakness/src/main/java/MathCaptain/weakness/global/config/SecondDBConfig.java @@ -1,65 +1,69 @@ -package MathCaptain.weakness.global.config; - -import javax.sql.DataSource; -import jakarta.persistence.EntityManagerFactory; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.jpa.repository.config.EnableJpaRepositories; -import org.springframework.orm.jpa.JpaTransactionManager; -import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; -import org.springframework.transaction.PlatformTransactionManager; -import org.springframework.transaction.annotation.EnableTransactionManagement; - -import java.util.HashMap; -import java.util.Map; - -@Configuration -@EnableTransactionManagement -@EnableJpaRepositories( - basePackages = "MathCaptain.weakness.domain.Record.repository.userLog", // 새 DB를 쓰는 Repository 위치 - entityManagerFactoryRef = "secondEntityManagerFactory", - transactionManagerRef = "secondTransactionManager" -) -public class SecondDBConfig { - - // DataSourceProperties는 application.yml에 설정된 DB 정보를 읽어옴 - @Bean(name = "secondDataSourceProperties") - @ConfigurationProperties(prefix = "second.datasource") - public DataSourceProperties secondDataSourceProperties() { - return new DataSourceProperties(); - } - - // DataSource는 DataSourceProperties를 통해 DB에 연결하는 객체 - @Bean(name = "secondDataSource") - public DataSource secondDataSource() { - return secondDataSourceProperties().initializeDataSourceBuilder().build(); - } - - // EntityManagerFactory는 JPA에서 DB와의 연결을 관리하는 객체 - @Bean(name = "secondEntityManagerFactory") - public LocalContainerEntityManagerFactoryBean secondEntityManagerFactory( - EntityManagerFactoryBuilder builder) { - Map props = new HashMap<>(); - props.put("hibernate.hbm2ddl.auto", "update"); - props.put("hibernate.format_sql", true); - props.put("hibernate.jdbc.lob.non_contextual_creation", true); - - return builder - .dataSource(secondDataSource()) - .packages("MathCaptain.weakness.domain.Record.entity.UserLog") // entity 위치 - .properties(props) - .persistenceUnit("second") - .build(); - } - - // TransactionManager는 DB 트랜잭션을 관리하는 객체 - @Bean(name = "secondTransactionManager") - public PlatformTransactionManager secondTransactionManager( - @Qualifier("secondEntityManagerFactory") EntityManagerFactory factory) { - return new JpaTransactionManager(factory); - } -} +//package MathCaptain.weakness.global.config; +// +//import javax.sql.DataSource; +//import jakarta.persistence.EntityManagerFactory; +//import org.springframework.beans.factory.annotation.Qualifier; +//import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; +//import org.springframework.boot.context.properties.ConfigurationProperties; +//import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder; +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +//import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +//import org.springframework.orm.jpa.JpaTransactionManager; +//import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +//import org.springframework.transaction.PlatformTransactionManager; +//import org.springframework.transaction.annotation.EnableTransactionManagement; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Configuration +//@EnableTransactionManagement +//@EnableJpaRepositories( +// basePackages = { +// "MathCaptain.weakness.domain.Record.repository.userLog", +// "MathCaptain.weakness.domain.Chat.repository", +// }, +// entityManagerFactoryRef = "secondEntityManagerFactory", +// transactionManagerRef = "secondTransactionManager" +//) +//public class SecondDBConfig { +// +// // DataSourceProperties는 application.yml에 설정된 DB 정보를 읽어옴 +// @Bean(name = "secondDataSourceProperties") +// @ConfigurationProperties(prefix = "second.datasource") +// public DataSourceProperties secondDataSourceProperties() { +// return new DataSourceProperties(); +// } +// +// // DataSource는 DataSourceProperties를 통해 DB에 연결하는 객체 +// @Bean(name = "secondDataSource") +// public DataSource secondDataSource() { +// return secondDataSourceProperties().initializeDataSourceBuilder().build(); +// } +// +// // EntityManagerFactory는 JPA에서 DB와의 연결을 관리하는 객체 +// @Bean(name = "secondEntityManagerFactory") +// public LocalContainerEntityManagerFactoryBean secondEntityManagerFactory( +// EntityManagerFactoryBuilder builder) { +// Map props = new HashMap<>(); +// props.put("hibernate.hbm2ddl.auto", "update"); +// props.put("show_sql", true); +// props.put("hibernate.format_sql", true); +// props.put("hibernate.jdbc.lob.non_contextual_creation", true); +// +// return builder +// .dataSource(secondDataSource()) +// .packages("MathCaptain.weakness.domain.Record.entity.UserLog", "MathCaptain.weakness.domain.Chat.entity") // entity 위치 +// .properties(props) +// .persistenceUnit("second") +// .build(); +// } +// +// // TransactionManager는 DB 트랜잭션을 관리하는 객체 +// @Bean(name = "secondTransactionManager") +// public PlatformTransactionManager secondTransactionManager( +// @Qualifier("secondEntityManagerFactory") EntityManagerFactory factory) { +// return new JpaTransactionManager(factory); +// } +//}