From 0399c913f613e54356a2c480c2fef7fd88d177d7 Mon Sep 17 00:00:00 2001 From: donghyunkim Date: Sat, 6 Jul 2024 16:25:03 +0900 Subject: [PATCH 01/20] =?UTF-8?q?fix:=20ProfileService=EC=9D=98=20default?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=EC=97=90=20@Transactional=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/demo/service/profile/ProfileService.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/example/demo/service/profile/ProfileService.java b/src/main/java/com/example/demo/service/profile/ProfileService.java index cd1d095..76c8c1b 100644 --- a/src/main/java/com/example/demo/service/profile/ProfileService.java +++ b/src/main/java/com/example/demo/service/profile/ProfileService.java @@ -2,11 +2,15 @@ import java.time.LocalDateTime; +import org.springframework.transaction.annotation.Transactional; + import com.example.demo.dto.profile.ProfileGetResponse; import com.example.demo.dto.profile.ProfileUpdateRequest; import com.example.demo.dto.profile.ProfileUpdateResponse; public interface ProfileService { + + @Transactional default ProfileGetResponse get(Long requestMemberId, Long targetMemberId) { return get(requestMemberId, targetMemberId, LocalDateTime.now()); } From 4faa4714eb16aff3a87dc9355c953e011d672878 Mon Sep 17 00:00:00 2001 From: donghyunkim Date: Sat, 6 Jul 2024 16:26:37 +0900 Subject: [PATCH 02/20] =?UTF-8?q?feat:=20Cafe=EC=99=80=20BusinessHour?= =?UTF-8?q?=EC=9D=98=20=EC=97=B0=EA=B4=80=EA=B4=80=EA=B3=84=20cascade=20al?= =?UTF-8?q?l,=20orphan=20=EC=84=A4=EC=A0=95=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/demo/domain/cafe/Cafe.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/demo/domain/cafe/Cafe.java b/src/main/java/com/example/demo/domain/cafe/Cafe.java index 45d63ff..61d4004 100644 --- a/src/main/java/com/example/demo/domain/cafe/Cafe.java +++ b/src/main/java/com/example/demo/domain/cafe/Cafe.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.OptionalDouble; +import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Embedded; import javax.persistence.Entity; @@ -54,7 +55,7 @@ public class Cafe { private boolean isAbleToStudy; private int minBeveragePrice; - @OneToMany(mappedBy = "cafe") + @OneToMany(mappedBy = "cafe", cascade = CascadeType.ALL, orphanRemoval = true) @Builder.Default private List businessHours = new ArrayList<>(); @@ -98,4 +99,8 @@ public BusinessHour findBusinessHour(DayOfWeek dayOfWeek) { .findFirst() .orElseThrow(() -> new CafegoryException(CAFE_NOT_FOUND_DAY_OF_WEEK)); } + + public void changeBusinessHours(List businessHours) { + this.businessHours = businessHours; + } } From 47a8555fbf5d095d4d5cc65662f8a5c7c2cef697 Mon Sep 17 00:00:00 2001 From: donghyunkim Date: Sat, 6 Jul 2024 16:27:59 +0900 Subject: [PATCH 03/20] =?UTF-8?q?feat:=20member=EC=9D=98=20thumbnailImage?= =?UTF-8?q?=20cascade=20persist=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/demo/domain/member/Member.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/example/demo/domain/member/Member.java b/src/main/java/com/example/demo/domain/member/Member.java index 9816fd1..b49f048 100644 --- a/src/main/java/com/example/demo/domain/member/Member.java +++ b/src/main/java/com/example/demo/domain/member/Member.java @@ -6,7 +6,6 @@ import java.util.ArrayList; import java.util.List; -import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.ConstraintMode; import javax.persistence.Entity; @@ -45,7 +44,7 @@ public class Member { private String email; private String introduction; - @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST) + @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "thumbnail_image_id", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private ThumbnailImage thumbnailImage; From 4de8dff88e9d4c22c7e8dae16ecd6a1a16c92e92 Mon Sep 17 00:00:00 2001 From: donghyunkim Date: Sat, 6 Jul 2024 16:29:33 +0900 Subject: [PATCH 04/20] =?UTF-8?q?refactor:=20helper=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EB=A0=88=EB=B2=A8=EC=97=90=20@Transactional=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EC=BD=94=EB=93=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/demo/config/TestConfig.java | 10 ++--- .../demo/factory/TestBusinessHourFactory.java | 19 +++++++++ .../example/demo/helper/CafeSaveHelper.java | 40 ++++++++++++++++--- .../example/demo/helper/MemberSaveHelper.java | 11 ++++- .../example/demo/helper/ReviewSaveHelper.java | 11 ++++- .../demo/helper/StudyMemberSaveHelper.java | 11 ++++- .../helper/StudyOnceCommentSaveHelper.java | 24 +++++++++-- .../demo/helper/StudyOnceSaveHelper.java | 16 +++++++- .../demo/helper/ThumbnailImageSaveHelper.java | 3 ++ 9 files changed, 124 insertions(+), 21 deletions(-) diff --git a/src/test/java/com/example/demo/config/TestConfig.java b/src/test/java/com/example/demo/config/TestConfig.java index 5e617bd..867df1a 100644 --- a/src/test/java/com/example/demo/config/TestConfig.java +++ b/src/test/java/com/example/demo/config/TestConfig.java @@ -44,27 +44,27 @@ public CafeSaveHelper cafeSaveHelper() { @Bean public MemberSaveHelper memberSaveHelper() { - return new MemberSaveHelper(memberRepository); + return new MemberSaveHelper(memberRepository, thumbnailImageRepository); } @Bean public ReviewSaveHelper reviewSaveHelper() { - return new ReviewSaveHelper(reviewRepository); + return new ReviewSaveHelper(reviewRepository, cafeRepository, memberRepository); } @Bean public StudyMemberSaveHelper studyMemberSaveHelper() { - return new StudyMemberSaveHelper(studyMemberRepository); + return new StudyMemberSaveHelper(studyMemberRepository, memberRepository, studyOnceRepository); } @Bean public StudyOnceCommentSaveHelper studyOnceCommentSaveHelper() { - return new StudyOnceCommentSaveHelper(studyOnceCommentRepository); + return new StudyOnceCommentSaveHelper(studyOnceCommentRepository, memberRepository, studyOnceRepository); } @Bean public StudyOnceSaveHelper studyOnceSaveHelper() { - return new StudyOnceSaveHelper(studyOnceRepository); + return new StudyOnceSaveHelper(studyOnceRepository, memberRepository, cafeRepository); } @Bean diff --git a/src/test/java/com/example/demo/factory/TestBusinessHourFactory.java b/src/test/java/com/example/demo/factory/TestBusinessHourFactory.java index 0fc3342..e123946 100644 --- a/src/test/java/com/example/demo/factory/TestBusinessHourFactory.java +++ b/src/test/java/com/example/demo/factory/TestBusinessHourFactory.java @@ -15,6 +15,25 @@ public static BusinessHour createBusinessHourWithDayAnd24For7(String day) { .build(); } + public static BusinessHour createBusinessHourWithDayAnd24For7(Cafe cafe, String day) { + return BusinessHour.builder() + .cafe(cafe) + .startTime(LocalTime.MIN) + .endTime(LocalTime.MAX) + .day(day) + .build(); + } + + public static BusinessHour createBusinessHourWithDayAndTime(Cafe cafe, String day, LocalTime startTime, + LocalTime endTime) { + return BusinessHour.builder() + .cafe(cafe) + .startTime(startTime) + .endTime(endTime) + .day(day) + .build(); + } + public static BusinessHour createBusinessHourWithDayAndTime(String day, LocalTime startTime, LocalTime endTime) { return BusinessHour.builder() .startTime(startTime) diff --git a/src/test/java/com/example/demo/helper/CafeSaveHelper.java b/src/test/java/com/example/demo/helper/CafeSaveHelper.java index 3a033f6..09c5dcf 100644 --- a/src/test/java/com/example/demo/helper/CafeSaveHelper.java +++ b/src/test/java/com/example/demo/helper/CafeSaveHelper.java @@ -1,8 +1,13 @@ package com.example.demo.helper; +import static com.example.demo.factory.TestBusinessHourFactory.*; + +import java.time.LocalTime; import java.util.ArrayList; import java.util.List; +import org.springframework.transaction.annotation.Transactional; + import com.example.demo.domain.cafe.BusinessHour; import com.example.demo.domain.cafe.Cafe; import com.example.demo.factory.TestBusinessHourFactory; @@ -12,6 +17,7 @@ import lombok.RequiredArgsConstructor; @RequiredArgsConstructor +@Transactional public class CafeSaveHelper { private final CafeRepository cafeRepository; @@ -26,20 +32,42 @@ public Cafe saveCafeWithBusinessHour(List businessHours) { return cafeRepository.save(cafe); } - public Cafe saveCafeWith24For7() { - List businessHours = makeBusinessHourWith24For7(); - Cafe cafe = TestCafeFactory.createCafeWithBusinessHours(businessHours); + public Cafe saveCafeWith7daysFrom9To21() { + Cafe cafe = TestCafeFactory.createCafe(); + List businessHours = createBusinessHoursWith7daysFrom9To21(cafe); + cafe.changeBusinessHours(businessHours); return cafeRepository.save(cafe); } - private List makeBusinessHourWith24For7() { - List daysOfWeek = List.of("MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY"); + private List createBusinessHoursWith7daysFrom9To21(Cafe cafe) { List businessHours = new ArrayList<>(); + List daysOfWeek = generateDaysOfWeek(); for (String day : daysOfWeek) { businessHours.add( - TestBusinessHourFactory.createBusinessHourWithDayAnd24For7(day) + createBusinessHourWithDayAndTime(cafe, day, LocalTime.of(9, 0), LocalTime.of(21, 0)) ); } return businessHours; } + + public Cafe saveCafeWith24For7() { + Cafe cafe = TestCafeFactory.createCafe(); + List businessHours = makeBusinessHourWith24For7(cafe); + cafe.changeBusinessHours(businessHours); + return cafeRepository.save(cafe); + } + + private List generateDaysOfWeek() { + return List.of("MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY"); + } + + private List makeBusinessHourWith24For7(Cafe cafe) { + List daysOfWeek = generateDaysOfWeek(); + List businessHours = new ArrayList<>(); + for (String day : daysOfWeek) { + BusinessHour businessHour = TestBusinessHourFactory.createBusinessHourWithDayAnd24For7(cafe, day); + businessHours.add(businessHour); + } + return businessHours; + } } diff --git a/src/test/java/com/example/demo/helper/MemberSaveHelper.java b/src/test/java/com/example/demo/helper/MemberSaveHelper.java index bec9b3c..cb8d59d 100644 --- a/src/test/java/com/example/demo/helper/MemberSaveHelper.java +++ b/src/test/java/com/example/demo/helper/MemberSaveHelper.java @@ -1,24 +1,31 @@ package com.example.demo.helper; +import org.springframework.transaction.annotation.Transactional; + import com.example.demo.domain.member.Member; import com.example.demo.domain.member.ThumbnailImage; import com.example.demo.factory.TestMemberFactory; import com.example.demo.repository.member.MemberRepository; +import com.example.demo.repository.thumbnailimage.ThumbnailImageRepository; import lombok.RequiredArgsConstructor; @RequiredArgsConstructor +@Transactional public class MemberSaveHelper { private final MemberRepository memberRepository; + private final ThumbnailImageRepository thumbnailImageRepository; public Member saveMember(ThumbnailImage thumbnailImage) { - Member member = TestMemberFactory.createMemberWithThumbnailImage(thumbnailImage); + ThumbnailImage mergedThumbnailImage = thumbnailImageRepository.save(thumbnailImage); + Member member = TestMemberFactory.createMemberWithThumbnailImage(mergedThumbnailImage); return memberRepository.save(member); } public Member saveMemberWithName(ThumbnailImage thumbnailImage, String name) { - Member member = TestMemberFactory.createMemberWithThumbAndName(thumbnailImage, name); + ThumbnailImage mergedThumbnailImage = thumbnailImageRepository.save(thumbnailImage); + Member member = TestMemberFactory.createMemberWithThumbAndName(mergedThumbnailImage, name); return memberRepository.save(member); } } diff --git a/src/test/java/com/example/demo/helper/ReviewSaveHelper.java b/src/test/java/com/example/demo/helper/ReviewSaveHelper.java index 498e16e..c891cf1 100644 --- a/src/test/java/com/example/demo/helper/ReviewSaveHelper.java +++ b/src/test/java/com/example/demo/helper/ReviewSaveHelper.java @@ -1,20 +1,29 @@ package com.example.demo.helper; +import org.springframework.transaction.annotation.Transactional; + import com.example.demo.domain.cafe.Cafe; import com.example.demo.domain.member.Member; import com.example.demo.domain.review.Review; import com.example.demo.factory.TestReviewFactory; +import com.example.demo.repository.cafe.CafeRepository; +import com.example.demo.repository.member.MemberRepository; import com.example.demo.repository.review.ReviewRepository; import lombok.RequiredArgsConstructor; @RequiredArgsConstructor +@Transactional public class ReviewSaveHelper { private final ReviewRepository reviewRepository; + private final CafeRepository cafeRepository; + private final MemberRepository memberRepository; public Review saveReview(Cafe cafe, Member member) { - Review review = TestReviewFactory.createReview(cafe, member); + Cafe mergedCafe = cafeRepository.save(cafe); + Member mergedMember = memberRepository.save(member); + Review review = TestReviewFactory.createReview(mergedCafe, mergedMember); return reviewRepository.save(review); } } diff --git a/src/test/java/com/example/demo/helper/StudyMemberSaveHelper.java b/src/test/java/com/example/demo/helper/StudyMemberSaveHelper.java index 34b50cc..ef7d38c 100644 --- a/src/test/java/com/example/demo/helper/StudyMemberSaveHelper.java +++ b/src/test/java/com/example/demo/helper/StudyMemberSaveHelper.java @@ -1,20 +1,29 @@ package com.example.demo.helper; +import org.springframework.transaction.annotation.Transactional; + import com.example.demo.domain.member.Member; import com.example.demo.domain.study.StudyMember; import com.example.demo.domain.study.StudyOnce; import com.example.demo.factory.TestStudyMemberFactory; +import com.example.demo.repository.member.MemberRepository; import com.example.demo.repository.study.StudyMemberRepository; +import com.example.demo.repository.study.StudyOnceRepository; import lombok.RequiredArgsConstructor; @RequiredArgsConstructor +@Transactional public class StudyMemberSaveHelper { private final StudyMemberRepository studyMemberRepository; + private final MemberRepository memberRepository; + private final StudyOnceRepository studyOnceRepository; public StudyMember saveStudyMember(Member member, StudyOnce studyOnce) { - StudyMember studyMember = TestStudyMemberFactory.createStudyMember(member, studyOnce); + Member mergedMember = memberRepository.save(member); + StudyOnce mergedStudyOnce = studyOnceRepository.save(studyOnce); + StudyMember studyMember = TestStudyMemberFactory.createStudyMember(mergedMember, mergedStudyOnce); return studyMemberRepository.save(studyMember); } } diff --git a/src/test/java/com/example/demo/helper/StudyOnceCommentSaveHelper.java b/src/test/java/com/example/demo/helper/StudyOnceCommentSaveHelper.java index 43ddea1..5d2927d 100644 --- a/src/test/java/com/example/demo/helper/StudyOnceCommentSaveHelper.java +++ b/src/test/java/com/example/demo/helper/StudyOnceCommentSaveHelper.java @@ -1,33 +1,49 @@ package com.example.demo.helper; +import org.springframework.transaction.annotation.Transactional; + import com.example.demo.domain.member.Member; import com.example.demo.domain.study.StudyOnce; import com.example.demo.domain.study.StudyOnceComment; import com.example.demo.factory.TestStudyOnceCommentFactory; +import com.example.demo.repository.member.MemberRepository; import com.example.demo.repository.study.StudyOnceCommentRepository; +import com.example.demo.repository.study.StudyOnceRepository; import lombok.RequiredArgsConstructor; @RequiredArgsConstructor +@Transactional public class StudyOnceCommentSaveHelper { private final StudyOnceCommentRepository studyOnceCommentRepository; + private final MemberRepository memberRepository; + private final StudyOnceRepository studyOnceRepository; public StudyOnceComment saveStudyOnceQuestion(Member member, StudyOnce studyOnce) { - StudyOnceComment studyOnceComment = TestStudyOnceCommentFactory.createStudyOnceQuestion(member, studyOnce); + Member mergedMember = memberRepository.save(member); + StudyOnce mergedStudyOnce = studyOnceRepository.save(studyOnce); + StudyOnceComment studyOnceComment = TestStudyOnceCommentFactory.createStudyOnceQuestion(mergedMember, + mergedStudyOnce); return studyOnceCommentRepository.save(studyOnceComment); } public StudyOnceComment saveStudyOnceQuestionWithContent(Member member, StudyOnce studyOnce, String content) { - StudyOnceComment studyOnceComment = TestStudyOnceCommentFactory.createStudyOnceQuestionWithContent(member, - studyOnce, content); + Member mergedMember = memberRepository.save(member); + StudyOnce mergedStudyOnce = studyOnceRepository.save(studyOnce); + StudyOnceComment studyOnceComment = TestStudyOnceCommentFactory.createStudyOnceQuestionWithContent(mergedMember, + mergedStudyOnce, content); return studyOnceCommentRepository.save(studyOnceComment); } public StudyOnceComment saveStudyOnceReplyWithContent(Member member, StudyOnce studyOnce, StudyOnceComment parent, String content) { - StudyOnceComment reply = TestStudyOnceCommentFactory.createStudyOnceReplyWithContent(member, studyOnce, parent, + Member mergedMember = memberRepository.save(member); + StudyOnce mergedStudyOnce = studyOnceRepository.save(studyOnce); + StudyOnceComment mergedParent = studyOnceCommentRepository.save(parent); + StudyOnceComment reply = TestStudyOnceCommentFactory.createStudyOnceReplyWithContent(mergedMember, + mergedStudyOnce, mergedParent, content); parent.getChildren().add(reply); return studyOnceCommentRepository.save(reply); diff --git a/src/test/java/com/example/demo/helper/StudyOnceSaveHelper.java b/src/test/java/com/example/demo/helper/StudyOnceSaveHelper.java index a42a126..5b841ee 100644 --- a/src/test/java/com/example/demo/helper/StudyOnceSaveHelper.java +++ b/src/test/java/com/example/demo/helper/StudyOnceSaveHelper.java @@ -2,27 +2,39 @@ import java.time.LocalDateTime; +import org.springframework.transaction.annotation.Transactional; + import com.example.demo.domain.cafe.Cafe; import com.example.demo.domain.member.Member; import com.example.demo.domain.study.StudyOnce; import com.example.demo.factory.TestStudyOnceFactory; +import com.example.demo.repository.cafe.CafeRepository; +import com.example.demo.repository.member.MemberRepository; import com.example.demo.repository.study.StudyOnceRepository; import lombok.RequiredArgsConstructor; @RequiredArgsConstructor +@Transactional public class StudyOnceSaveHelper { private final StudyOnceRepository studyOnceRepository; + private final MemberRepository memberRepository; + private final CafeRepository cafeRepository; public StudyOnce saveStudyOnce(Cafe cafe, Member leader) { - StudyOnce studyOnce = TestStudyOnceFactory.createStudyOnce(cafe, leader); + Member mergedMember = memberRepository.save(leader); + Cafe mergedCafe = cafeRepository.save(cafe); + StudyOnce studyOnce = TestStudyOnceFactory.createStudyOnce(mergedCafe, mergedMember); return studyOnceRepository.save(studyOnce); } public StudyOnce saveStudyOnceWithTime(Cafe cafe, Member leader, LocalDateTime startDateTime, LocalDateTime endDateTime) { - StudyOnce studyOnce = TestStudyOnceFactory.createStudyOnceWithTime(cafe, leader, startDateTime, endDateTime); + Member mergedLeader = memberRepository.save(leader); + Cafe mergedCafe = cafeRepository.save(cafe); + StudyOnce studyOnce = TestStudyOnceFactory.createStudyOnceWithTime(mergedCafe, mergedLeader, startDateTime, + endDateTime); return studyOnceRepository.save(studyOnce); } } diff --git a/src/test/java/com/example/demo/helper/ThumbnailImageSaveHelper.java b/src/test/java/com/example/demo/helper/ThumbnailImageSaveHelper.java index 12a401d..26e0426 100644 --- a/src/test/java/com/example/demo/helper/ThumbnailImageSaveHelper.java +++ b/src/test/java/com/example/demo/helper/ThumbnailImageSaveHelper.java @@ -1,5 +1,7 @@ package com.example.demo.helper; +import org.springframework.transaction.annotation.Transactional; + import com.example.demo.domain.member.ThumbnailImage; import com.example.demo.factory.TestThumbnailImageFactory; import com.example.demo.repository.thumbnailimage.ThumbnailImageRepository; @@ -7,6 +9,7 @@ import lombok.RequiredArgsConstructor; @RequiredArgsConstructor +@Transactional public class ThumbnailImageSaveHelper { private final ThumbnailImageRepository thumbnailImageRepository; From 8fca79f1103b4816e5ca4f08954d592813e61c08 Mon Sep 17 00:00:00 2001 From: donghyunkim Date: Sat, 6 Jul 2024 16:30:56 +0900 Subject: [PATCH 05/20] =?UTF-8?q?refactor:=20@SpringBootTest,=20@Transacti?= =?UTF-8?q?onal=20=EC=A0=9C=EA=B1=B0=20=ED=9B=84=20ServiceTest=EC=97=90?= =?UTF-8?q?=EA=B2=8C=20=EC=9C=84=EC=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../profile/ProfileServiceImplTest.java | 8 ++----- .../service/review/ReviewServiceTest.java | 8 ++----- .../StudyOnceCommentQueryServiceImplTest.java | 7 ++---- .../StudyOnceCommentServiceImplTest.java | 10 +++------ .../study/StudyOnceServiceImplTest.java | 22 ++++--------------- 5 files changed, 13 insertions(+), 42 deletions(-) diff --git a/src/test/java/com/example/demo/service/profile/ProfileServiceImplTest.java b/src/test/java/com/example/demo/service/profile/ProfileServiceImplTest.java index 6669813..22a24db 100644 --- a/src/test/java/com/example/demo/service/profile/ProfileServiceImplTest.java +++ b/src/test/java/com/example/demo/service/profile/ProfileServiceImplTest.java @@ -5,12 +5,9 @@ import java.time.LocalDateTime; -import javax.transaction.Transactional; - import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Import; import com.example.demo.config.TestConfig; @@ -26,12 +23,11 @@ import com.example.demo.helper.MemberSaveHelper; import com.example.demo.helper.StudyOnceSaveHelper; import com.example.demo.helper.ThumbnailImageSaveHelper; +import com.example.demo.service.ServiceTest; import com.example.demo.service.study.StudyOnceService; -@SpringBootTest @Import({TestConfig.class}) -@Transactional -class ProfileServiceImplTest { +class ProfileServiceImplTest extends ServiceTest { private static final LocalDateTime NOW = LocalDateTime.now(); diff --git a/src/test/java/com/example/demo/service/review/ReviewServiceTest.java b/src/test/java/com/example/demo/service/review/ReviewServiceTest.java index e918ed1..7d89563 100644 --- a/src/test/java/com/example/demo/service/review/ReviewServiceTest.java +++ b/src/test/java/com/example/demo/service/review/ReviewServiceTest.java @@ -5,13 +5,10 @@ import java.util.List; -import javax.transaction.Transactional; - import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Import; import com.example.demo.config.TestConfig; @@ -26,11 +23,10 @@ import com.example.demo.helper.ReviewSaveHelper; import com.example.demo.helper.ThumbnailImageSaveHelper; import com.example.demo.repository.review.ReviewRepository; +import com.example.demo.service.ServiceTest; -@SpringBootTest @Import({TestConfig.class}) -@Transactional -class ReviewServiceTest { +class ReviewServiceTest extends ServiceTest { @Autowired private ReviewService sut; diff --git a/src/test/java/com/example/demo/service/study/StudyOnceCommentQueryServiceImplTest.java b/src/test/java/com/example/demo/service/study/StudyOnceCommentQueryServiceImplTest.java index b0d46d5..d631dd8 100644 --- a/src/test/java/com/example/demo/service/study/StudyOnceCommentQueryServiceImplTest.java +++ b/src/test/java/com/example/demo/service/study/StudyOnceCommentQueryServiceImplTest.java @@ -8,9 +8,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Import; -import org.springframework.transaction.annotation.Transactional; import com.example.demo.config.TestConfig; import com.example.demo.domain.cafe.Cafe; @@ -26,11 +24,10 @@ import com.example.demo.helper.StudyOnceCommentSaveHelper; import com.example.demo.helper.StudyOnceSaveHelper; import com.example.demo.helper.ThumbnailImageSaveHelper; +import com.example.demo.service.ServiceTest; -@SpringBootTest @Import({TestConfig.class}) -@Transactional -class StudyOnceCommentQueryServiceImplTest { +class StudyOnceCommentQueryServiceImplTest extends ServiceTest { @Autowired private StudyOnceCommentQueryService sut; diff --git a/src/test/java/com/example/demo/service/study/StudyOnceCommentServiceImplTest.java b/src/test/java/com/example/demo/service/study/StudyOnceCommentServiceImplTest.java index f47f005..f9ce3f7 100644 --- a/src/test/java/com/example/demo/service/study/StudyOnceCommentServiceImplTest.java +++ b/src/test/java/com/example/demo/service/study/StudyOnceCommentServiceImplTest.java @@ -4,12 +4,9 @@ import java.util.List; -import javax.transaction.Transactional; - import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Import; import com.example.demo.config.TestConfig; @@ -28,12 +25,11 @@ import com.example.demo.helper.StudyOnceSaveHelper; import com.example.demo.helper.ThumbnailImageSaveHelper; import com.example.demo.repository.study.StudyOnceCommentRepository; +import com.example.demo.service.ServiceTest; -@SpringBootTest @Import({TestConfig.class}) -@Transactional -class StudyOnceCommentServiceImplTest { - +class StudyOnceCommentServiceImplTest extends ServiceTest { + @Autowired private StudyOnceCommentService sut; @Autowired diff --git a/src/test/java/com/example/demo/service/study/StudyOnceServiceImplTest.java b/src/test/java/com/example/demo/service/study/StudyOnceServiceImplTest.java index f763cd3..e23d3ed 100644 --- a/src/test/java/com/example/demo/service/study/StudyOnceServiceImplTest.java +++ b/src/test/java/com/example/demo/service/study/StudyOnceServiceImplTest.java @@ -9,9 +9,7 @@ import java.time.LocalDateTime; import java.time.LocalTime; import java.util.ArrayList; -import java.util.Collection; import java.util.List; -import java.util.stream.Collectors; import java.util.stream.Stream; import org.junit.jupiter.api.DisplayName; @@ -21,9 +19,7 @@ import org.junit.jupiter.params.provider.MethodSource; import org.junit.jupiter.params.provider.ValueSource; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Import; -import org.springframework.transaction.annotation.Transactional; import com.example.demo.config.TestConfig; import com.example.demo.domain.cafe.BusinessHour; @@ -48,11 +44,10 @@ import com.example.demo.helper.ThumbnailImageSaveHelper; import com.example.demo.repository.study.StudyMemberRepository; import com.example.demo.repository.study.StudyOnceRepository; +import com.example.demo.service.ServiceTest; -@SpringBootTest @Import({TestConfig.class}) -@Transactional -class StudyOnceServiceImplTest { +class StudyOnceServiceImplTest extends ServiceTest { private static final LocalDateTime NOW = LocalDateTime.now(); @Autowired @@ -81,14 +76,6 @@ private StudyOnceCreateRequest makeStudyOnceCreateRequest(LocalDateTime start, L return new StudyOnceCreateRequest(cafeId, "테스트 스터디", start, end, 4, true, "오픈채팅방 링크"); } - private void syncStudyOnceRepositoryAndStudyMemberRepository() { - List allStudyMembers = studyOnceRepository.findAll().stream() - .map(StudyOnce::getStudyMembers) - .flatMap(Collection::stream) - .collect(Collectors.toList()); - studyMemberRepository.saveAll(allStudyMembers); - } - @Test @DisplayName("회원이 아닐떄 카공을 조회하면 카공의 참석여부는 false를 반환한다.") void searchByStudyId_when_not_member() { @@ -120,7 +107,6 @@ void searchStudyOnceWithMemberParticipation_when_takes_attendance() { long studyOnceId = searchResponse.getStudyOnceId(); long memberId = memberSaveHelper.saveMember(thumbnailImage).getId(); sut.tryJoin(memberId, studyOnceId); - syncStudyOnceRepositoryAndStudyMemberRepository(); StudyOnceSearchResponse response = sut.searchStudyOnceWithMemberParticipation( studyOnceId, memberId); @@ -603,8 +589,8 @@ static Stream provideStartAndEndDateTime3() { @DisplayName("카공 시간 변경시 카공 시간은 카페 영업시간내에 포함된다.") void study_time_is_within_cafe_business_hours(LocalDateTime start, LocalDateTime end) { //given - List businessHours = makeBusinessHourWith7daysFrom9To21(); - Cafe cafe = cafeSaveHelper.saveCafeWithBusinessHour(businessHours); + // List businessHours = makeBusinessHourWith7daysFrom9To21(); + Cafe cafe = cafeSaveHelper.saveCafeWith7daysFrom9To21(); ThumbnailImage thumbnailImage = thumbnailImageSaveHelper.saveThumbnailImage(); Member leader = memberSaveHelper.saveMember(thumbnailImage); StudyOnce studyOnce = studyOnceSaveHelper.saveStudyOnceWithTime(cafe, leader, From 60695f2d922badc2869ae9dbe5b9cdc5675a718c Mon Sep 17 00:00:00 2001 From: donghyunkim Date: Sat, 6 Jul 2024 16:47:30 +0900 Subject: [PATCH 06/20] =?UTF-8?q?refactor:=20ServiceTest,=20DbcleanUp=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/demo/service/ServiceTest.java | 19 +++++ .../example/demo/utils/DatabaseCleanup.java | 76 +++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 src/test/java/com/example/demo/service/ServiceTest.java create mode 100644 src/test/java/com/example/demo/utils/DatabaseCleanup.java diff --git a/src/test/java/com/example/demo/service/ServiceTest.java b/src/test/java/com/example/demo/service/ServiceTest.java new file mode 100644 index 0000000..dcaf3dc --- /dev/null +++ b/src/test/java/com/example/demo/service/ServiceTest.java @@ -0,0 +1,19 @@ +package com.example.demo.service; + +import org.junit.jupiter.api.BeforeEach; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import com.example.demo.utils.DatabaseCleanup; + +@SpringBootTest +public class ServiceTest { + + @Autowired + private DatabaseCleanup databaseCleanup; + + @BeforeEach + public void setUp() { + databaseCleanup.execute(); + } +} diff --git a/src/test/java/com/example/demo/utils/DatabaseCleanup.java b/src/test/java/com/example/demo/utils/DatabaseCleanup.java new file mode 100644 index 0000000..5e84e01 --- /dev/null +++ b/src/test/java/com/example/demo/utils/DatabaseCleanup.java @@ -0,0 +1,76 @@ +package com.example.demo.utils; + +import java.util.List; +import java.util.stream.Collectors; + +import javax.annotation.PostConstruct; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Table; +import javax.persistence.metamodel.EntityType; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +public class DatabaseCleanup { + + @PersistenceContext + private EntityManager em; + + private List tableNames; + + @PostConstruct + public void afterPropertiesSet() { + // tableNames = em.getMetamodel().getEntities().stream() + // .filter(e -> e.getJavaType().getAnnotation(Entity.class) != null) + // .map(e -> convertCamelCaseToSnakeCase(e.getName())) + // .collect(Collectors.toList()); + tableNames = em.getMetamodel().getEntities().stream() + .map(this::getTableName) + .collect(Collectors.toList()); + } + + private String getTableName(EntityType entityType) { + String tableName; + Class javaType = entityType.getJavaType(); + + // @Table 어노테이션이 있는 경우 테이블 이름 가져오기 + if (javaType.isAnnotationPresent(Table.class)) { + Table table = javaType.getAnnotation(Table.class); + tableName = table.name(); + } else { + // @Table 어노테이션이 없는 경우 엔티티 이름에서 테이블 이름으로 변환 + tableName = convertCamelCaseToSnakeCase(entityType.getName()); + } + + return tableName; + } + + @Transactional + public void execute() { + em.flush(); + afterPropertiesSet(); + em.createNativeQuery("SET FOREIGN_KEY_CHECKS = 0").executeUpdate(); + + for (String tableName : tableNames) { + System.out.println("tableName = " + tableName); + em.createNativeQuery("TRUNCATE TABLE " + tableName).executeUpdate(); + } + + em.createNativeQuery("SET FOREIGN_KEY_CHECKS = 1").executeUpdate(); + } + + private static String convertCamelCaseToSnakeCase(String input) { + if (input == null) { + return null; + } + + String regex = "([a-z])([A-Z]+)"; + String replacement = "$1_$2"; + + return input + .replaceAll(regex, replacement) + .toLowerCase(); + } +} From 2cce2f0a24f9635833546a6dfab0185af72d11a1 Mon Sep 17 00:00:00 2001 From: donghyunkim Date: Mon, 8 Jul 2024 20:15:39 +0900 Subject: [PATCH 07/20] =?UTF-8?q?feat:=20MicroTimeUtils=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EB=B0=8F=20=ED=85=8C=EC=8A=A4=ED=8A=B8=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 --- .../com/example/demo/util/MicroTimeUtils.java | 18 +++++++++++++ .../example/demo/util/MicroTimeUtilsTest.java | 26 +++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 src/main/java/com/example/demo/util/MicroTimeUtils.java create mode 100644 src/test/java/com/example/demo/util/MicroTimeUtilsTest.java diff --git a/src/main/java/com/example/demo/util/MicroTimeUtils.java b/src/main/java/com/example/demo/util/MicroTimeUtils.java new file mode 100644 index 0000000..8287b4a --- /dev/null +++ b/src/main/java/com/example/demo/util/MicroTimeUtils.java @@ -0,0 +1,18 @@ +package com.example.demo.util; + +import java.time.LocalDateTime; +import java.time.LocalTime; + +public class MicroTimeUtils { + + public static final LocalTime MAX_LOCAL_TIME = LocalTime.of(23, 59, 59, 999_999_000); + + public static LocalTime toMicroTime(LocalTime time) { + return time.withNano((time.getNano() / 1000) * 1000); + } + + public static LocalDateTime toMicroDateTime(LocalDateTime dateTime) { + return dateTime.withNano((dateTime.getNano() / 1000) * 1000); + } + +} diff --git a/src/test/java/com/example/demo/util/MicroTimeUtilsTest.java b/src/test/java/com/example/demo/util/MicroTimeUtilsTest.java new file mode 100644 index 0000000..c21ac52 --- /dev/null +++ b/src/test/java/com/example/demo/util/MicroTimeUtilsTest.java @@ -0,0 +1,26 @@ +package com.example.demo.util; + +import static org.assertj.core.api.Assertions.*; + +import java.time.LocalDateTime; +import java.time.LocalTime; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class MicroTimeUtilsTest { + + @Test + @DisplayName("나노초에서 마이크로초로 변환한다.") + void convert_nano_to_micro_time() { + LocalTime result = MicroTimeUtils.toMicroTime(LocalTime.of(23, 59, 59, 999_999_999)); + assertThat(result).isEqualTo(LocalTime.of(23, 59, 59, 999_999_000)); + } + + @Test + @DisplayName("나노초에서 마이크로초로 변환한다.") + void convert_nano_to_micro_date_time() { + LocalDateTime result = MicroTimeUtils.toMicroDateTime(LocalDateTime.MAX); + assertThat(result).isEqualTo(LocalDateTime.MAX.withNano(999_999_000)); + } +} \ No newline at end of file From be4ff0a1da4028a2aedf3f0c040beeb969e56750 Mon Sep 17 00:00:00 2001 From: donghyunkim Date: Mon, 8 Jul 2024 20:43:23 +0900 Subject: [PATCH 08/20] =?UTF-8?q?refactor:=20LocalTime=20LocalDateTime=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EC=BD=94=EB=93=9C=20=EB=A7=88=EC=9D=B4?= =?UTF-8?q?=ED=81=AC=EB=A1=9C=EC=B4=88=EB=A1=9C=20=EC=BB=A8=EB=B2=84?= =?UTF-8?q?=ED=8C=85=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../demo/domain/cafe/BusinessHour.java | 3 ++ .../domain/cafe/BusinessHourOpenChecker.java | 3 +- .../demo/domain/cafe/CafeSearchCondition.java | 3 +- .../example/demo/domain/study/StudyOnce.java | 3 +- .../service/study/StudyOnceServiceImpl.java | 10 ++++-- .../com/example/demo/util/MicroTimeUtils.java | 1 - .../cafe/BusinessHourOpenCheckerTest.java | 33 +++++++++++-------- .../demo/factory/TestBusinessHourFactory.java | 6 ++-- .../cafe/CafeRepositorySearchMethodTest.java | 5 +-- .../study/StudyOnceServiceImplTest.java | 25 ++------------ .../example/demo/utils/DatabaseCleanup.java | 5 ++- 11 files changed, 48 insertions(+), 49 deletions(-) diff --git a/src/main/java/com/example/demo/domain/cafe/BusinessHour.java b/src/main/java/com/example/demo/domain/cafe/BusinessHour.java index 6ce0770..2af66d7 100644 --- a/src/main/java/com/example/demo/domain/cafe/BusinessHour.java +++ b/src/main/java/com/example/demo/domain/cafe/BusinessHour.java @@ -37,7 +37,10 @@ public class BusinessHour { @Column(name = "days_of_week") private String day; + /// columnDefinition 옵션은 나중에 DB에 직접 적용하고 삭제할 것 + @Column(columnDefinition = "TIME(6)") private LocalTime startTime; + @Column(columnDefinition = "TIME(6)") private LocalTime endTime; @ManyToOne(fetch = FetchType.LAZY) diff --git a/src/main/java/com/example/demo/domain/cafe/BusinessHourOpenChecker.java b/src/main/java/com/example/demo/domain/cafe/BusinessHourOpenChecker.java index 5b04a6f..c9e61be 100644 --- a/src/main/java/com/example/demo/domain/cafe/BusinessHourOpenChecker.java +++ b/src/main/java/com/example/demo/domain/cafe/BusinessHourOpenChecker.java @@ -8,6 +8,7 @@ import com.example.demo.exception.CafegoryException; import com.example.demo.exception.ExceptionType; +import com.example.demo.util.MicroTimeUtils; public class BusinessHourOpenChecker implements OpenChecker { @@ -40,7 +41,7 @@ private boolean isTodayBusinessDay(DayOfWeek businessDay, LocalDateTime now, boo } private boolean is24HourBusiness(LocalTime startTime, LocalTime endTime) { - return startTime.equals(LocalTime.MIN) && endTime.equals(LocalTime.MAX); + return startTime.equals(LocalTime.MIN) && endTime.equals(MicroTimeUtils.MAX_LOCAL_TIME); } private boolean isOpenOvernight(LocalTime startTime, LocalTime endTime) { diff --git a/src/main/java/com/example/demo/domain/cafe/CafeSearchCondition.java b/src/main/java/com/example/demo/domain/cafe/CafeSearchCondition.java index 2f77555..23484e1 100644 --- a/src/main/java/com/example/demo/domain/cafe/CafeSearchCondition.java +++ b/src/main/java/com/example/demo/domain/cafe/CafeSearchCondition.java @@ -1,6 +1,7 @@ package com.example.demo.domain.cafe; import static com.example.demo.exception.ExceptionType.*; +import static com.example.demo.util.MicroTimeUtils.*; import java.time.LocalDateTime; import java.time.LocalTime; @@ -80,7 +81,7 @@ public CafeSearchCondition build() { private LocalTime calcLocalTime(int time) { if (time == END_TIME) { - return LocalTime.MAX; + return MAX_LOCAL_TIME; } return LocalTime.of(time, 0); } diff --git a/src/main/java/com/example/demo/domain/study/StudyOnce.java b/src/main/java/com/example/demo/domain/study/StudyOnce.java index 28a2a30..46a7b67 100644 --- a/src/main/java/com/example/demo/domain/study/StudyOnce.java +++ b/src/main/java/com/example/demo/domain/study/StudyOnce.java @@ -1,6 +1,7 @@ package com.example.demo.domain.study; import static com.example.demo.exception.ExceptionType.*; +import static com.example.demo.util.MicroTimeUtils.*; import java.time.Duration; import java.time.LocalDateTime; @@ -116,7 +117,7 @@ private void validateStudyOnceTime(LocalDateTime startDateTime, LocalDateTime en } private void validateStartAndEndTime(LocalTime startLocalTime, LocalTime endLocalTime) { - if (!(startLocalTime.equals(LocalTime.of(23, 0)) && endLocalTime.equals(LocalTime.MAX))) { + if (!(startLocalTime.equals(LocalTime.of(23, 0)) && endLocalTime.equals(MAX_LOCAL_TIME))) { throw new CafegoryException(STUDY_ONCE_SHORT_DURATION); } } diff --git a/src/main/java/com/example/demo/service/study/StudyOnceServiceImpl.java b/src/main/java/com/example/demo/service/study/StudyOnceServiceImpl.java index f266bb5..92926de 100644 --- a/src/main/java/com/example/demo/service/study/StudyOnceServiceImpl.java +++ b/src/main/java/com/example/demo/service/study/StudyOnceServiceImpl.java @@ -1,6 +1,7 @@ package com.example.demo.service.study; import static com.example.demo.exception.ExceptionType.*; +import static com.example.demo.util.MicroTimeUtils.*; import java.time.Duration; import java.time.LocalDateTime; @@ -196,10 +197,15 @@ private StudyOnce findStudyOnceById(long studyOnceId) { public StudyOnceCreateResponse createStudy(long leaderId, StudyOnceCreateRequest request) { Cafe cafe = findCafeById(request.getCafeId()); BusinessHour businessHour = cafe.findBusinessHour(request.getStartDateTime().getDayOfWeek()); - validateBetweenBusinessHour(request.getStartDateTime().toLocalTime(), request.getEndDateTime().toLocalTime(), + validateBetweenBusinessHour( + toMicroTime(request.getStartDateTime().toLocalTime()), + toMicroTime(request.getEndDateTime().toLocalTime()), businessHour); Member leader = findMemberById(leaderId); - validateStudyScheduleConflict(request.getStartDateTime(), request.getEndDateTime(), leader); + validateStudyScheduleConflict( + toMicroDateTime(request.getStartDateTime()), + toMicroDateTime(request.getEndDateTime()), + leader); StudyOnce studyOnce = studyOnceMapper.toNewEntity(request, cafe, leader); StudyOnce saved = studyOnceRepository.save(studyOnce); return studyOnceMapper.toStudyOnceCreateResponse(saved, true); diff --git a/src/main/java/com/example/demo/util/MicroTimeUtils.java b/src/main/java/com/example/demo/util/MicroTimeUtils.java index 8287b4a..5473e13 100644 --- a/src/main/java/com/example/demo/util/MicroTimeUtils.java +++ b/src/main/java/com/example/demo/util/MicroTimeUtils.java @@ -14,5 +14,4 @@ public static LocalTime toMicroTime(LocalTime time) { public static LocalDateTime toMicroDateTime(LocalDateTime dateTime) { return dateTime.withNano((dateTime.getNano() / 1000) * 1000); } - } diff --git a/src/test/java/com/example/demo/domain/cafe/BusinessHourOpenCheckerTest.java b/src/test/java/com/example/demo/domain/cafe/BusinessHourOpenCheckerTest.java index c8ee391..459ba28 100644 --- a/src/test/java/com/example/demo/domain/cafe/BusinessHourOpenCheckerTest.java +++ b/src/test/java/com/example/demo/domain/cafe/BusinessHourOpenCheckerTest.java @@ -1,6 +1,7 @@ package com.example.demo.domain.cafe; import static com.example.demo.factory.TestBusinessHourFactory.*; +import static com.example.demo.util.MicroTimeUtils.*; import static org.assertj.core.api.Assertions.*; import java.time.LocalDateTime; @@ -67,10 +68,14 @@ private static Stream provideLocalDateTime5() { @DisplayName("24시간 영업한다.") void open_24Hours(LocalDateTime now) { List businessHours = List.of( + // createBusinessHourWithDayAndTime("MONDAY", LocalTime.of(0, 0), + // LocalTime.MAX), + // createBusinessHourWithDayAndTime("TUESDAY", LocalTime.of(0, 0), + // LocalTime.MAX) createBusinessHourWithDayAndTime("MONDAY", LocalTime.of(0, 0), - LocalTime.MAX), + MAX_LOCAL_TIME), createBusinessHourWithDayAndTime("TUESDAY", LocalTime.of(0, 0), - LocalTime.MAX) + MAX_LOCAL_TIME) ); BusinessHourOpenChecker sut = new BusinessHourOpenChecker(); //when @@ -122,11 +127,11 @@ void business_hours_are_different_each_day(LocalDateTime now, createBusinessHourWithDayAndTime("MONDAY", LocalTime.of(9, 0), LocalTime.of(22, 0)), createBusinessHourWithDayAndTime("TUESDAY", - LocalTime.of(9, 0), LocalTime.MAX), + LocalTime.of(9, 0), MAX_LOCAL_TIME), createBusinessHourWithDayAndTime("FRIDAY", - LocalTime.of(9, 0), LocalTime.MAX), + LocalTime.of(9, 0), MAX_LOCAL_TIME), createBusinessHourWithDayAndTime("SATURDAY", - LocalTime.of(0, 0), LocalTime.MAX), + LocalTime.of(0, 0), MAX_LOCAL_TIME), createBusinessHourWithDayAndTime("SUNDAY", LocalTime.of(0, 0), LocalTime.of(22, 0)) ); @@ -151,15 +156,15 @@ private static Stream provideLocalDateTime4() { 3일 : 토 4일 : 일 */ - Arguments.of(LocalDateTime.of(2024, 1, 29, 21, 59, 59, 999_999_999), true), + Arguments.of(LocalDateTime.of(2024, 1, 29, 21, 59, 59, 999_999), true), Arguments.of(LocalDateTime.of(2024, 1, 29, 22, 0), false), - Arguments.of(LocalDateTime.of(2024, 1, 30, 23, 59, 59, 999_999_998), true), - Arguments.of(LocalDateTime.of(2024, 1, 30, 23, 59, 59, 999_999_999), false), - Arguments.of(LocalDateTime.of(2024, 2, 2, 23, 59, 59, 999_999_998), true), - Arguments.of(LocalDateTime.of(2024, 2, 2, 23, 59, 59, 999_999_999), false), + Arguments.of(LocalDateTime.of(2024, 1, 30, 23, 59, 59, 999_998), true), + Arguments.of(LocalDateTime.of(2024, 1, 30, 23, 59, 59, 999_999), false), + Arguments.of(LocalDateTime.of(2024, 2, 2, 23, 59, 59, 999_998), true), + Arguments.of(LocalDateTime.of(2024, 2, 2, 23, 59, 59, 999_999), false), Arguments.of(LocalDateTime.of(2024, 2, 3, 0, 0), true), Arguments.of(LocalDateTime.of(2024, 2, 4, 0, 0), true), - Arguments.of(LocalDateTime.of(2024, 2, 4, 21, 59, 59, 999_999_999), true), + Arguments.of(LocalDateTime.of(2024, 2, 4, 21, 59, 59, 999_999), true), Arguments.of(LocalDateTime.of(2024, 2, 4, 22, 0, 0), false) ); } @@ -225,9 +230,9 @@ private static Stream provideChosenTimeAndExpected() { void check_if_chosen_time_is_within_24hour_business_hours() { //given LocalTime businessStartTime = LocalTime.of(0, 0); - LocalTime businessEndTime = LocalTime.MAX; + LocalTime businessEndTime = MAX_LOCAL_TIME; LocalTime chosenStartTime = LocalTime.of(0, 0); - LocalTime chosenEndTime = LocalTime.MAX; + LocalTime chosenEndTime = MAX_LOCAL_TIME; BusinessHourOpenChecker sut = new BusinessHourOpenChecker(); //when boolean isBetween = sut.checkBetweenBusinessHours(businessStartTime, businessEndTime, @@ -267,7 +272,7 @@ private static Stream provideChosenTimeAndExpected4() { ), Arguments.of( LocalTime.of(23, 0), - LocalTime.MAX, + MAX_LOCAL_TIME, true ), Arguments.of( diff --git a/src/test/java/com/example/demo/factory/TestBusinessHourFactory.java b/src/test/java/com/example/demo/factory/TestBusinessHourFactory.java index e123946..8927331 100644 --- a/src/test/java/com/example/demo/factory/TestBusinessHourFactory.java +++ b/src/test/java/com/example/demo/factory/TestBusinessHourFactory.java @@ -1,5 +1,7 @@ package com.example.demo.factory; +import static com.example.demo.util.MicroTimeUtils.*; + import java.time.LocalTime; import com.example.demo.domain.cafe.BusinessHour; @@ -10,7 +12,7 @@ public class TestBusinessHourFactory { public static BusinessHour createBusinessHourWithDayAnd24For7(String day) { return BusinessHour.builder() .startTime(LocalTime.MIN) - .endTime(LocalTime.MAX) + .endTime(MAX_LOCAL_TIME) .day(day) .build(); } @@ -19,7 +21,7 @@ public static BusinessHour createBusinessHourWithDayAnd24For7(Cafe cafe, String return BusinessHour.builder() .cafe(cafe) .startTime(LocalTime.MIN) - .endTime(LocalTime.MAX) + .endTime(MAX_LOCAL_TIME) .day(day) .build(); } diff --git a/src/test/java/com/example/demo/repository/cafe/CafeRepositorySearchMethodTest.java b/src/test/java/com/example/demo/repository/cafe/CafeRepositorySearchMethodTest.java index 559c812..bc51ba4 100644 --- a/src/test/java/com/example/demo/repository/cafe/CafeRepositorySearchMethodTest.java +++ b/src/test/java/com/example/demo/repository/cafe/CafeRepositorySearchMethodTest.java @@ -2,6 +2,7 @@ import static com.example.demo.factory.TestBusinessHourFactory.*; import static com.example.demo.factory.TestCafeFactory.*; +import static com.example.demo.util.MicroTimeUtils.*; import static org.assertj.core.api.Assertions.*; import java.sql.Time; @@ -351,8 +352,8 @@ private static Stream provideConditionByFilteringTimeAndExpected() { @Test @DisplayName("영업시간이 24시간인 경우, 영업시간으로 필터링") void search_cafes_with_24hours_businessHours_() { - setUp("상수동", MaxAllowableStay.TWO_HOUR, true, 2_500, LocalTime.of(0, 0), LocalTime.MAX); - setUp("상수동", MaxAllowableStay.TWO_HOUR, true, 2_500, LocalTime.of(0, 0), LocalTime.MAX); + setUp("상수동", MaxAllowableStay.TWO_HOUR, true, 2_500, LocalTime.of(0, 0), MAX_LOCAL_TIME); + setUp("상수동", MaxAllowableStay.TWO_HOUR, true, 2_500, LocalTime.of(0, 0), MAX_LOCAL_TIME); //given CafeSearchCondition cafeSearchCondition = createSearchConditionByFilteringTime(true, "상수동", 0, 24, diff --git a/src/test/java/com/example/demo/service/study/StudyOnceServiceImplTest.java b/src/test/java/com/example/demo/service/study/StudyOnceServiceImplTest.java index e23d3ed..9d5a0c6 100644 --- a/src/test/java/com/example/demo/service/study/StudyOnceServiceImplTest.java +++ b/src/test/java/com/example/demo/service/study/StudyOnceServiceImplTest.java @@ -2,13 +2,10 @@ import static com.example.demo.domain.study.Attendance.*; import static com.example.demo.exception.ExceptionType.*; -import static com.example.demo.factory.TestBusinessHourFactory.*; import static org.assertj.core.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*; import java.time.LocalDateTime; -import java.time.LocalTime; -import java.util.ArrayList; import java.util.List; import java.util.stream.Stream; @@ -22,7 +19,6 @@ import org.springframework.context.annotation.Import; import com.example.demo.config.TestConfig; -import com.example.demo.domain.cafe.BusinessHour; import com.example.demo.domain.cafe.Cafe; import com.example.demo.domain.member.Member; import com.example.demo.domain.member.ThumbnailImage; @@ -283,8 +279,7 @@ static Stream provideLocalDateTime2() { @DisplayName("카페 영업시간 밖의 시간에 카공을 만들 수 없다.") void study_can_not_start_outside_cafe_business_hours(LocalDateTime start, LocalDateTime end) { //given - List businessHours = makeBusinessHourWith7daysFrom9To21(); - Cafe cafe = cafeSaveHelper.saveCafeWithBusinessHour(businessHours); + Cafe cafe = cafeSaveHelper.saveCafeWith7daysFrom9To21(); ThumbnailImage thumbnailImage = thumbnailImageSaveHelper.saveThumbnailImage(); Member leader = memberSaveHelper.saveMember(thumbnailImage); StudyOnceCreateRequest studyOnceCreateRequest = makeStudyOnceCreateRequest(start, end, cafe.getId()); @@ -320,8 +315,7 @@ static Stream provideStartAndEndDateTime1() { @DisplayName("카페 영업시간 내의 시간에 카공을 만들 수 있다.") void study_can_start_between_cafe_business_hours(LocalDateTime start, LocalDateTime end) { //given - List businessHours = makeBusinessHourWith7daysFrom9To21(); - Cafe cafe = cafeSaveHelper.saveCafeWithBusinessHour(businessHours); + Cafe cafe = cafeSaveHelper.saveCafeWith7daysFrom9To21(); ThumbnailImage thumbnailImage = thumbnailImageSaveHelper.saveThumbnailImage(); Member leader = memberSaveHelper.saveMember(thumbnailImage); StudyOnceCreateRequest studyOnceCreateRequest = makeStudyOnceCreateRequest(start, end, cafe.getId()); @@ -342,17 +336,6 @@ static Stream provideStartAndEndDateTime2() { ); } - private List makeBusinessHourWith7daysFrom9To21() { - List daysOfWeek = List.of("MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY"); - List businessHours = new ArrayList<>(); - for (String day : daysOfWeek) { - businessHours.add( - createBusinessHourWithDayAndTime(day, LocalTime.of(9, 0), LocalTime.of(21, 0)) - ); - } - return businessHours; - } - @Test @DisplayName("카공이 시작하기전에 카공 참여를 취소할 수 있다.") void member_can_cancel_study_before_starts() { @@ -546,8 +529,7 @@ void non_leader_can_not_update_study_details() { @DisplayName("카공 시간 변경시 카공 시간은 카페 영업시간내에 포함되어야 한다.") void study_time_must_be_within_cafe_business_hours(LocalDateTime start, LocalDateTime end) { //given - List businessHours = makeBusinessHourWith7daysFrom9To21(); - Cafe cafe = cafeSaveHelper.saveCafeWithBusinessHour(businessHours); + Cafe cafe = cafeSaveHelper.saveCafeWith7daysFrom9To21(); ThumbnailImage thumbnailImage = thumbnailImageSaveHelper.saveThumbnailImage(); Member leader = memberSaveHelper.saveMember(thumbnailImage); StudyOnce studyOnce = studyOnceSaveHelper.saveStudyOnceWithTime(cafe, leader, @@ -589,7 +571,6 @@ static Stream provideStartAndEndDateTime3() { @DisplayName("카공 시간 변경시 카공 시간은 카페 영업시간내에 포함된다.") void study_time_is_within_cafe_business_hours(LocalDateTime start, LocalDateTime end) { //given - // List businessHours = makeBusinessHourWith7daysFrom9To21(); Cafe cafe = cafeSaveHelper.saveCafeWith7daysFrom9To21(); ThumbnailImage thumbnailImage = thumbnailImageSaveHelper.saveThumbnailImage(); Member leader = memberSaveHelper.saveMember(thumbnailImage); diff --git a/src/test/java/com/example/demo/utils/DatabaseCleanup.java b/src/test/java/com/example/demo/utils/DatabaseCleanup.java index 5e84e01..cc6bead 100644 --- a/src/test/java/com/example/demo/utils/DatabaseCleanup.java +++ b/src/test/java/com/example/demo/utils/DatabaseCleanup.java @@ -51,14 +51,13 @@ private String getTableName(EntityType entityType) { public void execute() { em.flush(); afterPropertiesSet(); - em.createNativeQuery("SET FOREIGN_KEY_CHECKS = 0").executeUpdate(); + // em.createNativeQuery("SET FOREIGN_KEY_CHECKS = 0").executeUpdate(); for (String tableName : tableNames) { - System.out.println("tableName = " + tableName); em.createNativeQuery("TRUNCATE TABLE " + tableName).executeUpdate(); } - em.createNativeQuery("SET FOREIGN_KEY_CHECKS = 1").executeUpdate(); + // em.createNativeQuery("SET FOREIGN_KEY_CHECKS = 1").executeUpdate(); } private static String convertCamelCaseToSnakeCase(String input) { From 12606bc7348ab838b5b94c9248c0ebc93d9ce1cf Mon Sep 17 00:00:00 2001 From: donghyunkim Date: Wed, 10 Jul 2024 21:23:59 +0900 Subject: [PATCH 09/20] =?UTF-8?q?refactor:=20=EC=B9=B4=EA=B3=B5=2023?= =?UTF-8?q?=EC=8B=9C=20=EC=8B=9C=EC=9E=91=2023:59:59=EC=B4=88=20=EC=A2=85?= =?UTF-8?q?=EB=A3=8C=EC=8B=9C=20=EA=B0=80=EB=8A=A5=ED=95=98=EA=B2=8C=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/demo/domain/study/StudyOnce.java | 4 +++- .../service/study/StudyOnceServiceImplTest.java | 17 +++++++++++++---- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/example/demo/domain/study/StudyOnce.java b/src/main/java/com/example/demo/domain/study/StudyOnce.java index 46a7b67..6eabc2d 100644 --- a/src/main/java/com/example/demo/domain/study/StudyOnce.java +++ b/src/main/java/com/example/demo/domain/study/StudyOnce.java @@ -117,7 +117,9 @@ private void validateStudyOnceTime(LocalDateTime startDateTime, LocalDateTime en } private void validateStartAndEndTime(LocalTime startLocalTime, LocalTime endLocalTime) { - if (!(startLocalTime.equals(LocalTime.of(23, 0)) && endLocalTime.equals(MAX_LOCAL_TIME))) { + if (!(startLocalTime.equals(LocalTime.of(23, 0)) && + (endLocalTime.equals(MAX_LOCAL_TIME) || endLocalTime.equals(LocalTime.of(23, 59, 59)))) + ) { throw new CafegoryException(STUDY_ONCE_SHORT_DURATION); } } diff --git a/src/test/java/com/example/demo/service/study/StudyOnceServiceImplTest.java b/src/test/java/com/example/demo/service/study/StudyOnceServiceImplTest.java index 9d5a0c6..3fdb844 100644 --- a/src/test/java/com/example/demo/service/study/StudyOnceServiceImplTest.java +++ b/src/test/java/com/example/demo/service/study/StudyOnceServiceImplTest.java @@ -130,12 +130,13 @@ void searchStudyOnceWithMemberParticipation_when_not_take_attendance() { assertThat(response.isAttendance()).isFalse(); } - @Test - @DisplayName("카공 시작시간이 23시이고 종료시간이 24시(23시 59분 59초 999_999_999초)이면 카공이 생성된다.") - void exception_case1() { + @ParameterizedTest + @MethodSource("provideLocalDateTime") + @DisplayName("카공 시작시간이 23시이고 종료시간이 24시(23시 59분 59초)이면 카공이 생성된다.") + void exception_case1(LocalDateTime end) { //given LocalDateTime start = LocalDateTime.of(2999, 1, 1, 23, 0); - LocalDateTime end = LocalDateTime.of(2999, 1, 1, 23, 59, 59, 999_999_999); + // LocalDateTime end = LocalDateTime.of(2999, 1, 1, 23, 59, 59); ThumbnailImage thumbnailImage = thumbnailImageSaveHelper.saveThumbnailImage(); Member leader = memberSaveHelper.saveMember(thumbnailImage); Cafe cafe = cafeSaveHelper.saveCafeWith24For7(); @@ -144,6 +145,14 @@ void exception_case1() { assertDoesNotThrow(() -> sut.createStudy(leader.getId(), studyOnceCreateRequest)); } + static Stream provideLocalDateTime() { + return Stream.of( + Arguments.of(LocalDateTime.of(2999, 1, 1, 23, 59, 59)) + // 밑의 테스트 케이스는 마이그레이션 후 BusinessHour의 종료 시간이 999_999_000로 들어갈 때 성공한다. + // Arguments.of(LocalDateTime.of(2999, 1, 1, 23, 59, 59, 999_999_000)) + ); + } + @Test @DisplayName("카공 시작은 현재 시간으로부터 최소 3시간이후여야 한다.") void study_starts_3hours_after_now() { From 3b77b104e3710138461d58735b045b04d96f2764 Mon Sep 17 00:00:00 2001 From: donghyunkim Date: Wed, 10 Jul 2024 21:51:49 +0900 Subject: [PATCH 10/20] =?UTF-8?q?refactor:=20=EB=82=98=EB=85=B8=EC=B4=88?= =?UTF-8?q?=20=EA=B4=80=EB=A0=A8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../demo/service/study/StudyOnceServiceImpl.java | 5 +++-- .../domain/cafe/BusinessHourOpenCheckerTest.java | 12 ++++++------ .../demo/service/study/StudyOnceServiceImplTest.java | 10 +++++----- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/example/demo/service/study/StudyOnceServiceImpl.java b/src/main/java/com/example/demo/service/study/StudyOnceServiceImpl.java index 92926de..8057e48 100644 --- a/src/main/java/com/example/demo/service/study/StudyOnceServiceImpl.java +++ b/src/main/java/com/example/demo/service/study/StudyOnceServiceImpl.java @@ -174,10 +174,11 @@ public void updateAttendance(long leaderId, long studyOnceId, long memberId, Att private void validateLateToTakeAttendance(LocalDateTime now, LocalDateTime startDateTime, LocalDateTime endDateTime) { + LocalDateTime microNow = toMicroDateTime(now); Duration halfDuration = Duration.between(startDateTime, endDateTime).dividedBy(2); LocalDateTime midTime = startDateTime.plus(halfDuration); - - if (now.isAfter(midTime)) { + + if (microNow.isAfter(midTime)) { throw new CafegoryException(STUDY_ONCE_LATE_TAKE_ATTENDANCE); } } diff --git a/src/test/java/com/example/demo/domain/cafe/BusinessHourOpenCheckerTest.java b/src/test/java/com/example/demo/domain/cafe/BusinessHourOpenCheckerTest.java index 459ba28..8fe8243 100644 --- a/src/test/java/com/example/demo/domain/cafe/BusinessHourOpenCheckerTest.java +++ b/src/test/java/com/example/demo/domain/cafe/BusinessHourOpenCheckerTest.java @@ -156,15 +156,15 @@ private static Stream provideLocalDateTime4() { 3일 : 토 4일 : 일 */ - Arguments.of(LocalDateTime.of(2024, 1, 29, 21, 59, 59, 999_999), true), + Arguments.of(LocalDateTime.of(2024, 1, 29, 21, 59, 59, 999_999_000), true), Arguments.of(LocalDateTime.of(2024, 1, 29, 22, 0), false), - Arguments.of(LocalDateTime.of(2024, 1, 30, 23, 59, 59, 999_998), true), - Arguments.of(LocalDateTime.of(2024, 1, 30, 23, 59, 59, 999_999), false), - Arguments.of(LocalDateTime.of(2024, 2, 2, 23, 59, 59, 999_998), true), - Arguments.of(LocalDateTime.of(2024, 2, 2, 23, 59, 59, 999_999), false), + Arguments.of(LocalDateTime.of(2024, 1, 30, 23, 59, 59, 999_998_000), true), + Arguments.of(LocalDateTime.of(2024, 1, 30, 23, 59, 59, 999_999_000), false), + Arguments.of(LocalDateTime.of(2024, 2, 2, 23, 59, 59, 999_998_000), true), + Arguments.of(LocalDateTime.of(2024, 2, 2, 23, 59, 59, 999_999_000), false), Arguments.of(LocalDateTime.of(2024, 2, 3, 0, 0), true), Arguments.of(LocalDateTime.of(2024, 2, 4, 0, 0), true), - Arguments.of(LocalDateTime.of(2024, 2, 4, 21, 59, 59, 999_999), true), + Arguments.of(LocalDateTime.of(2024, 2, 4, 21, 59, 59, 999_999_000), true), Arguments.of(LocalDateTime.of(2024, 2, 4, 22, 0, 0), false) ); } diff --git a/src/test/java/com/example/demo/service/study/StudyOnceServiceImplTest.java b/src/test/java/com/example/demo/service/study/StudyOnceServiceImplTest.java index 3fdb844..dda5d9e 100644 --- a/src/test/java/com/example/demo/service/study/StudyOnceServiceImplTest.java +++ b/src/test/java/com/example/demo/service/study/StudyOnceServiceImplTest.java @@ -310,7 +310,7 @@ static Stream provideStartAndEndDateTime1() { ), Arguments.of( LocalDateTime.of(2999, 1, 1, 20, 0), - LocalDateTime.of(2999, 1, 1, 21, 0, 0, 1) + LocalDateTime.of(2999, 1, 1, 21, 0, 0, 100_000_000) ), Arguments.of( LocalDateTime.of(2999, 1, 1, 20, 59, 59, 999_999_999), @@ -360,8 +360,8 @@ void member_can_cancel_study_before_starts() { //when sut.tryQuit(member.getId(), studyOnce.getId()); //then - StudyOnce result = studyOnceRepository.findById(studyOnce.getId()).get(); - assertThat(result.getStudyMembers().size()).isEqualTo(1); + List result = studyMemberRepository.findAll(); + assertThat(result.size()).isEqualTo(1); } @Test @@ -398,7 +398,7 @@ void leader_can_not_check_attendance_10min_before_start() { Member member = memberSaveHelper.saveMember(thumbnailImage); StudyOnce studyOnce = studyOnceSaveHelper.saveStudyOnceWithTime(cafe, leader, start, end); sut.tryJoin(member.getId(), studyOnce.getId()); - LocalDateTime attendanceUpdateTime = start.plusMinutes(10).minusNanos(1); + LocalDateTime attendanceUpdateTime = start.plusMinutes(10).minusNanos(100_000_000); //when assertThatThrownBy( () -> sut.updateAttendance(leader.getId(), studyOnce.getId(), member.getId(), NO, attendanceUpdateTime)) @@ -440,7 +440,7 @@ void leader_can_not_check_attendance_after_half_whole_study_time() { Member member = memberSaveHelper.saveMember(thumbnailImage); StudyOnce studyOnce = studyOnceSaveHelper.saveStudyOnceWithTime(cafe, leader, start, end); sut.tryJoin(member.getId(), studyOnce.getId()); - LocalDateTime attendanceUpdateTime = start.plusHours(2).plusNanos(1); + LocalDateTime attendanceUpdateTime = start.plusHours(2).plusNanos(100_000_000); //when assertThatThrownBy( () -> sut.updateAttendance(leader.getId(), studyOnce.getId(), member.getId(), NO, attendanceUpdateTime)) From 2fb14dcc9f0f050d9c129e043461e8676496274a Mon Sep 17 00:00:00 2001 From: donghyunkim Date: Wed, 10 Jul 2024 22:13:02 +0900 Subject: [PATCH 11/20] =?UTF-8?q?refactor:=20LocalDateTime.now()=EB=A5=BC?= =?UTF-8?q?=20MicroTimeUtils=20=EB=A5=BC=20=ED=86=B5=ED=95=B4=20=EB=B3=80?= =?UTF-8?q?=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/demo/controller/StudyOnceController.java | 9 +++++---- src/main/java/com/example/demo/domain/BaseEntity.java | 6 ++++-- src/main/java/com/example/demo/domain/cafe/Cafe.java | 3 ++- .../example/demo/domain/cafe/CafeSearchCondition.java | 2 +- .../java/com/example/demo/domain/study/StudyOnce.java | 8 ++++---- .../demo/repository/study/StudyOnceRepositoryImpl.java | 4 +++- .../example/demo/service/profile/ProfileService.java | 4 +++- .../example/demo/service/study/StudyOnceService.java | 3 +-- .../demo/service/study/StudyOnceServiceImpl.java | 10 +++++----- .../com/example/demo/domain/study/StudyOnceTest.java | 6 +++--- .../demo/service/study/StudyOnceServiceImplTest.java | 4 ++-- 11 files changed, 33 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/example/demo/controller/StudyOnceController.java b/src/main/java/com/example/demo/controller/StudyOnceController.java index 01d8570..c11cee1 100644 --- a/src/main/java/com/example/demo/controller/StudyOnceController.java +++ b/src/main/java/com/example/demo/controller/StudyOnceController.java @@ -1,6 +1,7 @@ package com.example.demo.controller; import static com.example.demo.exception.ExceptionType.*; +import static com.example.demo.util.MicroTimeUtils.*; import java.time.LocalDateTime; @@ -96,7 +97,7 @@ public ResponseEntity update(@PathVariable Long studyOnceId, if (studyOnceService.doesOnlyStudyLeaderExist(studyOnceId)) { studyOnceService.updateStudyOnce(leaderId, studyOnceId, request, LocalDateTime.now()); } else { - studyOnceService.updateStudyOncePartially(leaderId, studyOnceId, request, LocalDateTime.now()); + studyOnceService.updateStudyOncePartially(leaderId, studyOnceId, request); } StudyOnceResponse response = studyOnceService.findStudyOnce(studyOnceId, LocalDateTime.now()); return ResponseEntity.ok(response); @@ -108,7 +109,7 @@ public ResponseEntity tryJoin(@PathVariable Long studyOnceI long memberId = cafegoryTokenManager.getIdentityId(authorization); LocalDateTime requestTime = LocalDateTime.now(); studyOnceService.tryJoin(memberId, studyOnceId); - return ResponseEntity.ok(new StudyOnceJoinResult(requestTime, true)); + return ResponseEntity.ok(new StudyOnceJoinResult(toMicroDateTime(requestTime), true)); } @DeleteMapping("/{studyOnceId:[0-9]+}") @@ -117,7 +118,7 @@ public ResponseEntity tryQuit(@PathVariable Long studyOnc long memberId = cafegoryTokenManager.getIdentityId(authorization); LocalDateTime requestTime = LocalDateTime.now(); studyOnceService.tryQuit(memberId, studyOnceId); - return ResponseEntity.ok(new StudyOnceQuitResponse(requestTime, true)); + return ResponseEntity.ok(new StudyOnceQuitResponse(toMicroDateTime(requestTime), true)); } @PatchMapping("/{studyOnceId:[0-9]+}/attendance") @@ -126,7 +127,7 @@ public ResponseEntity takeAttendance(@PathVariable Lon @RequestBody UpdateAttendanceRequest request) { long leaderId = cafegoryTokenManager.getIdentityId(authorization); UpdateAttendanceResponse response = studyOnceService.updateAttendances(leaderId, studyOnceId, - request, LocalDateTime.now()); + request, toMicroDateTime(LocalDateTime.now())); return ResponseEntity.ok(response); } diff --git a/src/main/java/com/example/demo/domain/BaseEntity.java b/src/main/java/com/example/demo/domain/BaseEntity.java index 9f9be85..f5ea91b 100644 --- a/src/main/java/com/example/demo/domain/BaseEntity.java +++ b/src/main/java/com/example/demo/domain/BaseEntity.java @@ -1,5 +1,7 @@ package com.example.demo.domain; +import static com.example.demo.util.MicroTimeUtils.*; + import java.time.LocalDateTime; import javax.persistence.Column; @@ -21,13 +23,13 @@ public class BaseEntity { @PrePersist public void prePersist() { - LocalDateTime now = LocalDateTime.now(); + LocalDateTime now = toMicroDateTime(LocalDateTime.now()); createdDate = now; lastModifiedDate = now; } @PreUpdate public void preUpdate() { - lastModifiedDate = LocalDateTime.now(); + lastModifiedDate = toMicroDateTime(LocalDateTime.now()); } } diff --git a/src/main/java/com/example/demo/domain/cafe/Cafe.java b/src/main/java/com/example/demo/domain/cafe/Cafe.java index 61d4004..dc8a05a 100644 --- a/src/main/java/com/example/demo/domain/cafe/Cafe.java +++ b/src/main/java/com/example/demo/domain/cafe/Cafe.java @@ -1,6 +1,7 @@ package com.example.demo.domain.cafe; import static com.example.demo.exception.ExceptionType.*; +import static com.example.demo.util.MicroTimeUtils.*; import java.time.DayOfWeek; import java.time.LocalDateTime; @@ -84,7 +85,7 @@ public String getRegion() { } public boolean isOpen(OpenChecker openChecker) { - return openChecker.checkWithBusinessHours(this.businessHours, LocalDateTime.now()); + return openChecker.checkWithBusinessHours(this.businessHours, toMicroDateTime(LocalDateTime.now())); } public OptionalDouble calcAverageRating() { diff --git a/src/main/java/com/example/demo/domain/cafe/CafeSearchCondition.java b/src/main/java/com/example/demo/domain/cafe/CafeSearchCondition.java index 23484e1..03abf7c 100644 --- a/src/main/java/com/example/demo/domain/cafe/CafeSearchCondition.java +++ b/src/main/java/com/example/demo/domain/cafe/CafeSearchCondition.java @@ -41,7 +41,7 @@ public static class Builder { private MinMenuPrice minMenuPrice; private LocalTime startTime; private LocalTime endTime; - private LocalDateTime now = LocalDateTime.now(); + private LocalDateTime now = toMicroDateTime(LocalDateTime.now()); public Builder(boolean isAbleToStudy, String region) { this.isAbleToStudy = isAbleToStudy; diff --git a/src/main/java/com/example/demo/domain/study/StudyOnce.java b/src/main/java/com/example/demo/domain/study/StudyOnce.java index 6eabc2d..9e92208 100644 --- a/src/main/java/com/example/demo/domain/study/StudyOnce.java +++ b/src/main/java/com/example/demo/domain/study/StudyOnce.java @@ -97,7 +97,7 @@ private StudyOnce(Long id, String name, Cafe cafe, LocalDateTime startDateTime, } private void validateStartDateTime(LocalDateTime startDateTime) { - LocalDateTime now = LocalDateTime.now(); + LocalDateTime now = toMicroDateTime(LocalDateTime.now()); Duration between = Duration.between(now, startDateTime); if (between.toSeconds() < 3 * 60 * 60) { throw new CafegoryException(ExceptionType.STUDY_ONCE_WRONG_START_TIME); @@ -169,7 +169,7 @@ private void validateDuplicateJoin(Member memberThatExpectedToJoin) { } private void validateJoinRequestTime(LocalDateTime requestTime) { - Duration between = Duration.between(requestTime, startDateTime); + Duration between = Duration.between(toMicroDateTime(requestTime), startDateTime); if (between.toSeconds() < 3600) { throw new CafegoryException(STUDY_ONCE_TOO_LATE_JOIN); } @@ -186,7 +186,7 @@ public StudyMember tryQuit(Member memberThatExpectedToQuit, LocalDateTime reques } private void validateQuitRequestTime(LocalDateTime requestTime) { - Duration between = Duration.between(requestTime, startDateTime); + Duration between = Duration.between(toMicroDateTime(requestTime), startDateTime); if (between.toSeconds() < 3600) { throw new CafegoryException(STUDY_ONCE_TOO_LATE_QUIT); } @@ -202,7 +202,7 @@ public boolean isLeader(Member member) { } public boolean canJoin(LocalDateTime baseDateTime) { - Duration between = Duration.between(baseDateTime, startDateTime); + Duration between = Duration.between(toMicroDateTime(baseDateTime), startDateTime); return between.toSeconds() >= 60 * 60; } diff --git a/src/main/java/com/example/demo/repository/study/StudyOnceRepositoryImpl.java b/src/main/java/com/example/demo/repository/study/StudyOnceRepositoryImpl.java index 9e5ff64..d2ad012 100644 --- a/src/main/java/com/example/demo/repository/study/StudyOnceRepositoryImpl.java +++ b/src/main/java/com/example/demo/repository/study/StudyOnceRepositoryImpl.java @@ -1,5 +1,7 @@ package com.example.demo.repository.study; +import static com.example.demo.util.MicroTimeUtils.*; + import java.time.LocalDateTime; import java.util.List; @@ -54,7 +56,7 @@ public Long count(StudyOnceSearchRequest studyOnceSearchRequest) { } private BooleanExpression studyJoinAbleFilter(boolean onlyJoinAble) { - LocalDateTime base = LocalDateTime.now().plusHours(3); + LocalDateTime base = toMicroDateTime(LocalDateTime.now()).plusHours(3); if (onlyJoinAble) { return qStudyOnce.startDateTime.after(base) .or(qStudyOnce.startDateTime.eq(base)); diff --git a/src/main/java/com/example/demo/service/profile/ProfileService.java b/src/main/java/com/example/demo/service/profile/ProfileService.java index 76c8c1b..e2ec7c7 100644 --- a/src/main/java/com/example/demo/service/profile/ProfileService.java +++ b/src/main/java/com/example/demo/service/profile/ProfileService.java @@ -1,5 +1,7 @@ package com.example.demo.service.profile; +import static com.example.demo.util.MicroTimeUtils.*; + import java.time.LocalDateTime; import org.springframework.transaction.annotation.Transactional; @@ -12,7 +14,7 @@ public interface ProfileService { @Transactional default ProfileGetResponse get(Long requestMemberId, Long targetMemberId) { - return get(requestMemberId, targetMemberId, LocalDateTime.now()); + return get(requestMemberId, targetMemberId, toMicroDateTime(LocalDateTime.now())); } ProfileGetResponse get(Long requestMemberId, Long targetMemberId, LocalDateTime baseDateTime); diff --git a/src/main/java/com/example/demo/service/study/StudyOnceService.java b/src/main/java/com/example/demo/service/study/StudyOnceService.java index c530d9b..ccbb273 100644 --- a/src/main/java/com/example/demo/service/study/StudyOnceService.java +++ b/src/main/java/com/example/demo/service/study/StudyOnceService.java @@ -45,6 +45,5 @@ UpdateAttendanceResponse updateAttendances(long leaderId, long studyOnceId, void updateStudyOnce(long requestedMemberId, long studyOnceId, StudyOnceUpdateRequest request, LocalDateTime now); - void updateStudyOncePartially(long requestedMemberId, long studyOnceId, StudyOnceUpdateRequest request, - LocalDateTime now); + void updateStudyOncePartially(long requestedMemberId, long studyOnceId, StudyOnceUpdateRequest request); } diff --git a/src/main/java/com/example/demo/service/study/StudyOnceServiceImpl.java b/src/main/java/com/example/demo/service/study/StudyOnceServiceImpl.java index 8057e48..d42e6f8 100644 --- a/src/main/java/com/example/demo/service/study/StudyOnceServiceImpl.java +++ b/src/main/java/com/example/demo/service/study/StudyOnceServiceImpl.java @@ -177,7 +177,7 @@ private void validateLateToTakeAttendance(LocalDateTime now, LocalDateTime start LocalDateTime microNow = toMicroDateTime(now); Duration halfDuration = Duration.between(startDateTime, endDateTime).dividedBy(2); LocalDateTime midTime = startDateTime.plus(halfDuration); - + if (microNow.isAfter(midTime)) { throw new CafegoryException(STUDY_ONCE_LATE_TAKE_ATTENDANCE); } @@ -244,7 +244,8 @@ public void updateStudyOnce(long requestedMemberId, long studyOnceId, StudyOnceU if (request.getStartDateTime() != null && request.getEndDateTime() != null) { Cafe cafe = studyOnce.getCafe(); validateBetweenBusinessHour(request.getStartDateTime().toLocalTime(), - request.getEndDateTime().toLocalTime(), cafe.findBusinessHour(now.getDayOfWeek())); + request.getEndDateTime().toLocalTime(), + cafe.findBusinessHour(toMicroDateTime(now).getDayOfWeek())); studyOnce.changeStudyOnceTime(request.getStartDateTime(), request.getEndDateTime()); } if (request.getOpenChatUrl() != null) { @@ -255,8 +256,7 @@ public void updateStudyOnce(long requestedMemberId, long studyOnceId, StudyOnceU } @Override - public void updateStudyOncePartially(long requestedMemberId, long studyOnceId, StudyOnceUpdateRequest request, - LocalDateTime now) { + public void updateStudyOncePartially(long requestedMemberId, long studyOnceId, StudyOnceUpdateRequest request) { StudyOnce studyOnce = findStudyOnceById(studyOnceId); if (!isStudyOnceLeader(requestedMemberId, studyOnceId)) { throw new CafegoryException(STUDY_ONCE_LEADER_PERMISSION_DENIED); @@ -287,7 +287,7 @@ public StudyMemberListResponse findStudyMembersById(Long studyOnceId) { @Override public StudyOnceResponse findStudyOnce(Long studyOnceId, LocalDateTime now) { StudyOnce studyOnce = findStudyOnceById(studyOnceId); - return studyOnceMapper.toStudyOnceResponse(studyOnce, studyOnce.canJoin(now)); + return studyOnceMapper.toStudyOnceResponse(studyOnce, studyOnce.canJoin(toMicroDateTime(now))); } @Override diff --git a/src/test/java/com/example/demo/domain/study/StudyOnceTest.java b/src/test/java/com/example/demo/domain/study/StudyOnceTest.java index 696feec..5d82929 100644 --- a/src/test/java/com/example/demo/domain/study/StudyOnceTest.java +++ b/src/test/java/com/example/demo/domain/study/StudyOnceTest.java @@ -46,7 +46,7 @@ private static Stream provideTimeAndExpected() { LocalDateTime start = NOW.plusHours(4); return Stream.of( Arguments.of(start.minusHours(1), start, true), - Arguments.of(start.minusHours(1).plusNanos(1), start, false) + Arguments.of(start.minusHours(1).plusNanos(100_000_000), start, false) ); } @@ -74,7 +74,7 @@ void join_fails_when_less_than_1hour_before_start() { StudyOnce sut = createStudyOnceWithTime(cafe, leader, NOW.plusHours(4), NOW.plusHours(6)); //when assertThatThrownBy( - () -> sut.tryJoin(member, NOW.plusHours(3).plusNanos(1))) + () -> sut.tryJoin(member, NOW.plusHours(3).plusNanos(100_000_000))) .isInstanceOf(CafegoryException.class) .hasMessage(STUDY_ONCE_TOO_LATE_JOIN.getErrorMessage()); } @@ -162,7 +162,7 @@ void can_not_quit_study_after_confirmation() { sut.tryJoin(member, NOW); //then assertThatThrownBy( - () -> sut.tryQuit(member, NOW.plusHours(3).plusNanos(1))) + () -> sut.tryQuit(member, NOW.plusHours(3).plusNanos(100_000_000))) .isInstanceOf(CafegoryException.class) .hasMessage(STUDY_ONCE_TOO_LATE_QUIT.getErrorMessage()); } diff --git a/src/test/java/com/example/demo/service/study/StudyOnceServiceImplTest.java b/src/test/java/com/example/demo/service/study/StudyOnceServiceImplTest.java index dda5d9e..cf4070b 100644 --- a/src/test/java/com/example/demo/service/study/StudyOnceServiceImplTest.java +++ b/src/test/java/com/example/demo/service/study/StudyOnceServiceImplTest.java @@ -622,7 +622,7 @@ void update_location_and_count_with_participants() { StudyOnceUpdateRequest request = new StudyOnceUpdateRequest(cafeId2, "변경된카공이름", start.plusHours(5), start.plusHours(6), 5, false, "오픈채팅방 링크"); //when - sut.updateStudyOncePartially(leader.getId(), studyOnce.getId(), request, LocalDateTime.now()); + sut.updateStudyOncePartially(leader.getId(), studyOnce.getId(), request); //then StudyOnce result = studyOnceRepository.findById(studyOnce.getId()).get(); assertAll( @@ -649,7 +649,7 @@ void non_leader_can_not_update_study_details_partially() { null, 5, true, null); //then assertThatThrownBy( - () -> sut.updateStudyOncePartially(member.getId(), studyOnce.getId(), request, LocalDateTime.now())) + () -> sut.updateStudyOncePartially(member.getId(), studyOnce.getId(), request)) .isInstanceOf(CafegoryException.class) .hasMessage(STUDY_ONCE_LEADER_PERMISSION_DENIED.getErrorMessage()); } From 2df5de3474809b60aca223de6af59f817e9c72a7 Mon Sep 17 00:00:00 2001 From: donghyunkim Date: Wed, 10 Jul 2024 22:22:27 +0900 Subject: [PATCH 12/20] =?UTF-8?q?refactor:=20LocalDateTime.now=EB=A5=BC=20?= =?UTF-8?q?MicroTimeUtils=EC=9D=98=20=EC=83=81=EC=88=98=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/demo/controller/StudyOnceController.java | 2 +- src/main/java/com/example/demo/domain/BaseEntity.java | 4 ++-- src/main/java/com/example/demo/domain/cafe/Cafe.java | 3 +-- .../com/example/demo/domain/cafe/CafeSearchCondition.java | 2 +- src/main/java/com/example/demo/domain/study/StudyOnce.java | 2 +- .../demo/repository/study/StudyOnceRepositoryImpl.java | 2 +- .../java/com/example/demo/service/profile/ProfileService.java | 2 +- src/main/java/com/example/demo/util/MicroTimeUtils.java | 2 ++ 8 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/example/demo/controller/StudyOnceController.java b/src/main/java/com/example/demo/controller/StudyOnceController.java index c11cee1..dbb1e4a 100644 --- a/src/main/java/com/example/demo/controller/StudyOnceController.java +++ b/src/main/java/com/example/demo/controller/StudyOnceController.java @@ -127,7 +127,7 @@ public ResponseEntity takeAttendance(@PathVariable Lon @RequestBody UpdateAttendanceRequest request) { long leaderId = cafegoryTokenManager.getIdentityId(authorization); UpdateAttendanceResponse response = studyOnceService.updateAttendances(leaderId, studyOnceId, - request, toMicroDateTime(LocalDateTime.now())); + request, MICRO_LOCAL_DATE_TIME_NOW); return ResponseEntity.ok(response); } diff --git a/src/main/java/com/example/demo/domain/BaseEntity.java b/src/main/java/com/example/demo/domain/BaseEntity.java index f5ea91b..38f2813 100644 --- a/src/main/java/com/example/demo/domain/BaseEntity.java +++ b/src/main/java/com/example/demo/domain/BaseEntity.java @@ -23,13 +23,13 @@ public class BaseEntity { @PrePersist public void prePersist() { - LocalDateTime now = toMicroDateTime(LocalDateTime.now()); + LocalDateTime now = MICRO_LOCAL_DATE_TIME_NOW; createdDate = now; lastModifiedDate = now; } @PreUpdate public void preUpdate() { - lastModifiedDate = toMicroDateTime(LocalDateTime.now()); + lastModifiedDate = MICRO_LOCAL_DATE_TIME_NOW; } } diff --git a/src/main/java/com/example/demo/domain/cafe/Cafe.java b/src/main/java/com/example/demo/domain/cafe/Cafe.java index dc8a05a..56398ab 100644 --- a/src/main/java/com/example/demo/domain/cafe/Cafe.java +++ b/src/main/java/com/example/demo/domain/cafe/Cafe.java @@ -4,7 +4,6 @@ import static com.example.demo.util.MicroTimeUtils.*; import java.time.DayOfWeek; -import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.OptionalDouble; @@ -85,7 +84,7 @@ public String getRegion() { } public boolean isOpen(OpenChecker openChecker) { - return openChecker.checkWithBusinessHours(this.businessHours, toMicroDateTime(LocalDateTime.now())); + return openChecker.checkWithBusinessHours(this.businessHours, MICRO_LOCAL_DATE_TIME_NOW); } public OptionalDouble calcAverageRating() { diff --git a/src/main/java/com/example/demo/domain/cafe/CafeSearchCondition.java b/src/main/java/com/example/demo/domain/cafe/CafeSearchCondition.java index 03abf7c..dfc32d3 100644 --- a/src/main/java/com/example/demo/domain/cafe/CafeSearchCondition.java +++ b/src/main/java/com/example/demo/domain/cafe/CafeSearchCondition.java @@ -41,7 +41,7 @@ public static class Builder { private MinMenuPrice minMenuPrice; private LocalTime startTime; private LocalTime endTime; - private LocalDateTime now = toMicroDateTime(LocalDateTime.now()); + private LocalDateTime now = MICRO_LOCAL_DATE_TIME_NOW; public Builder(boolean isAbleToStudy, String region) { this.isAbleToStudy = isAbleToStudy; diff --git a/src/main/java/com/example/demo/domain/study/StudyOnce.java b/src/main/java/com/example/demo/domain/study/StudyOnce.java index 9e92208..699b1f0 100644 --- a/src/main/java/com/example/demo/domain/study/StudyOnce.java +++ b/src/main/java/com/example/demo/domain/study/StudyOnce.java @@ -97,7 +97,7 @@ private StudyOnce(Long id, String name, Cafe cafe, LocalDateTime startDateTime, } private void validateStartDateTime(LocalDateTime startDateTime) { - LocalDateTime now = toMicroDateTime(LocalDateTime.now()); + LocalDateTime now = MICRO_LOCAL_DATE_TIME_NOW; Duration between = Duration.between(now, startDateTime); if (between.toSeconds() < 3 * 60 * 60) { throw new CafegoryException(ExceptionType.STUDY_ONCE_WRONG_START_TIME); diff --git a/src/main/java/com/example/demo/repository/study/StudyOnceRepositoryImpl.java b/src/main/java/com/example/demo/repository/study/StudyOnceRepositoryImpl.java index d2ad012..b282828 100644 --- a/src/main/java/com/example/demo/repository/study/StudyOnceRepositoryImpl.java +++ b/src/main/java/com/example/demo/repository/study/StudyOnceRepositoryImpl.java @@ -56,7 +56,7 @@ public Long count(StudyOnceSearchRequest studyOnceSearchRequest) { } private BooleanExpression studyJoinAbleFilter(boolean onlyJoinAble) { - LocalDateTime base = toMicroDateTime(LocalDateTime.now()).plusHours(3); + LocalDateTime base = MICRO_LOCAL_DATE_TIME_NOW.plusHours(3); if (onlyJoinAble) { return qStudyOnce.startDateTime.after(base) .or(qStudyOnce.startDateTime.eq(base)); diff --git a/src/main/java/com/example/demo/service/profile/ProfileService.java b/src/main/java/com/example/demo/service/profile/ProfileService.java index e2ec7c7..b508eea 100644 --- a/src/main/java/com/example/demo/service/profile/ProfileService.java +++ b/src/main/java/com/example/demo/service/profile/ProfileService.java @@ -14,7 +14,7 @@ public interface ProfileService { @Transactional default ProfileGetResponse get(Long requestMemberId, Long targetMemberId) { - return get(requestMemberId, targetMemberId, toMicroDateTime(LocalDateTime.now())); + return get(requestMemberId, targetMemberId, MICRO_LOCAL_DATE_TIME_NOW); } ProfileGetResponse get(Long requestMemberId, Long targetMemberId, LocalDateTime baseDateTime); diff --git a/src/main/java/com/example/demo/util/MicroTimeUtils.java b/src/main/java/com/example/demo/util/MicroTimeUtils.java index 5473e13..78a94fd 100644 --- a/src/main/java/com/example/demo/util/MicroTimeUtils.java +++ b/src/main/java/com/example/demo/util/MicroTimeUtils.java @@ -2,10 +2,12 @@ import java.time.LocalDateTime; import java.time.LocalTime; +import java.time.temporal.ChronoUnit; public class MicroTimeUtils { public static final LocalTime MAX_LOCAL_TIME = LocalTime.of(23, 59, 59, 999_999_000); + public static final LocalDateTime MICRO_LOCAL_DATE_TIME_NOW = LocalDateTime.now().truncatedTo(ChronoUnit.MICROS); public static LocalTime toMicroTime(LocalTime time) { return time.withNano((time.getNano() / 1000) * 1000); From 71555844609ecc4f88bf6c06f84bcde51b4dc563 Mon Sep 17 00:00:00 2001 From: donghyunkim Date: Wed, 10 Jul 2024 23:01:32 +0900 Subject: [PATCH 13/20] =?UTF-8?q?refactor:=20microUtils=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../demo/controller/StudyOnceController.java | 3 +-- .../domain/cafe/BusinessHourOpenChecker.java | 27 +++++++++++-------- .../example/demo/domain/study/StudyOnce.java | 4 +-- .../service/study/StudyOnceServiceImpl.java | 15 ++++++----- .../com/example/demo/util/MicroTimeUtils.java | 4 +-- .../cafe/BusinessHourOpenCheckerTest.java | 14 +++++----- .../study/StudyOnceServiceImplTest.java | 4 +-- 7 files changed, 38 insertions(+), 33 deletions(-) diff --git a/src/main/java/com/example/demo/controller/StudyOnceController.java b/src/main/java/com/example/demo/controller/StudyOnceController.java index dbb1e4a..158760e 100644 --- a/src/main/java/com/example/demo/controller/StudyOnceController.java +++ b/src/main/java/com/example/demo/controller/StudyOnceController.java @@ -107,9 +107,8 @@ public ResponseEntity update(@PathVariable Long studyOnceId, public ResponseEntity tryJoin(@PathVariable Long studyOnceId, @RequestHeader("Authorization") String authorization) { long memberId = cafegoryTokenManager.getIdentityId(authorization); - LocalDateTime requestTime = LocalDateTime.now(); studyOnceService.tryJoin(memberId, studyOnceId); - return ResponseEntity.ok(new StudyOnceJoinResult(toMicroDateTime(requestTime), true)); + return ResponseEntity.ok(new StudyOnceJoinResult(MICRO_LOCAL_DATE_TIME_NOW, true)); } @DeleteMapping("/{studyOnceId:[0-9]+}") diff --git a/src/main/java/com/example/demo/domain/cafe/BusinessHourOpenChecker.java b/src/main/java/com/example/demo/domain/cafe/BusinessHourOpenChecker.java index c9e61be..19bc49f 100644 --- a/src/main/java/com/example/demo/domain/cafe/BusinessHourOpenChecker.java +++ b/src/main/java/com/example/demo/domain/cafe/BusinessHourOpenChecker.java @@ -1,5 +1,7 @@ package com.example.demo.domain.cafe; +import static com.example.demo.util.MicroTimeUtils.*; + import java.time.DayOfWeek; import java.time.LocalDate; import java.time.LocalDateTime; @@ -8,7 +10,6 @@ import com.example.demo.exception.CafegoryException; import com.example.demo.exception.ExceptionType; -import com.example.demo.util.MicroTimeUtils; public class BusinessHourOpenChecker implements OpenChecker { @@ -41,7 +42,7 @@ private boolean isTodayBusinessDay(DayOfWeek businessDay, LocalDateTime now, boo } private boolean is24HourBusiness(LocalTime startTime, LocalTime endTime) { - return startTime.equals(LocalTime.MIN) && endTime.equals(MicroTimeUtils.MAX_LOCAL_TIME); + return startTime.equals(LocalTime.MIN) && endTime.equals(MAX_LOCAL_TIME); } private boolean isOpenOvernight(LocalTime startTime, LocalTime endTime) { @@ -59,7 +60,7 @@ private boolean isOpenDuringDay(LocalTime startTime, LocalTime endTime, LocalTim @Override public boolean checkWithBusinessHours(List businessHours, LocalDateTime now) { - if (!hasMatchingDayOfWeek(businessHours, now)) { + if (!hasMatchingDayOfWeek(businessHours, toMicroDateTime(now))) { throw new CafegoryException(ExceptionType.CAFE_NOT_FOUND_DAY_OF_WEEK); } return businessHours.stream() @@ -69,23 +70,27 @@ public boolean checkWithBusinessHours(List businessHours, LocalDat public boolean checkBetweenBusinessHours(LocalTime businessStartTime, LocalTime businessEndTime, LocalTime chosenStartTime, LocalTime chosenEndTime) { + LocalTime microChosenStartTime = toMicroTime(chosenStartTime); + LocalTime microChosenEndTime = toMicroTime(chosenEndTime); + // 영업 시작시간이 당일, 영업 종료시간이 당일 if (businessStartTime.isBefore(businessEndTime)) { - return (businessStartTime.equals(chosenStartTime) || businessStartTime.isBefore(chosenStartTime)) && ( - businessEndTime.equals(chosenEndTime) || businessEndTime.isAfter(chosenEndTime)); + return (businessStartTime.equals(microChosenStartTime) || businessStartTime.isBefore(microChosenStartTime)) + && ( + businessEndTime.equals(microChosenEndTime) || businessEndTime.isAfter(microChosenEndTime)); } // 영업 시작시간이 당일, 영업 종료시간이 다음날 if (businessStartTime.isAfter(businessEndTime)) { LocalDateTime businessStartDateTime = LocalDateTime.of(LocalDate.now(), businessStartTime); LocalDateTime businessEndDateTime = LocalDateTime.of(LocalDate.now().plusDays(1), businessEndTime); // 선택된 시작시간이 당일, 선택된 종료시간이 당일 || 선택된 시작시간이 다음날, 선택된 종료시간이 다음날 - if (chosenStartTime.isBefore(chosenEndTime)) { + if (microChosenStartTime.isBefore(microChosenEndTime)) { LocalDate chosenDate = LocalDate.now(); - boolean isChosenTimeOvernight = businessStartTime.isAfter(chosenStartTime); + boolean isChosenTimeOvernight = businessStartTime.isAfter(microChosenStartTime); LocalDate date = isChosenTimeOvernight ? chosenDate.plusDays(1) : chosenDate; LocalDateTime chosenStartDateTime = LocalDateTime.of(date, chosenStartTime); - LocalDateTime chosenEndDateTime = LocalDateTime.of(date, chosenEndTime); + LocalDateTime chosenEndDateTime = LocalDateTime.of(date, microChosenEndTime); return (businessStartDateTime.isBefore(chosenStartDateTime) || businessStartDateTime.equals( chosenStartDateTime)) @@ -93,9 +98,9 @@ public boolean checkBetweenBusinessHours(LocalTime businessStartTime, LocalTime chosenEndDateTime)); } // 선택된 시작시간이 당일, 선택된 종료시간이 다음날 - if (chosenStartTime.isAfter(chosenEndTime)) { - LocalDateTime chosenStartDateTime = LocalDateTime.of(LocalDate.now(), chosenStartTime); - LocalDateTime chosenEndDateTime = LocalDateTime.of(LocalDate.now().plusDays(1), chosenEndTime); + if (microChosenStartTime.isAfter(microChosenEndTime)) { + LocalDateTime chosenStartDateTime = LocalDateTime.of(LocalDate.now(), microChosenStartTime); + LocalDateTime chosenEndDateTime = LocalDateTime.of(LocalDate.now().plusDays(1), microChosenEndTime); return (businessStartDateTime.equals(chosenStartDateTime) || businessStartDateTime.isBefore( chosenStartDateTime)) && (businessEndDateTime.equals(chosenEndDateTime) || businessEndDateTime.isAfter(chosenEndDateTime)); diff --git a/src/main/java/com/example/demo/domain/study/StudyOnce.java b/src/main/java/com/example/demo/domain/study/StudyOnce.java index 699b1f0..cbf613e 100644 --- a/src/main/java/com/example/demo/domain/study/StudyOnce.java +++ b/src/main/java/com/example/demo/domain/study/StudyOnce.java @@ -169,7 +169,7 @@ private void validateDuplicateJoin(Member memberThatExpectedToJoin) { } private void validateJoinRequestTime(LocalDateTime requestTime) { - Duration between = Duration.between(toMicroDateTime(requestTime), startDateTime); + Duration between = Duration.between(requestTime, startDateTime); if (between.toSeconds() < 3600) { throw new CafegoryException(STUDY_ONCE_TOO_LATE_JOIN); } @@ -186,7 +186,7 @@ public StudyMember tryQuit(Member memberThatExpectedToQuit, LocalDateTime reques } private void validateQuitRequestTime(LocalDateTime requestTime) { - Duration between = Duration.between(toMicroDateTime(requestTime), startDateTime); + Duration between = Duration.between(requestTime, startDateTime); if (between.toSeconds() < 3600) { throw new CafegoryException(STUDY_ONCE_TOO_LATE_QUIT); } diff --git a/src/main/java/com/example/demo/service/study/StudyOnceServiceImpl.java b/src/main/java/com/example/demo/service/study/StudyOnceServiceImpl.java index d42e6f8..15dd67c 100644 --- a/src/main/java/com/example/demo/service/study/StudyOnceServiceImpl.java +++ b/src/main/java/com/example/demo/service/study/StudyOnceServiceImpl.java @@ -159,26 +159,27 @@ private void processAttendanceUpdates(long leaderId, long studyOnceId, UpdateAtt @Override public void updateAttendance(long leaderId, long studyOnceId, long memberId, Attendance attendance, LocalDateTime now) { + LocalDateTime microNow = toMicroDateTime(now); StudyOnce searched = findStudyOnceById(studyOnceId); + if (!studyOnceRepository.existsByLeaderId(leaderId)) { throw new CafegoryException(STUDY_ONCE_INVALID_LEADER); } - validateEarlyToTakeAttendance(now, searched.getStartDateTime()); - validateLateToTakeAttendance(now, searched.getStartDateTime(), searched.getEndDateTime()); + validateEarlyToTakeAttendance(microNow, searched.getStartDateTime()); + validateLateToTakeAttendance(microNow, searched.getStartDateTime(), searched.getEndDateTime()); StudyMember findStudyMember = studyMemberRepository.findById(new StudyMemberId(memberId, studyOnceId)) .orElseThrow(() -> new CafegoryException(STUDY_MEMBER_NOT_FOUND)); findStudyMember.setAttendance(attendance); - findStudyMember.setLastModifiedDate(now); + findStudyMember.setLastModifiedDate(microNow); } private void validateLateToTakeAttendance(LocalDateTime now, LocalDateTime startDateTime, LocalDateTime endDateTime) { - LocalDateTime microNow = toMicroDateTime(now); Duration halfDuration = Duration.between(startDateTime, endDateTime).dividedBy(2); LocalDateTime midTime = startDateTime.plus(halfDuration); - if (microNow.isAfter(midTime)) { + if (now.isAfter(midTime)) { throw new CafegoryException(STUDY_ONCE_LATE_TAKE_ATTENDANCE); } } @@ -199,8 +200,8 @@ public StudyOnceCreateResponse createStudy(long leaderId, StudyOnceCreateRequest Cafe cafe = findCafeById(request.getCafeId()); BusinessHour businessHour = cafe.findBusinessHour(request.getStartDateTime().getDayOfWeek()); validateBetweenBusinessHour( - toMicroTime(request.getStartDateTime().toLocalTime()), - toMicroTime(request.getEndDateTime().toLocalTime()), + request.getStartDateTime().toLocalTime(), + request.getEndDateTime().toLocalTime(), businessHour); Member leader = findMemberById(leaderId); validateStudyScheduleConflict( diff --git a/src/main/java/com/example/demo/util/MicroTimeUtils.java b/src/main/java/com/example/demo/util/MicroTimeUtils.java index 78a94fd..bba6885 100644 --- a/src/main/java/com/example/demo/util/MicroTimeUtils.java +++ b/src/main/java/com/example/demo/util/MicroTimeUtils.java @@ -10,10 +10,10 @@ public class MicroTimeUtils { public static final LocalDateTime MICRO_LOCAL_DATE_TIME_NOW = LocalDateTime.now().truncatedTo(ChronoUnit.MICROS); public static LocalTime toMicroTime(LocalTime time) { - return time.withNano((time.getNano() / 1000) * 1000); + return time == null ? null : time.withNano((time.getNano() / 1000) * 1000); } public static LocalDateTime toMicroDateTime(LocalDateTime dateTime) { - return dateTime.withNano((dateTime.getNano() / 1000) * 1000); + return dateTime == null ? null : dateTime.withNano((dateTime.getNano() / 1000) * 1000); } } diff --git a/src/test/java/com/example/demo/domain/cafe/BusinessHourOpenCheckerTest.java b/src/test/java/com/example/demo/domain/cafe/BusinessHourOpenCheckerTest.java index 8fe8243..08009d8 100644 --- a/src/test/java/com/example/demo/domain/cafe/BusinessHourOpenCheckerTest.java +++ b/src/test/java/com/example/demo/domain/cafe/BusinessHourOpenCheckerTest.java @@ -193,7 +193,7 @@ private static Stream provideChosenTimeAndExpected() { true ), Arguments.of( - LocalTime.of(9, 0, 0, 1), + LocalTime.of(9, 0, 0, 100_000_000), LocalTime.of(21, 0), true ), @@ -203,7 +203,7 @@ private static Stream provideChosenTimeAndExpected() { true ), Arguments.of( - LocalTime.of(9, 0, 0, 1), + LocalTime.of(9, 0, 0, 100_000_000), LocalTime.of(20, 59, 59, 999_999_999), true ), @@ -214,12 +214,12 @@ private static Stream provideChosenTimeAndExpected() { ), Arguments.of( LocalTime.of(9, 0, 0), - LocalTime.of(21, 0, 0, 1), + LocalTime.of(21, 0, 0, 100_000_000), false ), Arguments.of( LocalTime.of(8, 59, 59, 999_999_999), - LocalTime.of(21, 0, 0, 1), + LocalTime.of(21, 0, 0, 100_000_000), false ) ); @@ -287,7 +287,7 @@ private static Stream provideChosenTimeAndExpected4() { ), Arguments.of( LocalTime.of(23, 0), - LocalTime.of(2, 0, 0, 1), + LocalTime.of(2, 0, 0, 100_000_000), false ), Arguments.of( @@ -302,7 +302,7 @@ private static Stream provideChosenTimeAndExpected4() { ), Arguments.of( LocalTime.of(0, 0), - LocalTime.of(2, 0, 0, 1), + LocalTime.of(2, 0, 0, 100_000_000), false ), Arguments.of( @@ -317,7 +317,7 @@ private static Stream provideChosenTimeAndExpected4() { ), Arguments.of( LocalTime.of(7, 0), - LocalTime.of(2, 0, 0, 1), + LocalTime.of(2, 0, 0, 100_000_000), false ) ); diff --git a/src/test/java/com/example/demo/service/study/StudyOnceServiceImplTest.java b/src/test/java/com/example/demo/service/study/StudyOnceServiceImplTest.java index cf4070b..ba61733 100644 --- a/src/test/java/com/example/demo/service/study/StudyOnceServiceImplTest.java +++ b/src/test/java/com/example/demo/service/study/StudyOnceServiceImplTest.java @@ -562,11 +562,11 @@ static Stream provideStartAndEndDateTime3() { ), Arguments.of( LocalDateTime.of(2999, 1, 1, 8, 0), - LocalDateTime.of(2999, 1, 1, 9, 0, 0, 1) + LocalDateTime.of(2999, 1, 1, 9, 0, 0, 100_000_000) ), Arguments.of( LocalDateTime.of(2999, 1, 1, 20, 0), - LocalDateTime.of(2999, 1, 1, 21, 0, 0, 1) + LocalDateTime.of(2999, 1, 1, 21, 0, 0, 100_000_000) ), Arguments.of( LocalDateTime.of(2999, 1, 1, 20, 59, 59, 999_999_999), From fdb230196466fe65053fcb8e881aedaf45d4bc9b Mon Sep 17 00:00:00 2001 From: donghyunkim Date: Fri, 12 Jul 2024 14:20:33 +0900 Subject: [PATCH 14/20] =?UTF-8?q?refactor:=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/demo/utils/DatabaseCleanup.java | 30 ++++--------------- 1 file changed, 5 insertions(+), 25 deletions(-) diff --git a/src/test/java/com/example/demo/utils/DatabaseCleanup.java b/src/test/java/com/example/demo/utils/DatabaseCleanup.java index cc6bead..501b266 100644 --- a/src/test/java/com/example/demo/utils/DatabaseCleanup.java +++ b/src/test/java/com/example/demo/utils/DatabaseCleanup.java @@ -17,59 +17,39 @@ public class DatabaseCleanup { @PersistenceContext private EntityManager em; - private List tableNames; @PostConstruct public void afterPropertiesSet() { - // tableNames = em.getMetamodel().getEntities().stream() - // .filter(e -> e.getJavaType().getAnnotation(Entity.class) != null) - // .map(e -> convertCamelCaseToSnakeCase(e.getName())) - // .collect(Collectors.toList()); tableNames = em.getMetamodel().getEntities().stream() .map(this::getTableName) .collect(Collectors.toList()); } private String getTableName(EntityType entityType) { - String tableName; Class javaType = entityType.getJavaType(); - // @Table 어노테이션이 있는 경우 테이블 이름 가져오기 if (javaType.isAnnotationPresent(Table.class)) { Table table = javaType.getAnnotation(Table.class); - tableName = table.name(); - } else { - // @Table 어노테이션이 없는 경우 엔티티 이름에서 테이블 이름으로 변환 - tableName = convertCamelCaseToSnakeCase(entityType.getName()); + return table.name(); } - - return tableName; + // @Table 어노테이션이 없는 경우 엔티티 이름에서 테이블 이름으로 변환 + return convertCamelCaseToSnakeCase(entityType.getName()); } @Transactional public void execute() { em.flush(); - afterPropertiesSet(); - // em.createNativeQuery("SET FOREIGN_KEY_CHECKS = 0").executeUpdate(); for (String tableName : tableNames) { em.createNativeQuery("TRUNCATE TABLE " + tableName).executeUpdate(); } - - // em.createNativeQuery("SET FOREIGN_KEY_CHECKS = 1").executeUpdate(); } - private static String convertCamelCaseToSnakeCase(String input) { + private String convertCamelCaseToSnakeCase(String input) { if (input == null) { return null; } - - String regex = "([a-z])([A-Z]+)"; - String replacement = "$1_$2"; - - return input - .replaceAll(regex, replacement) - .toLowerCase(); + return input.replaceAll("([a-z])([A-Z]+)", "$1_$2").toLowerCase(); } } From baba15c994196ac5db1f0a176a48c769a8bed436 Mon Sep 17 00:00:00 2001 From: donghyunkim Date: Fri, 12 Jul 2024 14:28:59 +0900 Subject: [PATCH 15/20] =?UTF-8?q?refactor:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/demo/domain/cafe/Address.java | 4 ---- src/main/java/com/example/demo/mapper/CafeMapper.java | 3 --- .../com/example/demo/service/cafe/CafeServiceImpl.java | 2 -- .../example/demo/service/study/StudyOnceServiceImpl.java | 8 -------- src/test/java/com/example/demo/helper/CafeSaveHelper.java | 5 ----- 5 files changed, 22 deletions(-) diff --git a/src/main/java/com/example/demo/domain/cafe/Address.java b/src/main/java/com/example/demo/domain/cafe/Address.java index 0f2f2c9..65aa78c 100644 --- a/src/main/java/com/example/demo/domain/cafe/Address.java +++ b/src/main/java/com/example/demo/domain/cafe/Address.java @@ -19,10 +19,6 @@ public Address(final String fullAddress, final String region) { this.region = region; } - public boolean isInRegion(String region) { - return true; - } - public String showFullAddress() { return getFullAddress(); } diff --git a/src/main/java/com/example/demo/mapper/CafeMapper.java b/src/main/java/com/example/demo/mapper/CafeMapper.java index 45c9c61..e8ab7bc 100644 --- a/src/main/java/com/example/demo/mapper/CafeMapper.java +++ b/src/main/java/com/example/demo/mapper/CafeMapper.java @@ -14,7 +14,6 @@ import com.example.demo.dto.cafe.CafeSearchListRequest; import com.example.demo.dto.cafe.CafeSearchListResponse; import com.example.demo.dto.cafe.CafeSearchResponse; -import com.example.demo.dto.cafe.CafeSearchReviewResponse; import com.example.demo.dto.cafe.CafeSearchSnsResponse; import com.example.demo.dto.cafe.CafeSearchStudyOnceResponse; import com.example.demo.dto.cafe.SnsResponse; @@ -90,7 +89,6 @@ public CafeSearchResponse toCafeSearchResponse( Cafe findCafe, List cafeSearchBusinessHourResponses, List cafeSearchSnsResponses, - List cafeSearchReviewResponses, List cafeSearchStudyOnceResponses, OpenChecker openChecker) { return CafeSearchResponse.builder() @@ -117,7 +115,6 @@ public CafeSearchResponse toCafeSearchResponseWithEmptyInfo( Cafe findCafe, List businessHourResponses, List snsResponses, - List reviewResponses, OpenChecker openChecker ) { return CafeSearchResponse.builder() diff --git a/src/main/java/com/example/demo/service/cafe/CafeServiceImpl.java b/src/main/java/com/example/demo/service/cafe/CafeServiceImpl.java index 57fc485..b0067be 100644 --- a/src/main/java/com/example/demo/service/cafe/CafeServiceImpl.java +++ b/src/main/java/com/example/demo/service/cafe/CafeServiceImpl.java @@ -77,7 +77,6 @@ public CafeSearchResponse searchCafeForMemberByCafeId(Long cafeId, Long memberId findCafe, businessHourMapper.toCafeSearchBusinessHourResponses(findCafe.getBusinessHours()), snsDetailMapper.toCafeSearchSnsResponses(findCafe.getSnsDetails()), - reviewMapper.toCafeSearchReviewResponses(findCafe.getReviews()), studyOnceMapper.toCafeSearchStudyOnceResponse(findCafe), openChecker ); @@ -90,7 +89,6 @@ public CafeSearchResponse searchCafeForNotMemberByCafeId(Long cafeId) { findCafe, businessHourMapper.toCafeSearchBusinessHourResponses(findCafe.getBusinessHours()), snsDetailMapper.toCafeSearchSnsResponses(findCafe.getSnsDetails()), - reviewMapper.toCafeSearchReviewResponses(findCafe.getReviews()), openChecker ); } diff --git a/src/main/java/com/example/demo/service/study/StudyOnceServiceImpl.java b/src/main/java/com/example/demo/service/study/StudyOnceServiceImpl.java index 15dd67c..09b5764 100644 --- a/src/main/java/com/example/demo/service/study/StudyOnceServiceImpl.java +++ b/src/main/java/com/example/demo/service/study/StudyOnceServiceImpl.java @@ -312,12 +312,4 @@ private Cafe findCafeById(Long cafeId) { return cafeRepository.findById(cafeId) .orElseThrow(() -> new CafegoryException(CAFE_NOT_FOUND)); } - - private Member getMember(long leaderId, LocalDateTime startDateTime) { - Member leader = memberRepository.findById(leaderId) - .orElseThrow(() -> new CafegoryException(MEMBER_NOT_FOUND)); - var studyMembers = studyMemberRepository.findByMemberAndStudyDate(leader, startDateTime.toLocalDate()); - // leader.setStudyMembers(studyMembers); - return leader; - } } diff --git a/src/test/java/com/example/demo/helper/CafeSaveHelper.java b/src/test/java/com/example/demo/helper/CafeSaveHelper.java index 09c5dcf..5b1b6a8 100644 --- a/src/test/java/com/example/demo/helper/CafeSaveHelper.java +++ b/src/test/java/com/example/demo/helper/CafeSaveHelper.java @@ -27,11 +27,6 @@ public Cafe saveCafe() { return cafeRepository.save(cafe); } - public Cafe saveCafeWithBusinessHour(List businessHours) { - Cafe cafe = TestCafeFactory.createCafeWithBusinessHours(businessHours); - return cafeRepository.save(cafe); - } - public Cafe saveCafeWith7daysFrom9To21() { Cafe cafe = TestCafeFactory.createCafe(); List businessHours = createBusinessHoursWith7daysFrom9To21(cafe); From adfbf426cdd14fb15ec114237fa36a57f931d5ee Mon Sep 17 00:00:00 2001 From: donghyunkim Date: Fri, 12 Jul 2024 21:03:30 +0900 Subject: [PATCH 16/20] =?UTF-8?q?docs:=20application-test.yml=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +- src/test/resources/application-test.yml | 53 +++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 src/test/resources/application-test.yml diff --git a/.gitignore b/.gitignore index 3aefae5..4401768 100644 --- a/.gitignore +++ b/.gitignore @@ -42,4 +42,5 @@ application-pub.yml application-local.yml application-*.yml application_log -*.gz \ No newline at end of file +*.gz +!**/src/test/resources/application-test.yml \ No newline at end of file diff --git a/src/test/resources/application-test.yml b/src/test/resources/application-test.yml new file mode 100644 index 0000000..96533ff --- /dev/null +++ b/src/test/resources/application-test.yml @@ -0,0 +1,53 @@ +server: + port: 8080 +spring: + datasource: #연결할 디비의 이름 + driver-class-name: org.mariadb.jdbc.Driver #디비 종류 + url: jdbc:mariadb://localhost:3306/cafegory_test + # username: cafegory + username: cafegory_test + # password: cafegory!Q@W#E + password: 1234 + jpa: #jpa 종류 + hibernate: + ddl-auto: create + properties: + hibernate: + format_sql: true #이쁘게 해줌 + dialect: org.hibernate.dialect.MariaDBDialect + mail: + host: smtp.gmail.com + port: 587 + username: test-cafegory@gmail.com + password: test cafe gory pass + + properties: + mail: + smtp: + auth: true + starttls: + enable: true + +logging: + level: + org.hibernate.SQL: trace #콘솔에 남기는게 아니라 로그로 남음. + org.hibernate.type: trace #바인딩된 파라미터까지 볼 수 있음 + +oauth: + kakao: + client-id: test-kakao-client-id + url: + auth: https://kauth.kakao.com + api: https://kapi.kakao.com + naver: + client-id: test-naver-client-id + client-secret: test-naver-client-secret + url: + auth: https://nid.naver.com + api: https://openapi.naver.com + +jwt: + secret: 01234567890123456789012345678901234567890123456789 + +mail: + from: cafegory@gmail.com From de13aa63bcc765808745ca45a9995362562036a9 Mon Sep 17 00:00:00 2001 From: donghyunkim Date: Fri, 12 Jul 2024 21:04:26 +0900 Subject: [PATCH 17/20] =?UTF-8?q?docs:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=ED=8C=A8=ED=82=A4=EC=A7=80=EC=97=90=20=EC=9E=88=EB=8A=94=20app?= =?UTF-8?q?lication.yml=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/resources/application.yml | 50 ------------------------------ 1 file changed, 50 deletions(-) delete mode 100644 src/test/resources/application.yml diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml deleted file mode 100644 index 1ef8a4c..0000000 --- a/src/test/resources/application.yml +++ /dev/null @@ -1,50 +0,0 @@ -server: - port: 8080 -spring: - datasource: #연결할 디비의 이름 - driver-class-name: org.h2.Driver #디비 종류 - url: jdbc:h2:~/test - username: "sa" - password: "" - jpa: #jpa 종류 - hibernate: - ddl-auto: create - properties: - hibernate: - format_sql: true #이쁘게 해줌 - mail: - host: smtp.gmail.com - port: 587 - username: test-cafegory@gmail.com - password: test cafe gory pass - - properties: - mail: - smtp: - auth: true - starttls: - enable: true - -logging: - level: - org.hibernate.SQL: trace #콘솔에 남기는게 아니라 로그로 남음. - org.hibernate.type: trace #바인딩된 파라미터까지 볼 수 있음 - -oauth: - kakao: - client-id: test-kakao-client-id - url: - auth: https://kauth.kakao.com - api: https://kapi.kakao.com - naver: - client-id: test-naver-client-id - client-secret: test-naver-client-secret - url: - auth: https://nid.naver.com - api: https://openapi.naver.com - -jwt: - secret: 01234567890123456789012345678901234567890123456789 - -mail: - from: cafegory@gmail.com From a012e34179a36b59d64df983dfdc82e748800177 Mon Sep 17 00:00:00 2001 From: donghyunkim Date: Fri, 12 Jul 2024 21:30:31 +0900 Subject: [PATCH 18/20] =?UTF-8?q?refactor:=20=EC=8B=9C=EA=B0=84=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EC=BD=94=EB=93=9C=20micro=EB=8B=A8=EC=9C=84?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EC=B4=88=EB=8B=A8=EC=9C=84=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../demo/controller/StudyOnceController.java | 9 ++++--- .../com/example/demo/domain/BaseEntity.java | 6 ++--- .../domain/cafe/BusinessHourOpenChecker.java | 24 ++++++++--------- .../com/example/demo/domain/cafe/Cafe.java | 4 +-- .../demo/domain/cafe/CafeSearchCondition.java | 4 +-- .../example/demo/domain/study/StudyOnce.java | 6 ++--- .../study/StudyOnceRepositoryImpl.java | 4 +-- .../demo/service/profile/ProfileService.java | 4 +-- .../service/study/StudyOnceServiceImpl.java | 13 +++++----- .../com/example/demo/util/MicroTimeUtils.java | 19 -------------- .../example/demo/util/TruncatedTimeUtil.java | 19 ++++++++++++++ .../cafe/BusinessHourOpenCheckerTest.java | 14 +++++----- .../demo/domain/study/StudyOnceTest.java | 2 +- .../demo/factory/TestBusinessHourFactory.java | 2 +- .../cafe/CafeRepositorySearchMethodTest.java | 2 +- .../com/example/demo/service/ServiceTest.java | 2 ++ .../study/StudyOnceServiceImplTest.java | 8 +++--- .../example/demo/util/MicroTimeUtilsTest.java | 26 ------------------- .../demo/util/TruncatedTimeUtilTest.java | 26 +++++++++++++++++++ 19 files changed, 99 insertions(+), 95 deletions(-) delete mode 100644 src/main/java/com/example/demo/util/MicroTimeUtils.java create mode 100644 src/main/java/com/example/demo/util/TruncatedTimeUtil.java delete mode 100644 src/test/java/com/example/demo/util/MicroTimeUtilsTest.java create mode 100644 src/test/java/com/example/demo/util/TruncatedTimeUtilTest.java diff --git a/src/main/java/com/example/demo/controller/StudyOnceController.java b/src/main/java/com/example/demo/controller/StudyOnceController.java index 158760e..d42aa9c 100644 --- a/src/main/java/com/example/demo/controller/StudyOnceController.java +++ b/src/main/java/com/example/demo/controller/StudyOnceController.java @@ -1,7 +1,7 @@ package com.example.demo.controller; import static com.example.demo.exception.ExceptionType.*; -import static com.example.demo.util.MicroTimeUtils.*; +import static com.example.demo.util.TruncatedTimeUtil.*; import java.time.LocalDateTime; @@ -108,7 +108,7 @@ public ResponseEntity tryJoin(@PathVariable Long studyOnceI @RequestHeader("Authorization") String authorization) { long memberId = cafegoryTokenManager.getIdentityId(authorization); studyOnceService.tryJoin(memberId, studyOnceId); - return ResponseEntity.ok(new StudyOnceJoinResult(MICRO_LOCAL_DATE_TIME_NOW, true)); + return ResponseEntity.ok(new StudyOnceJoinResult(LOCAL_DATE_TIME_NOW, true)); } @DeleteMapping("/{studyOnceId:[0-9]+}") @@ -117,7 +117,8 @@ public ResponseEntity tryQuit(@PathVariable Long studyOnc long memberId = cafegoryTokenManager.getIdentityId(authorization); LocalDateTime requestTime = LocalDateTime.now(); studyOnceService.tryQuit(memberId, studyOnceId); - return ResponseEntity.ok(new StudyOnceQuitResponse(toMicroDateTime(requestTime), true)); + return ResponseEntity.ok( + new StudyOnceQuitResponse(truncateDateTimeToSecond(requestTime), true)); } @PatchMapping("/{studyOnceId:[0-9]+}/attendance") @@ -126,7 +127,7 @@ public ResponseEntity takeAttendance(@PathVariable Lon @RequestBody UpdateAttendanceRequest request) { long leaderId = cafegoryTokenManager.getIdentityId(authorization); UpdateAttendanceResponse response = studyOnceService.updateAttendances(leaderId, studyOnceId, - request, MICRO_LOCAL_DATE_TIME_NOW); + request, LOCAL_DATE_TIME_NOW); return ResponseEntity.ok(response); } diff --git a/src/main/java/com/example/demo/domain/BaseEntity.java b/src/main/java/com/example/demo/domain/BaseEntity.java index 38f2813..567ac5c 100644 --- a/src/main/java/com/example/demo/domain/BaseEntity.java +++ b/src/main/java/com/example/demo/domain/BaseEntity.java @@ -1,6 +1,6 @@ package com.example.demo.domain; -import static com.example.demo.util.MicroTimeUtils.*; +import static com.example.demo.util.TruncatedTimeUtil.*; import java.time.LocalDateTime; @@ -23,13 +23,13 @@ public class BaseEntity { @PrePersist public void prePersist() { - LocalDateTime now = MICRO_LOCAL_DATE_TIME_NOW; + LocalDateTime now = LOCAL_DATE_TIME_NOW; createdDate = now; lastModifiedDate = now; } @PreUpdate public void preUpdate() { - lastModifiedDate = MICRO_LOCAL_DATE_TIME_NOW; + lastModifiedDate = LOCAL_DATE_TIME_NOW; } } diff --git a/src/main/java/com/example/demo/domain/cafe/BusinessHourOpenChecker.java b/src/main/java/com/example/demo/domain/cafe/BusinessHourOpenChecker.java index 19bc49f..308e2be 100644 --- a/src/main/java/com/example/demo/domain/cafe/BusinessHourOpenChecker.java +++ b/src/main/java/com/example/demo/domain/cafe/BusinessHourOpenChecker.java @@ -1,6 +1,6 @@ package com.example.demo.domain.cafe; -import static com.example.demo.util.MicroTimeUtils.*; +import static com.example.demo.util.TruncatedTimeUtil.*; import java.time.DayOfWeek; import java.time.LocalDate; @@ -60,7 +60,7 @@ private boolean isOpenDuringDay(LocalTime startTime, LocalTime endTime, LocalTim @Override public boolean checkWithBusinessHours(List businessHours, LocalDateTime now) { - if (!hasMatchingDayOfWeek(businessHours, toMicroDateTime(now))) { + if (!hasMatchingDayOfWeek(businessHours, truncateDateTimeToSecond(now))) { throw new CafegoryException(ExceptionType.CAFE_NOT_FOUND_DAY_OF_WEEK); } return businessHours.stream() @@ -70,27 +70,27 @@ public boolean checkWithBusinessHours(List businessHours, LocalDat public boolean checkBetweenBusinessHours(LocalTime businessStartTime, LocalTime businessEndTime, LocalTime chosenStartTime, LocalTime chosenEndTime) { - LocalTime microChosenStartTime = toMicroTime(chosenStartTime); - LocalTime microChosenEndTime = toMicroTime(chosenEndTime); + LocalTime truncatedStartTime = truncateTimeToSecond(chosenStartTime); + LocalTime truncatedEndTime = truncateTimeToSecond(chosenEndTime); // 영업 시작시간이 당일, 영업 종료시간이 당일 if (businessStartTime.isBefore(businessEndTime)) { - return (businessStartTime.equals(microChosenStartTime) || businessStartTime.isBefore(microChosenStartTime)) + return (businessStartTime.equals(truncatedStartTime) || businessStartTime.isBefore(truncatedStartTime)) && ( - businessEndTime.equals(microChosenEndTime) || businessEndTime.isAfter(microChosenEndTime)); + businessEndTime.equals(truncatedEndTime) || businessEndTime.isAfter(truncatedEndTime)); } // 영업 시작시간이 당일, 영업 종료시간이 다음날 if (businessStartTime.isAfter(businessEndTime)) { LocalDateTime businessStartDateTime = LocalDateTime.of(LocalDate.now(), businessStartTime); LocalDateTime businessEndDateTime = LocalDateTime.of(LocalDate.now().plusDays(1), businessEndTime); // 선택된 시작시간이 당일, 선택된 종료시간이 당일 || 선택된 시작시간이 다음날, 선택된 종료시간이 다음날 - if (microChosenStartTime.isBefore(microChosenEndTime)) { + if (truncatedStartTime.isBefore(truncatedEndTime)) { LocalDate chosenDate = LocalDate.now(); - boolean isChosenTimeOvernight = businessStartTime.isAfter(microChosenStartTime); + boolean isChosenTimeOvernight = businessStartTime.isAfter(truncatedStartTime); LocalDate date = isChosenTimeOvernight ? chosenDate.plusDays(1) : chosenDate; LocalDateTime chosenStartDateTime = LocalDateTime.of(date, chosenStartTime); - LocalDateTime chosenEndDateTime = LocalDateTime.of(date, microChosenEndTime); + LocalDateTime chosenEndDateTime = LocalDateTime.of(date, truncatedEndTime); return (businessStartDateTime.isBefore(chosenStartDateTime) || businessStartDateTime.equals( chosenStartDateTime)) @@ -98,9 +98,9 @@ public boolean checkBetweenBusinessHours(LocalTime businessStartTime, LocalTime chosenEndDateTime)); } // 선택된 시작시간이 당일, 선택된 종료시간이 다음날 - if (microChosenStartTime.isAfter(microChosenEndTime)) { - LocalDateTime chosenStartDateTime = LocalDateTime.of(LocalDate.now(), microChosenStartTime); - LocalDateTime chosenEndDateTime = LocalDateTime.of(LocalDate.now().plusDays(1), microChosenEndTime); + if (truncatedStartTime.isAfter(truncatedEndTime)) { + LocalDateTime chosenStartDateTime = LocalDateTime.of(LocalDate.now(), truncatedStartTime); + LocalDateTime chosenEndDateTime = LocalDateTime.of(LocalDate.now().plusDays(1), truncatedEndTime); return (businessStartDateTime.equals(chosenStartDateTime) || businessStartDateTime.isBefore( chosenStartDateTime)) && (businessEndDateTime.equals(chosenEndDateTime) || businessEndDateTime.isAfter(chosenEndDateTime)); diff --git a/src/main/java/com/example/demo/domain/cafe/Cafe.java b/src/main/java/com/example/demo/domain/cafe/Cafe.java index 56398ab..77b10cf 100644 --- a/src/main/java/com/example/demo/domain/cafe/Cafe.java +++ b/src/main/java/com/example/demo/domain/cafe/Cafe.java @@ -1,7 +1,7 @@ package com.example.demo.domain.cafe; import static com.example.demo.exception.ExceptionType.*; -import static com.example.demo.util.MicroTimeUtils.*; +import static com.example.demo.util.TruncatedTimeUtil.*; import java.time.DayOfWeek; import java.util.ArrayList; @@ -84,7 +84,7 @@ public String getRegion() { } public boolean isOpen(OpenChecker openChecker) { - return openChecker.checkWithBusinessHours(this.businessHours, MICRO_LOCAL_DATE_TIME_NOW); + return openChecker.checkWithBusinessHours(this.businessHours, LOCAL_DATE_TIME_NOW); } public OptionalDouble calcAverageRating() { diff --git a/src/main/java/com/example/demo/domain/cafe/CafeSearchCondition.java b/src/main/java/com/example/demo/domain/cafe/CafeSearchCondition.java index dfc32d3..e175ef8 100644 --- a/src/main/java/com/example/demo/domain/cafe/CafeSearchCondition.java +++ b/src/main/java/com/example/demo/domain/cafe/CafeSearchCondition.java @@ -1,7 +1,7 @@ package com.example.demo.domain.cafe; import static com.example.demo.exception.ExceptionType.*; -import static com.example.demo.util.MicroTimeUtils.*; +import static com.example.demo.util.TruncatedTimeUtil.*; import java.time.LocalDateTime; import java.time.LocalTime; @@ -41,7 +41,7 @@ public static class Builder { private MinMenuPrice minMenuPrice; private LocalTime startTime; private LocalTime endTime; - private LocalDateTime now = MICRO_LOCAL_DATE_TIME_NOW; + private LocalDateTime now = LOCAL_DATE_TIME_NOW; public Builder(boolean isAbleToStudy, String region) { this.isAbleToStudy = isAbleToStudy; diff --git a/src/main/java/com/example/demo/domain/study/StudyOnce.java b/src/main/java/com/example/demo/domain/study/StudyOnce.java index cbf613e..284169a 100644 --- a/src/main/java/com/example/demo/domain/study/StudyOnce.java +++ b/src/main/java/com/example/demo/domain/study/StudyOnce.java @@ -1,7 +1,7 @@ package com.example.demo.domain.study; import static com.example.demo.exception.ExceptionType.*; -import static com.example.demo.util.MicroTimeUtils.*; +import static com.example.demo.util.TruncatedTimeUtil.*; import java.time.Duration; import java.time.LocalDateTime; @@ -97,7 +97,7 @@ private StudyOnce(Long id, String name, Cafe cafe, LocalDateTime startDateTime, } private void validateStartDateTime(LocalDateTime startDateTime) { - LocalDateTime now = MICRO_LOCAL_DATE_TIME_NOW; + LocalDateTime now = LOCAL_DATE_TIME_NOW; Duration between = Duration.between(now, startDateTime); if (between.toSeconds() < 3 * 60 * 60) { throw new CafegoryException(ExceptionType.STUDY_ONCE_WRONG_START_TIME); @@ -202,7 +202,7 @@ public boolean isLeader(Member member) { } public boolean canJoin(LocalDateTime baseDateTime) { - Duration between = Duration.between(toMicroDateTime(baseDateTime), startDateTime); + Duration between = Duration.between(truncateDateTimeToSecond(baseDateTime), startDateTime); return between.toSeconds() >= 60 * 60; } diff --git a/src/main/java/com/example/demo/repository/study/StudyOnceRepositoryImpl.java b/src/main/java/com/example/demo/repository/study/StudyOnceRepositoryImpl.java index b282828..09118ec 100644 --- a/src/main/java/com/example/demo/repository/study/StudyOnceRepositoryImpl.java +++ b/src/main/java/com/example/demo/repository/study/StudyOnceRepositoryImpl.java @@ -1,6 +1,6 @@ package com.example.demo.repository.study; -import static com.example.demo.util.MicroTimeUtils.*; +import static com.example.demo.util.TruncatedTimeUtil.*; import java.time.LocalDateTime; import java.util.List; @@ -56,7 +56,7 @@ public Long count(StudyOnceSearchRequest studyOnceSearchRequest) { } private BooleanExpression studyJoinAbleFilter(boolean onlyJoinAble) { - LocalDateTime base = MICRO_LOCAL_DATE_TIME_NOW.plusHours(3); + LocalDateTime base = LOCAL_DATE_TIME_NOW.plusHours(3); if (onlyJoinAble) { return qStudyOnce.startDateTime.after(base) .or(qStudyOnce.startDateTime.eq(base)); diff --git a/src/main/java/com/example/demo/service/profile/ProfileService.java b/src/main/java/com/example/demo/service/profile/ProfileService.java index b508eea..fc7cc9f 100644 --- a/src/main/java/com/example/demo/service/profile/ProfileService.java +++ b/src/main/java/com/example/demo/service/profile/ProfileService.java @@ -1,6 +1,6 @@ package com.example.demo.service.profile; -import static com.example.demo.util.MicroTimeUtils.*; +import static com.example.demo.util.TruncatedTimeUtil.*; import java.time.LocalDateTime; @@ -14,7 +14,7 @@ public interface ProfileService { @Transactional default ProfileGetResponse get(Long requestMemberId, Long targetMemberId) { - return get(requestMemberId, targetMemberId, MICRO_LOCAL_DATE_TIME_NOW); + return get(requestMemberId, targetMemberId, LOCAL_DATE_TIME_NOW); } ProfileGetResponse get(Long requestMemberId, Long targetMemberId, LocalDateTime baseDateTime); diff --git a/src/main/java/com/example/demo/service/study/StudyOnceServiceImpl.java b/src/main/java/com/example/demo/service/study/StudyOnceServiceImpl.java index 09b5764..a845a34 100644 --- a/src/main/java/com/example/demo/service/study/StudyOnceServiceImpl.java +++ b/src/main/java/com/example/demo/service/study/StudyOnceServiceImpl.java @@ -1,7 +1,7 @@ package com.example.demo.service.study; import static com.example.demo.exception.ExceptionType.*; -import static com.example.demo.util.MicroTimeUtils.*; +import static com.example.demo.util.TruncatedTimeUtil.*; import java.time.Duration; import java.time.LocalDateTime; @@ -159,7 +159,7 @@ private void processAttendanceUpdates(long leaderId, long studyOnceId, UpdateAtt @Override public void updateAttendance(long leaderId, long studyOnceId, long memberId, Attendance attendance, LocalDateTime now) { - LocalDateTime microNow = toMicroDateTime(now); + LocalDateTime microNow = truncateDateTimeToSecond(now); StudyOnce searched = findStudyOnceById(studyOnceId); if (!studyOnceRepository.existsByLeaderId(leaderId)) { @@ -205,8 +205,8 @@ public StudyOnceCreateResponse createStudy(long leaderId, StudyOnceCreateRequest businessHour); Member leader = findMemberById(leaderId); validateStudyScheduleConflict( - toMicroDateTime(request.getStartDateTime()), - toMicroDateTime(request.getEndDateTime()), + truncateDateTimeToSecond(request.getStartDateTime()), + truncateDateTimeToSecond(request.getEndDateTime()), leader); StudyOnce studyOnce = studyOnceMapper.toNewEntity(request, cafe, leader); StudyOnce saved = studyOnceRepository.save(studyOnce); @@ -246,7 +246,7 @@ public void updateStudyOnce(long requestedMemberId, long studyOnceId, StudyOnceU Cafe cafe = studyOnce.getCafe(); validateBetweenBusinessHour(request.getStartDateTime().toLocalTime(), request.getEndDateTime().toLocalTime(), - cafe.findBusinessHour(toMicroDateTime(now).getDayOfWeek())); + cafe.findBusinessHour(truncateDateTimeToSecond(now).getDayOfWeek())); studyOnce.changeStudyOnceTime(request.getStartDateTime(), request.getEndDateTime()); } if (request.getOpenChatUrl() != null) { @@ -288,7 +288,8 @@ public StudyMemberListResponse findStudyMembersById(Long studyOnceId) { @Override public StudyOnceResponse findStudyOnce(Long studyOnceId, LocalDateTime now) { StudyOnce studyOnce = findStudyOnceById(studyOnceId); - return studyOnceMapper.toStudyOnceResponse(studyOnce, studyOnce.canJoin(toMicroDateTime(now))); + return studyOnceMapper.toStudyOnceResponse(studyOnce, + studyOnce.canJoin(truncateDateTimeToSecond(now))); } @Override diff --git a/src/main/java/com/example/demo/util/MicroTimeUtils.java b/src/main/java/com/example/demo/util/MicroTimeUtils.java deleted file mode 100644 index bba6885..0000000 --- a/src/main/java/com/example/demo/util/MicroTimeUtils.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.example.demo.util; - -import java.time.LocalDateTime; -import java.time.LocalTime; -import java.time.temporal.ChronoUnit; - -public class MicroTimeUtils { - - public static final LocalTime MAX_LOCAL_TIME = LocalTime.of(23, 59, 59, 999_999_000); - public static final LocalDateTime MICRO_LOCAL_DATE_TIME_NOW = LocalDateTime.now().truncatedTo(ChronoUnit.MICROS); - - public static LocalTime toMicroTime(LocalTime time) { - return time == null ? null : time.withNano((time.getNano() / 1000) * 1000); - } - - public static LocalDateTime toMicroDateTime(LocalDateTime dateTime) { - return dateTime == null ? null : dateTime.withNano((dateTime.getNano() / 1000) * 1000); - } -} diff --git a/src/main/java/com/example/demo/util/TruncatedTimeUtil.java b/src/main/java/com/example/demo/util/TruncatedTimeUtil.java new file mode 100644 index 0000000..b16ff81 --- /dev/null +++ b/src/main/java/com/example/demo/util/TruncatedTimeUtil.java @@ -0,0 +1,19 @@ +package com.example.demo.util; + +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.temporal.ChronoUnit; + +public class TruncatedTimeUtil { + + public static final LocalTime MAX_LOCAL_TIME = LocalTime.of(23, 59, 59); + public static final LocalDateTime LOCAL_DATE_TIME_NOW = LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS); + + public static LocalTime truncateTimeToSecond(LocalTime time) { + return time == null ? null : time.truncatedTo(ChronoUnit.SECONDS); + } + + public static LocalDateTime truncateDateTimeToSecond(LocalDateTime dateTime) { + return dateTime == null ? null : dateTime.truncatedTo(ChronoUnit.SECONDS); + } +} diff --git a/src/test/java/com/example/demo/domain/cafe/BusinessHourOpenCheckerTest.java b/src/test/java/com/example/demo/domain/cafe/BusinessHourOpenCheckerTest.java index 08009d8..b8f5d15 100644 --- a/src/test/java/com/example/demo/domain/cafe/BusinessHourOpenCheckerTest.java +++ b/src/test/java/com/example/demo/domain/cafe/BusinessHourOpenCheckerTest.java @@ -1,7 +1,7 @@ package com.example.demo.domain.cafe; import static com.example.demo.factory.TestBusinessHourFactory.*; -import static com.example.demo.util.MicroTimeUtils.*; +import static com.example.demo.util.TruncatedTimeUtil.*; import static org.assertj.core.api.Assertions.*; import java.time.LocalDateTime; @@ -158,9 +158,9 @@ private static Stream provideLocalDateTime4() { */ Arguments.of(LocalDateTime.of(2024, 1, 29, 21, 59, 59, 999_999_000), true), Arguments.of(LocalDateTime.of(2024, 1, 29, 22, 0), false), - Arguments.of(LocalDateTime.of(2024, 1, 30, 23, 59, 59, 999_998_000), true), + Arguments.of(LocalDateTime.of(2024, 1, 30, 23, 59, 58), true), Arguments.of(LocalDateTime.of(2024, 1, 30, 23, 59, 59, 999_999_000), false), - Arguments.of(LocalDateTime.of(2024, 2, 2, 23, 59, 59, 999_998_000), true), + Arguments.of(LocalDateTime.of(2024, 2, 2, 23, 59, 58), true), Arguments.of(LocalDateTime.of(2024, 2, 2, 23, 59, 59, 999_999_000), false), Arguments.of(LocalDateTime.of(2024, 2, 3, 0, 0), true), Arguments.of(LocalDateTime.of(2024, 2, 4, 0, 0), true), @@ -214,7 +214,7 @@ private static Stream provideChosenTimeAndExpected() { ), Arguments.of( LocalTime.of(9, 0, 0), - LocalTime.of(21, 0, 0, 100_000_000), + LocalTime.of(21, 0, 1), false ), Arguments.of( @@ -287,7 +287,7 @@ private static Stream provideChosenTimeAndExpected4() { ), Arguments.of( LocalTime.of(23, 0), - LocalTime.of(2, 0, 0, 100_000_000), + LocalTime.of(2, 0, 1), false ), Arguments.of( @@ -302,7 +302,7 @@ private static Stream provideChosenTimeAndExpected4() { ), Arguments.of( LocalTime.of(0, 0), - LocalTime.of(2, 0, 0, 100_000_000), + LocalTime.of(2, 0, 1), false ), Arguments.of( @@ -317,7 +317,7 @@ private static Stream provideChosenTimeAndExpected4() { ), Arguments.of( LocalTime.of(7, 0), - LocalTime.of(2, 0, 0, 100_000_000), + LocalTime.of(2, 0, 1), false ) ); diff --git a/src/test/java/com/example/demo/domain/study/StudyOnceTest.java b/src/test/java/com/example/demo/domain/study/StudyOnceTest.java index 5d82929..591f767 100644 --- a/src/test/java/com/example/demo/domain/study/StudyOnceTest.java +++ b/src/test/java/com/example/demo/domain/study/StudyOnceTest.java @@ -46,7 +46,7 @@ private static Stream provideTimeAndExpected() { LocalDateTime start = NOW.plusHours(4); return Stream.of( Arguments.of(start.minusHours(1), start, true), - Arguments.of(start.minusHours(1).plusNanos(100_000_000), start, false) + Arguments.of(start.minusHours(1).plusSeconds(1), start, false) ); } diff --git a/src/test/java/com/example/demo/factory/TestBusinessHourFactory.java b/src/test/java/com/example/demo/factory/TestBusinessHourFactory.java index 8927331..956ece3 100644 --- a/src/test/java/com/example/demo/factory/TestBusinessHourFactory.java +++ b/src/test/java/com/example/demo/factory/TestBusinessHourFactory.java @@ -1,6 +1,6 @@ package com.example.demo.factory; -import static com.example.demo.util.MicroTimeUtils.*; +import static com.example.demo.util.TruncatedTimeUtil.*; import java.time.LocalTime; diff --git a/src/test/java/com/example/demo/repository/cafe/CafeRepositorySearchMethodTest.java b/src/test/java/com/example/demo/repository/cafe/CafeRepositorySearchMethodTest.java index bc51ba4..bae5b85 100644 --- a/src/test/java/com/example/demo/repository/cafe/CafeRepositorySearchMethodTest.java +++ b/src/test/java/com/example/demo/repository/cafe/CafeRepositorySearchMethodTest.java @@ -2,7 +2,7 @@ import static com.example.demo.factory.TestBusinessHourFactory.*; import static com.example.demo.factory.TestCafeFactory.*; -import static com.example.demo.util.MicroTimeUtils.*; +import static com.example.demo.util.TruncatedTimeUtil.*; import static org.assertj.core.api.Assertions.*; import java.sql.Time; diff --git a/src/test/java/com/example/demo/service/ServiceTest.java b/src/test/java/com/example/demo/service/ServiceTest.java index dcaf3dc..9446e2b 100644 --- a/src/test/java/com/example/demo/service/ServiceTest.java +++ b/src/test/java/com/example/demo/service/ServiceTest.java @@ -3,10 +3,12 @@ import org.junit.jupiter.api.BeforeEach; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; import com.example.demo.utils.DatabaseCleanup; @SpringBootTest +@ActiveProfiles("test") public class ServiceTest { @Autowired diff --git a/src/test/java/com/example/demo/service/study/StudyOnceServiceImplTest.java b/src/test/java/com/example/demo/service/study/StudyOnceServiceImplTest.java index ba61733..20c18eb 100644 --- a/src/test/java/com/example/demo/service/study/StudyOnceServiceImplTest.java +++ b/src/test/java/com/example/demo/service/study/StudyOnceServiceImplTest.java @@ -310,7 +310,7 @@ static Stream provideStartAndEndDateTime1() { ), Arguments.of( LocalDateTime.of(2999, 1, 1, 20, 0), - LocalDateTime.of(2999, 1, 1, 21, 0, 0, 100_000_000) + LocalDateTime.of(2999, 1, 1, 21, 0, 1) ), Arguments.of( LocalDateTime.of(2999, 1, 1, 20, 59, 59, 999_999_999), @@ -398,7 +398,7 @@ void leader_can_not_check_attendance_10min_before_start() { Member member = memberSaveHelper.saveMember(thumbnailImage); StudyOnce studyOnce = studyOnceSaveHelper.saveStudyOnceWithTime(cafe, leader, start, end); sut.tryJoin(member.getId(), studyOnce.getId()); - LocalDateTime attendanceUpdateTime = start.plusMinutes(10).minusNanos(100_000_000); + LocalDateTime attendanceUpdateTime = start.plusMinutes(10).minusSeconds(1); //when assertThatThrownBy( () -> sut.updateAttendance(leader.getId(), studyOnce.getId(), member.getId(), NO, attendanceUpdateTime)) @@ -440,7 +440,7 @@ void leader_can_not_check_attendance_after_half_whole_study_time() { Member member = memberSaveHelper.saveMember(thumbnailImage); StudyOnce studyOnce = studyOnceSaveHelper.saveStudyOnceWithTime(cafe, leader, start, end); sut.tryJoin(member.getId(), studyOnce.getId()); - LocalDateTime attendanceUpdateTime = start.plusHours(2).plusNanos(100_000_000); + LocalDateTime attendanceUpdateTime = start.plusHours(2).plusSeconds(1); //when assertThatThrownBy( () -> sut.updateAttendance(leader.getId(), studyOnce.getId(), member.getId(), NO, attendanceUpdateTime)) @@ -566,7 +566,7 @@ static Stream provideStartAndEndDateTime3() { ), Arguments.of( LocalDateTime.of(2999, 1, 1, 20, 0), - LocalDateTime.of(2999, 1, 1, 21, 0, 0, 100_000_000) + LocalDateTime.of(2999, 1, 1, 21, 0, 1) ), Arguments.of( LocalDateTime.of(2999, 1, 1, 20, 59, 59, 999_999_999), diff --git a/src/test/java/com/example/demo/util/MicroTimeUtilsTest.java b/src/test/java/com/example/demo/util/MicroTimeUtilsTest.java deleted file mode 100644 index c21ac52..0000000 --- a/src/test/java/com/example/demo/util/MicroTimeUtilsTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.example.demo.util; - -import static org.assertj.core.api.Assertions.*; - -import java.time.LocalDateTime; -import java.time.LocalTime; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -class MicroTimeUtilsTest { - - @Test - @DisplayName("나노초에서 마이크로초로 변환한다.") - void convert_nano_to_micro_time() { - LocalTime result = MicroTimeUtils.toMicroTime(LocalTime.of(23, 59, 59, 999_999_999)); - assertThat(result).isEqualTo(LocalTime.of(23, 59, 59, 999_999_000)); - } - - @Test - @DisplayName("나노초에서 마이크로초로 변환한다.") - void convert_nano_to_micro_date_time() { - LocalDateTime result = MicroTimeUtils.toMicroDateTime(LocalDateTime.MAX); - assertThat(result).isEqualTo(LocalDateTime.MAX.withNano(999_999_000)); - } -} \ No newline at end of file diff --git a/src/test/java/com/example/demo/util/TruncatedTimeUtilTest.java b/src/test/java/com/example/demo/util/TruncatedTimeUtilTest.java new file mode 100644 index 0000000..c6250e2 --- /dev/null +++ b/src/test/java/com/example/demo/util/TruncatedTimeUtilTest.java @@ -0,0 +1,26 @@ +package com.example.demo.util; + +import static org.assertj.core.api.Assertions.*; + +import java.time.LocalDateTime; +import java.time.LocalTime; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class TruncatedTimeUtilTest { + + @Test + @DisplayName("나노초에서 초단위로 절삭한다.") + void convert_nano_to_micro_time() { + LocalTime result = TruncatedTimeUtil.truncateTimeToSecond(LocalTime.of(23, 59, 59, 999_999_999)); + assertThat(result).isEqualTo(LocalTime.of(23, 59, 59)); + } + + @Test + @DisplayName("나노초에서 초단위로 절삭한다.") + void convert_nano_to_micro_date_time() { + LocalDateTime result = TruncatedTimeUtil.truncateDateTimeToSecond(LocalDateTime.MAX); + assertThat(result).isEqualTo(LocalDateTime.of(999999999, 12, 31, 23, 59, 59)); + } +} \ No newline at end of file From 6c6f02ce458b844b7d6090e451e5fb1f38ff650a Mon Sep 17 00:00:00 2001 From: donghyunkim Date: Fri, 12 Jul 2024 21:39:38 +0900 Subject: [PATCH 19/20] =?UTF-8?q?refactor:=20ServiceTest=EC=97=90=20@Impor?= =?UTF-8?q?t=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/com/example/demo/service/ServiceTest.java | 3 +++ .../example/demo/service/profile/ProfileServiceImplTest.java | 3 --- .../com/example/demo/service/review/ReviewServiceTest.java | 3 --- .../service/study/StudyOnceCommentQueryServiceImplTest.java | 3 --- .../demo/service/study/StudyOnceCommentServiceImplTest.java | 5 +---- .../example/demo/service/study/StudyOnceServiceImplTest.java | 3 --- 6 files changed, 4 insertions(+), 16 deletions(-) diff --git a/src/test/java/com/example/demo/service/ServiceTest.java b/src/test/java/com/example/demo/service/ServiceTest.java index 9446e2b..9ac16e2 100644 --- a/src/test/java/com/example/demo/service/ServiceTest.java +++ b/src/test/java/com/example/demo/service/ServiceTest.java @@ -3,12 +3,15 @@ import org.junit.jupiter.api.BeforeEach; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; import org.springframework.test.context.ActiveProfiles; +import com.example.demo.config.TestConfig; import com.example.demo.utils.DatabaseCleanup; @SpringBootTest @ActiveProfiles("test") +@Import({TestConfig.class}) public class ServiceTest { @Autowired diff --git a/src/test/java/com/example/demo/service/profile/ProfileServiceImplTest.java b/src/test/java/com/example/demo/service/profile/ProfileServiceImplTest.java index 22a24db..f34d518 100644 --- a/src/test/java/com/example/demo/service/profile/ProfileServiceImplTest.java +++ b/src/test/java/com/example/demo/service/profile/ProfileServiceImplTest.java @@ -8,9 +8,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Import; -import com.example.demo.config.TestConfig; import com.example.demo.domain.cafe.Cafe; import com.example.demo.domain.member.Member; import com.example.demo.domain.member.ThumbnailImage; @@ -26,7 +24,6 @@ import com.example.demo.service.ServiceTest; import com.example.demo.service.study.StudyOnceService; -@Import({TestConfig.class}) class ProfileServiceImplTest extends ServiceTest { private static final LocalDateTime NOW = LocalDateTime.now(); diff --git a/src/test/java/com/example/demo/service/review/ReviewServiceTest.java b/src/test/java/com/example/demo/service/review/ReviewServiceTest.java index 7d89563..1edd2cb 100644 --- a/src/test/java/com/example/demo/service/review/ReviewServiceTest.java +++ b/src/test/java/com/example/demo/service/review/ReviewServiceTest.java @@ -9,9 +9,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Import; -import com.example.demo.config.TestConfig; import com.example.demo.domain.cafe.Cafe; import com.example.demo.domain.member.Member; import com.example.demo.domain.member.ThumbnailImage; @@ -25,7 +23,6 @@ import com.example.demo.repository.review.ReviewRepository; import com.example.demo.service.ServiceTest; -@Import({TestConfig.class}) class ReviewServiceTest extends ServiceTest { @Autowired diff --git a/src/test/java/com/example/demo/service/study/StudyOnceCommentQueryServiceImplTest.java b/src/test/java/com/example/demo/service/study/StudyOnceCommentQueryServiceImplTest.java index d631dd8..4501268 100644 --- a/src/test/java/com/example/demo/service/study/StudyOnceCommentQueryServiceImplTest.java +++ b/src/test/java/com/example/demo/service/study/StudyOnceCommentQueryServiceImplTest.java @@ -8,9 +8,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Import; -import com.example.demo.config.TestConfig; import com.example.demo.domain.cafe.Cafe; import com.example.demo.domain.member.Member; import com.example.demo.domain.member.ThumbnailImage; @@ -26,7 +24,6 @@ import com.example.demo.helper.ThumbnailImageSaveHelper; import com.example.demo.service.ServiceTest; -@Import({TestConfig.class}) class StudyOnceCommentQueryServiceImplTest extends ServiceTest { @Autowired diff --git a/src/test/java/com/example/demo/service/study/StudyOnceCommentServiceImplTest.java b/src/test/java/com/example/demo/service/study/StudyOnceCommentServiceImplTest.java index f9ce3f7..7add707 100644 --- a/src/test/java/com/example/demo/service/study/StudyOnceCommentServiceImplTest.java +++ b/src/test/java/com/example/demo/service/study/StudyOnceCommentServiceImplTest.java @@ -7,9 +7,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Import; -import com.example.demo.config.TestConfig; import com.example.demo.domain.cafe.Cafe; import com.example.demo.domain.member.Member; import com.example.demo.domain.member.ThumbnailImage; @@ -27,9 +25,8 @@ import com.example.demo.repository.study.StudyOnceCommentRepository; import com.example.demo.service.ServiceTest; -@Import({TestConfig.class}) class StudyOnceCommentServiceImplTest extends ServiceTest { - + @Autowired private StudyOnceCommentService sut; @Autowired diff --git a/src/test/java/com/example/demo/service/study/StudyOnceServiceImplTest.java b/src/test/java/com/example/demo/service/study/StudyOnceServiceImplTest.java index 20c18eb..3c3a560 100644 --- a/src/test/java/com/example/demo/service/study/StudyOnceServiceImplTest.java +++ b/src/test/java/com/example/demo/service/study/StudyOnceServiceImplTest.java @@ -16,9 +16,7 @@ import org.junit.jupiter.params.provider.MethodSource; import org.junit.jupiter.params.provider.ValueSource; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Import; -import com.example.demo.config.TestConfig; import com.example.demo.domain.cafe.Cafe; import com.example.demo.domain.member.Member; import com.example.demo.domain.member.ThumbnailImage; @@ -42,7 +40,6 @@ import com.example.demo.repository.study.StudyOnceRepository; import com.example.demo.service.ServiceTest; -@Import({TestConfig.class}) class StudyOnceServiceImplTest extends ServiceTest { private static final LocalDateTime NOW = LocalDateTime.now(); From 303353ec738af855b654ef7fd38e5426f5137e02 Mon Sep 17 00:00:00 2001 From: donghyunkim Date: Fri, 12 Jul 2024 21:46:16 +0900 Subject: [PATCH 20/20] =?UTF-8?q?chore:=20=ED=8C=A8=ED=82=A4=EC=A7=80=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../demo/util/TruncatedTimeUtilTest.java | 26 ------------------- .../example/demo/utils/DatabaseCleanup.java | 25 ++++++++++++++++++ 2 files changed, 25 insertions(+), 26 deletions(-) delete mode 100644 src/test/java/com/example/demo/util/TruncatedTimeUtilTest.java diff --git a/src/test/java/com/example/demo/util/TruncatedTimeUtilTest.java b/src/test/java/com/example/demo/util/TruncatedTimeUtilTest.java deleted file mode 100644 index c6250e2..0000000 --- a/src/test/java/com/example/demo/util/TruncatedTimeUtilTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.example.demo.util; - -import static org.assertj.core.api.Assertions.*; - -import java.time.LocalDateTime; -import java.time.LocalTime; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -class TruncatedTimeUtilTest { - - @Test - @DisplayName("나노초에서 초단위로 절삭한다.") - void convert_nano_to_micro_time() { - LocalTime result = TruncatedTimeUtil.truncateTimeToSecond(LocalTime.of(23, 59, 59, 999_999_999)); - assertThat(result).isEqualTo(LocalTime.of(23, 59, 59)); - } - - @Test - @DisplayName("나노초에서 초단위로 절삭한다.") - void convert_nano_to_micro_date_time() { - LocalDateTime result = TruncatedTimeUtil.truncateDateTimeToSecond(LocalDateTime.MAX); - assertThat(result).isEqualTo(LocalDateTime.of(999999999, 12, 31, 23, 59, 59)); - } -} \ No newline at end of file diff --git a/src/test/java/com/example/demo/utils/DatabaseCleanup.java b/src/test/java/com/example/demo/utils/DatabaseCleanup.java index 501b266..df100c7 100644 --- a/src/test/java/com/example/demo/utils/DatabaseCleanup.java +++ b/src/test/java/com/example/demo/utils/DatabaseCleanup.java @@ -1,5 +1,9 @@ package com.example.demo.utils; +import static org.assertj.core.api.Assertions.*; + +import java.time.LocalDateTime; +import java.time.LocalTime; import java.util.List; import java.util.stream.Collectors; @@ -9,9 +13,13 @@ import javax.persistence.Table; import javax.persistence.metamodel.EntityType; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import com.example.demo.util.TruncatedTimeUtil; + @Service public class DatabaseCleanup { @@ -52,4 +60,21 @@ private String convertCamelCaseToSnakeCase(String input) { } return input.replaceAll("([a-z])([A-Z]+)", "$1_$2").toLowerCase(); } + + static class TruncatedTimeUtilTest { + + @Test + @DisplayName("나노초에서 초단위로 절삭한다.") + void convert_nano_to_micro_time() { + LocalTime result = TruncatedTimeUtil.truncateTimeToSecond(LocalTime.of(23, 59, 59, 999_999_999)); + assertThat(result).isEqualTo(LocalTime.of(23, 59, 59)); + } + + @Test + @DisplayName("나노초에서 초단위로 절삭한다.") + void convert_nano_to_micro_date_time() { + LocalDateTime result = TruncatedTimeUtil.truncateDateTimeToSecond(LocalDateTime.MAX); + assertThat(result).isEqualTo(LocalDateTime.of(999999999, 12, 31, 23, 59, 59)); + } + } }