From b50222370a6ec591403b91085c2f3ae1a0bdc3eb Mon Sep 17 00:00:00 2001 From: ghdcksgml1 Date: Mon, 9 Oct 2023 22:49:15 +0900 Subject: [PATCH 01/21] =?UTF-8?q?refactor(#67):=20=ED=94=BC=EB=93=9C?= =?UTF-8?q?=EB=B0=B1=EC=9D=84=20=EB=B0=98=EC=98=81=ED=95=9C=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=EB=B2=A0=EC=9D=B4=EC=8A=A4=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 --- .../api/service/auth/AuthServiceTest.java | 16 ++--- .../heachi/mongo/define/notify/Notify.java | 6 +- .../define/group/background/QGroupBg.java | 51 +++++++++++++++ .../mysql/define/group/info/QGroupInfo.java | 4 ++ .../define/housework/info/QHouseworkInfo.java | 10 +++ .../housework/period/QHouseworkPeriod.java | 65 ------------------- .../define/housework/todo/QHouseworkTodo.java | 31 ++++++++- .../com/heachi/mysql/define/user/QUser.java | 3 + .../define/group/background/GroupBg.java | 35 ++++++++++ .../mysql/define/group/info/GroupInfo.java | 14 +++- .../define/group/member/GroupMember.java | 2 +- .../member/constant/GroupMemberStatus.java | 4 +- .../define/housework/info/HouseworkInfo.java | 27 +++++++- .../info/constant/HouseworkPeriodType.java | 8 +++ .../housework/period/HouseworkPeriod.java | 51 --------------- .../period/constant/HouseworkPeriodType.java | 7 -- .../define/housework/save/HouseworkSave.java | 1 + .../define/housework/todo/HouseworkTodo.java | 42 ++++++++++-- .../com/heachi/mysql/define/user/User.java | 30 +++++---- .../mysql/define/user/constant/UserRole.java | 3 +- .../request/NotifyRegistRequest.java | 1 - .../request/NotifyServiceRegistRequest.java | 8 +-- .../NotifyServiceReceiverResponse.java | 5 +- .../api/service/auth/AuthServiceTest.java | 2 +- 24 files changed, 254 insertions(+), 172 deletions(-) create mode 100644 heachi-domain-mysql/src/main/generated/com/heachi/mysql/define/group/background/QGroupBg.java delete mode 100644 heachi-domain-mysql/src/main/generated/com/heachi/mysql/define/housework/period/QHouseworkPeriod.java create mode 100644 heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/background/GroupBg.java create mode 100644 heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/constant/HouseworkPeriodType.java delete mode 100644 heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/period/HouseworkPeriod.java delete mode 100644 heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/period/constant/HouseworkPeriodType.java diff --git a/heachi-core/auth-api/src/test/java/com/heachi/auth/api/service/auth/AuthServiceTest.java b/heachi-core/auth-api/src/test/java/com/heachi/auth/api/service/auth/AuthServiceTest.java index 3e39fcbb..4fe6fb1e 100644 --- a/heachi-core/auth-api/src/test/java/com/heachi/auth/api/service/auth/AuthServiceTest.java +++ b/heachi-core/auth-api/src/test/java/com/heachi/auth/api/service/auth/AuthServiceTest.java @@ -103,12 +103,12 @@ void loginTokenValidClaims() { User user2 = User.builder() .name("김민목") .email("abc2") - .role(UserRole.CHEMIST) + .role(UserRole.USER) .build(); User user3 = User.builder() .name("김민금") .email("abc3") - .role(UserRole.CENTER) + .role(UserRole.USER) .build(); userRepository.saveAll(List.of(user1, user2, user3)); @@ -151,11 +151,11 @@ void loginTokenValidClaims() { () -> assertThat(claims1.get("name")).isEqualTo("김민수"), () -> assertThat(claims1.get("profileImageUrl")).isEqualTo("google.com"), // 김민목 - () -> assertThat(claims2.get("role")).isEqualTo("CHEMIST"), + () -> assertThat(claims2.get("role")).isEqualTo("USER"), () -> assertThat(claims2.get("name")).isEqualTo("김민목"), () -> assertThat(claims2.get("profileImageUrl")).isEqualTo("google.com"), // 김민금 - () -> assertThat(claims3.get("role")).isEqualTo("CENTER"), + () -> assertThat(claims3.get("role")).isEqualTo("USER"), () -> assertThat(claims3.get("name")).isEqualTo("김민금"), () -> assertThat(claims3.get("profileImageUrl")).isEqualTo("google.com") ); @@ -219,7 +219,7 @@ public void registerUnauthUserSuccessTest() { // 회원가입 요청 생성 (CENTER) AuthServiceRegisterRequest request = AuthServiceRegisterRequest.builder() - .role(UserRole.CENTER) + .role(UserRole.USER) .phoneNumber(phoneNumber) .email(email) .build(); @@ -232,7 +232,7 @@ public void registerUnauthUserSuccessTest() { // then - assertEquals(UserRole.CENTER, response.getRole()); + assertEquals(UserRole.USER, response.getRole()); assertThat(tokenValid).isTrue(); } @@ -249,7 +249,7 @@ public void registerUnauthUserFailTest() { User user = User.builder() .platformId(platformId) .platformType(platformType) - .role(UserRole.CENTER) + .role(UserRole.USER) .email(email) .name(name) .profileImageUrl(profileImageUrl) @@ -259,7 +259,7 @@ public void registerUnauthUserFailTest() { // 회원가입 요청 생성 (CENTER) AuthServiceRegisterRequest request = AuthServiceRegisterRequest.builder() - .role(UserRole.CENTER) + .role(UserRole.USER) .phoneNumber(phoneNumber) .email(email) .build(); diff --git a/heachi-domain-mongo/src/main/java/com/heachi/mongo/define/notify/Notify.java b/heachi-domain-mongo/src/main/java/com/heachi/mongo/define/notify/Notify.java index 80673d5b..e51ae899 100644 --- a/heachi-domain-mongo/src/main/java/com/heachi/mongo/define/notify/Notify.java +++ b/heachi-domain-mongo/src/main/java/com/heachi/mongo/define/notify/Notify.java @@ -23,20 +23,18 @@ public class Notify { private List receiveUserIds = new ArrayList<>(); // 알림을 받는 아이디 private NotifyType type; // 알림 종류 private String message; // 알림 내용 - private String generatedUrl; // 알림의 근원지 private String url; // 알림 클릭 시 이동할 주소 private LocalDateTime createdTime = LocalDateTime.now(); // 알림 발생 시간 private Map checkedTime = new HashMap<>(); // 알림 확인 시간 private Set checked = new HashSet<>(); // 알림을 확인했는지 안했는지 @Builder - private Notify(String sendUserId, List receiveUserIds, NotifyType type, String message, String generatedUrl - , String url, LocalDateTime createdTime, Map checkedTime, Set checked) { + private Notify(String sendUserId, List receiveUserIds, NotifyType type, String message, String url, + LocalDateTime createdTime, Map checkedTime, Set checked) { this.sendUserId = sendUserId; this.receiveUserIds = receiveUserIds; this.type = type; this.message = message; - this.generatedUrl = generatedUrl; this.url = url; this.createdTime = createdTime; this.checkedTime = checkedTime; diff --git a/heachi-domain-mysql/src/main/generated/com/heachi/mysql/define/group/background/QGroupBg.java b/heachi-domain-mysql/src/main/generated/com/heachi/mysql/define/group/background/QGroupBg.java new file mode 100644 index 00000000..af57a201 --- /dev/null +++ b/heachi-domain-mysql/src/main/generated/com/heachi/mysql/define/group/background/QGroupBg.java @@ -0,0 +1,51 @@ +package com.heachi.mysql.define.group.background; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QGroupBg is a Querydsl query type for GroupBg + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QGroupBg extends EntityPathBase { + + private static final long serialVersionUID = -387669863L; + + public static final QGroupBg groupBg = new QGroupBg("groupBg"); + + public final com.heachi.mysql.define.QBaseEntity _super = new com.heachi.mysql.define.QBaseEntity(this); + + public final StringPath bgColor = createString("bgColor"); + + public final StringPath colorCode = createString("colorCode"); + + //inherited + public final DateTimePath createdDateTime = _super.createdDateTime; + + public final StringPath gradient = createString("gradient"); + + public final NumberPath id = createNumber("id", Long.class); + + //inherited + public final DateTimePath modifiedDateTime = _super.modifiedDateTime; + + public QGroupBg(String variable) { + super(GroupBg.class, forVariable(variable)); + } + + public QGroupBg(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QGroupBg(PathMetadata metadata) { + super(GroupBg.class, metadata); + } + +} + diff --git a/heachi-domain-mysql/src/main/generated/com/heachi/mysql/define/group/info/QGroupInfo.java b/heachi-domain-mysql/src/main/generated/com/heachi/mysql/define/group/info/QGroupInfo.java index 21847bde..a381b697 100644 --- a/heachi-domain-mysql/src/main/generated/com/heachi/mysql/define/group/info/QGroupInfo.java +++ b/heachi-domain-mysql/src/main/generated/com/heachi/mysql/define/group/info/QGroupInfo.java @@ -31,6 +31,10 @@ public class QGroupInfo extends EntityPathBase { //inherited public final DateTimePath createdDateTime = _super.createdDateTime; + public final StringPath gradient = createString("gradient"); + + public final ListPath houseworkTodoList = this.createList("houseworkTodoList", com.heachi.mysql.define.housework.todo.HouseworkTodo.class, com.heachi.mysql.define.housework.todo.QHouseworkTodo.class, PathInits.DIRECT2); + public final NumberPath id = createNumber("id", Long.class); public final StringPath info = createString("info"); diff --git a/heachi-domain-mysql/src/main/generated/com/heachi/mysql/define/housework/info/QHouseworkInfo.java b/heachi-domain-mysql/src/main/generated/com/heachi/mysql/define/housework/info/QHouseworkInfo.java index 20bd6fe4..a9abb12c 100644 --- a/heachi-domain-mysql/src/main/generated/com/heachi/mysql/define/housework/info/QHouseworkInfo.java +++ b/heachi-domain-mysql/src/main/generated/com/heachi/mysql/define/housework/info/QHouseworkInfo.java @@ -27,8 +27,12 @@ public class QHouseworkInfo extends EntityPathBase { //inherited public final DateTimePath createdDateTime = _super.createdDateTime; + public final DatePath dayDate = createDate("dayDate", java.util.Date.class); + public final StringPath detail = createString("detail"); + public final TimePath endTime = createTime("endTime", java.util.Date.class); + public final com.heachi.mysql.define.housework.category.QHouseworkCategory houseworkCategory; public final ListPath houseworkMembers = this.createList("houseworkMembers", com.heachi.mysql.define.housework.member.HouseworkMember.class, com.heachi.mysql.define.housework.member.QHouseworkMember.class, PathInits.DIRECT2); @@ -38,8 +42,14 @@ public class QHouseworkInfo extends EntityPathBase { //inherited public final DateTimePath modifiedDateTime = _super.modifiedDateTime; + public final StringPath monthDate = createString("monthDate"); + public final StringPath title = createString("title"); + public final EnumPath type = createEnum("type", com.heachi.mysql.define.housework.info.constant.HouseworkPeriodType.class); + + public final StringPath weekDate = createString("weekDate"); + public QHouseworkInfo(String variable) { this(HouseworkInfo.class, forVariable(variable), INITS); } diff --git a/heachi-domain-mysql/src/main/generated/com/heachi/mysql/define/housework/period/QHouseworkPeriod.java b/heachi-domain-mysql/src/main/generated/com/heachi/mysql/define/housework/period/QHouseworkPeriod.java deleted file mode 100644 index 45b34acd..00000000 --- a/heachi-domain-mysql/src/main/generated/com/heachi/mysql/define/housework/period/QHouseworkPeriod.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.heachi.mysql.define.housework.period; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; - - -/** - * QHouseworkPeriod is a Querydsl query type for HouseworkPeriod - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QHouseworkPeriod extends EntityPathBase { - - private static final long serialVersionUID = 424739304L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QHouseworkPeriod houseworkPeriod = new QHouseworkPeriod("houseworkPeriod"); - - public final com.heachi.mysql.define.QBaseEntity _super = new com.heachi.mysql.define.QBaseEntity(this); - - //inherited - public final DateTimePath createdDateTime = _super.createdDateTime; - - public final DatePath date = createDate("date", java.util.Date.class); - - public final TimePath endTime = createTime("endTime", java.util.Date.class); - - public final com.heachi.mysql.define.housework.info.QHouseworkInfo houseworkInfo; - - public final NumberPath id = createNumber("id", Long.class); - - //inherited - public final DateTimePath modifiedDateTime = _super.modifiedDateTime; - - public final EnumPath type = createEnum("type", com.heachi.mysql.define.housework.period.constant.HouseworkPeriodType.class); - - public QHouseworkPeriod(String variable) { - this(HouseworkPeriod.class, forVariable(variable), INITS); - } - - public QHouseworkPeriod(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QHouseworkPeriod(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QHouseworkPeriod(PathMetadata metadata, PathInits inits) { - this(HouseworkPeriod.class, metadata, inits); - } - - public QHouseworkPeriod(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this.houseworkInfo = inits.isInitialized("houseworkInfo") ? new com.heachi.mysql.define.housework.info.QHouseworkInfo(forProperty("houseworkInfo"), inits.get("houseworkInfo")) : null; - } - -} - diff --git a/heachi-domain-mysql/src/main/generated/com/heachi/mysql/define/housework/todo/QHouseworkTodo.java b/heachi-domain-mysql/src/main/generated/com/heachi/mysql/define/housework/todo/QHouseworkTodo.java index 4064fd23..d9b95dd5 100644 --- a/heachi-domain-mysql/src/main/generated/com/heachi/mysql/define/housework/todo/QHouseworkTodo.java +++ b/heachi-domain-mysql/src/main/generated/com/heachi/mysql/define/housework/todo/QHouseworkTodo.java @@ -7,6 +7,7 @@ import com.querydsl.core.types.PathMetadata; import javax.annotation.processing.Generated; import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; /** @@ -17,6 +18,8 @@ public class QHouseworkTodo extends EntityPathBase { private static final long serialVersionUID = -1421769550L; + private static final PathInits INITS = PathInits.DIRECT2; + public static final QHouseworkTodo houseworkTodo = new QHouseworkTodo("houseworkTodo"); public final com.heachi.mysql.define.QBaseEntity _super = new com.heachi.mysql.define.QBaseEntity(this); @@ -26,8 +29,14 @@ public class QHouseworkTodo extends EntityPathBase { //inherited public final DateTimePath createdDateTime = _super.createdDateTime; + public final DatePath date = createDate("date", java.util.Date.class); + public final StringPath detail = createString("detail"); + public final com.heachi.mysql.define.group.info.QGroupInfo groupInfo; + + public final com.heachi.mysql.define.housework.info.QHouseworkInfo houseworkInfo; + public final StringPath houseworkMember = createString("houseworkMember"); public final NumberPath id = createNumber("id", Long.class); @@ -41,16 +50,32 @@ public class QHouseworkTodo extends EntityPathBase { public final StringPath title = createString("title"); + public final StringPath verificationPhotoURL = createString("verificationPhotoURL"); + + public final DateTimePath verificationTime = createDateTime("verificationTime", java.time.LocalDateTime.class); + + public final StringPath verifierId = createString("verifierId"); + public QHouseworkTodo(String variable) { - super(HouseworkTodo.class, forVariable(variable)); + this(HouseworkTodo.class, forVariable(variable), INITS); } public QHouseworkTodo(Path path) { - super(path.getType(), path.getMetadata()); + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); } public QHouseworkTodo(PathMetadata metadata) { - super(HouseworkTodo.class, metadata); + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QHouseworkTodo(PathMetadata metadata, PathInits inits) { + this(HouseworkTodo.class, metadata, inits); + } + + public QHouseworkTodo(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.groupInfo = inits.isInitialized("groupInfo") ? new com.heachi.mysql.define.group.info.QGroupInfo(forProperty("groupInfo"), inits.get("groupInfo")) : null; + this.houseworkInfo = inits.isInitialized("houseworkInfo") ? new com.heachi.mysql.define.housework.info.QHouseworkInfo(forProperty("houseworkInfo"), inits.get("houseworkInfo")) : null; } } diff --git a/heachi-domain-mysql/src/main/generated/com/heachi/mysql/define/user/QUser.java b/heachi-domain-mysql/src/main/generated/com/heachi/mysql/define/user/QUser.java index e870796b..dbb965c0 100644 --- a/heachi-domain-mysql/src/main/generated/com/heachi/mysql/define/user/QUser.java +++ b/heachi-domain-mysql/src/main/generated/com/heachi/mysql/define/user/QUser.java @@ -7,6 +7,7 @@ import com.querydsl.core.types.PathMetadata; import javax.annotation.processing.Generated; import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; /** @@ -26,6 +27,8 @@ public class QUser extends EntityPathBase { public final StringPath email = createString("email"); + public final ListPath groupInfoList = this.createList("groupInfoList", com.heachi.mysql.define.group.info.GroupInfo.class, com.heachi.mysql.define.group.info.QGroupInfo.class, PathInits.DIRECT2); + public final NumberPath id = createNumber("id", Long.class); //inherited diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/background/GroupBg.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/background/GroupBg.java new file mode 100644 index 00000000..12c105c8 --- /dev/null +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/background/GroupBg.java @@ -0,0 +1,35 @@ +package com.heachi.mysql.define.group.background; + +import com.heachi.mysql.define.BaseEntity; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Entity(name = "GROUP_BG") +public class GroupBg extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "GROUP_BG_ID") + private Long id; // GROUP의 배경색 아이디 + + @Column(name = "BG_COLOR", nullable = false) + private String bgColor; // 그룹의 배경색 + + @Column(name = "COLOR_CODE", nullable = false) + private String colorCode; // 그룹의 색상 코드 + + @Column(name = "GRADIENT", nullable = false) + private String gradient; // 그룹의 CSS 속성 + + @Builder + public GroupBg(String bgColor, String colorCode, String gradient) { + this.bgColor = bgColor; + this.colorCode = colorCode; + this.gradient = gradient; + } +} \ No newline at end of file diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/info/GroupInfo.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/info/GroupInfo.java index c8a6ae5c..cf5ff417 100644 --- a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/info/GroupInfo.java +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/info/GroupInfo.java @@ -1,6 +1,7 @@ package com.heachi.mysql.define.group.info; import com.heachi.mysql.define.BaseEntity; +import com.heachi.mysql.define.housework.todo.HouseworkTodo; import com.heachi.mysql.define.user.User; import jakarta.persistence.*; import lombok.AccessLevel; @@ -8,6 +9,9 @@ import lombok.Getter; import lombok.NoArgsConstructor; +import java.util.ArrayList; +import java.util.List; + @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity(name = "GROUP_INFO") @@ -18,6 +22,9 @@ public class GroupInfo extends BaseEntity { @Column(name = "GROUP_INFO_ID") private Long id; // 아이디 + @OneToMany(mappedBy = "groupInfo") // 집안일 리스트 + private List houseworkTodoList = new ArrayList<>(); + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "USER_ID", nullable = false) private User user; // 그룹장 아이디 @@ -28,6 +35,9 @@ public class GroupInfo extends BaseEntity { @Column(name = "COLOR_CODE", nullable = false) private String colorCode; // 그룹 색상코드 + @Column(name = "GRADIENT", nullable = false) + private String gradient; // 그룹의 css 속성 + @Column(name = "NAME", nullable = false) private String name; // 그룹 이름 @@ -38,13 +48,13 @@ public class GroupInfo extends BaseEntity { private String joinCode; // 그룹 가입코드 @Builder - private GroupInfo(User user, String bgColor, String colorCode, String name, String info, String joinCode) { + public GroupInfo(User user, String bgColor, String colorCode, String gradient, String name, String info, String joinCode) { this.user = user; this.bgColor = bgColor; this.colorCode = colorCode; + this.gradient = gradient; this.name = name; this.info = info; this.joinCode = joinCode; } - } diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/member/GroupMember.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/member/GroupMember.java index 9acd4b93..13d50197 100644 --- a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/member/GroupMember.java +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/member/GroupMember.java @@ -37,7 +37,7 @@ public class GroupMember extends BaseEntity { @Enumerated(EnumType.STRING) @Column(name = "STATUS") @ColumnDefault(value = "'WAITING'") - private GroupMemberStatus status; // 구성원 상태 (대기 중, 수락) + private GroupMemberStatus status; // 구성원 상태 (대기 중, 수락, 탈퇴) @Builder private GroupMember(GroupInfo groupInfo, User user, GroupMemberRole role, GroupMemberStatus status) { diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/member/constant/GroupMemberStatus.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/member/constant/GroupMemberStatus.java index 2735e565..e1ce4dd5 100644 --- a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/member/constant/GroupMemberStatus.java +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/member/constant/GroupMemberStatus.java @@ -1,5 +1,7 @@ package com.heachi.mysql.define.group.member.constant; public enum GroupMemberStatus { - WAITING, ACCEPT + WAITING, // 수락 대기중 + ACCEPT, // 수락 (그룹 구성원) + WITHDRAW // 그룹 탈퇴 } diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/HouseworkInfo.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/HouseworkInfo.java index c694837a..fb6bf104 100644 --- a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/HouseworkInfo.java +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/HouseworkInfo.java @@ -2,6 +2,7 @@ import com.heachi.mysql.define.BaseEntity; import com.heachi.mysql.define.housework.category.HouseworkCategory; +import com.heachi.mysql.define.housework.info.constant.HouseworkPeriodType; import com.heachi.mysql.define.housework.todo.constant.HouseworkTodoStatus; import com.heachi.mysql.define.housework.member.HouseworkMember; import jakarta.persistence.*; @@ -11,6 +12,7 @@ import lombok.NoArgsConstructor; import java.util.ArrayList; +import java.util.Date; import java.util.List; @Getter @@ -36,11 +38,34 @@ public class HouseworkInfo extends BaseEntity { @Column(name = "DETAIL") private String detail; // 집안일 내용 + @Enumerated(EnumType.STRING) + @Column(name = "TYPE", nullable = false) + private HouseworkPeriodType type; // 집안일 주기 타입 (한번, 매일, 매주, 매달) + + @Temporal(TemporalType.DATE) + @Column(name = "DAY_DATE") + private Date dayDate; // 단건: 날짜 정보 + + @Column(name = "WEEK_DATE") + private String weekDate; // 매주: 요일 정보 (일~토: 0~6) + + @Column(name = "MONTH_DATE") + private String monthDate; // 매달: 일 정보 (1,23,25) + + @Temporal(TemporalType.TIME) + @Column(name = "END_TIME") + private Date endTime; // 집안일 마감 시간 (시간정보만) + @Builder - private HouseworkInfo(List houseworkMembers, HouseworkCategory houseworkCategory, String title, String detail) { + private HouseworkInfo(List houseworkMembers, HouseworkCategory houseworkCategory, String title, String detail, HouseworkPeriodType type, Date dayDate, String weekDate, String monthDate, Date endTime) { this.houseworkMembers = houseworkMembers; this.houseworkCategory = houseworkCategory; this.title = title; this.detail = detail; + this.type = type; + this.dayDate = dayDate; + this.weekDate = weekDate; + this.monthDate = monthDate; + this.endTime = endTime; } } diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/constant/HouseworkPeriodType.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/constant/HouseworkPeriodType.java new file mode 100644 index 00000000..f3a86644 --- /dev/null +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/constant/HouseworkPeriodType.java @@ -0,0 +1,8 @@ +package com.heachi.mysql.define.housework.info.constant; + +public enum HouseworkPeriodType { + HOUSEWORK_PERIOD_DAY, // 딱 한번 (Date) ex. 2022.09.12 + HOUSEWORK_PERIOD_EVERYDAY, // 매일 + HOUSEWORK_PERIOD_WEEK, // 주마다 (String) ex. 월,화 + HOUSEWORK_PERIOD_MONTH // 달마다 (String) ex. 1,23,29 +} diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/period/HouseworkPeriod.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/period/HouseworkPeriod.java deleted file mode 100644 index 65232c82..00000000 --- a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/period/HouseworkPeriod.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.heachi.mysql.define.housework.period; - -import com.heachi.mysql.define.BaseEntity; -import com.heachi.mysql.define.housework.info.HouseworkInfo; -import com.heachi.mysql.define.housework.period.constant.HouseworkPeriodType; -import jakarta.persistence.*; -import lombok.AccessLevel; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import org.hibernate.annotations.ColumnDefault; -import org.hibernate.annotations.DynamicInsert; - -import java.util.Date; - -@Getter -@DynamicInsert -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@Entity(name = "HOUSEWORK_PERIOD") -public class HouseworkPeriod extends BaseEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "HOUSEWORK_PERIOD_ID") - private Long id; // 집안일 주기 아이디 - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "HOUSEWORK_INFO_ID") - private HouseworkInfo houseworkInfo; // 집안일 정보 - - @Enumerated(EnumType.STRING) - @Column(name = "TYPE") - @ColumnDefault(value = "'HOUSEWORK_PERIOD_DAY'") - private HouseworkPeriodType type; // 주기 종류 - - @Temporal(TemporalType.DATE) - @Column(name = "DATE", nullable = false) - private Date date; // 날짜 - - @Temporal(TemporalType.TIME) - @Column(name = "END_TIME", nullable = false) - private Date endTime; // 집안일 마감시간 - - @Builder - public HouseworkPeriod(HouseworkInfo houseworkInfo, HouseworkPeriodType type, Date date, Date endTime) { - this.houseworkInfo = houseworkInfo; - this.type = type; - this.date = date; - this.endTime = endTime; - } -} diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/period/constant/HouseworkPeriodType.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/period/constant/HouseworkPeriodType.java deleted file mode 100644 index 79cb52bb..00000000 --- a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/period/constant/HouseworkPeriodType.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.heachi.mysql.define.housework.period.constant; - -public enum HouseworkPeriodType { - HOUSEWORK_PERIOD_DAY, // 한번 - HOUSEWORK_PERIOD_EVERYDAY, // 매일 - HOUSEWORK_PERIOD_WEEK, // 매주 -} diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/save/HouseworkSave.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/save/HouseworkSave.java index 6bf87ac6..86b03cee 100644 --- a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/save/HouseworkSave.java +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/save/HouseworkSave.java @@ -11,6 +11,7 @@ @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity(name = "HOUSEWORK_SAVE") +@Table(indexes = { @Index(name = "HOUSEWORK_SAVE_GROUP_INFO_INDEX", columnList = "GROUP_INFO_ID") }) public class HouseworkSave extends BaseEntity { @Id diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/todo/HouseworkTodo.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/todo/HouseworkTodo.java index a6649922..ba382af0 100644 --- a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/todo/HouseworkTodo.java +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/todo/HouseworkTodo.java @@ -1,6 +1,8 @@ package com.heachi.mysql.define.housework.todo; import com.heachi.mysql.define.BaseEntity; +import com.heachi.mysql.define.group.info.GroupInfo; +import com.heachi.mysql.define.housework.info.HouseworkInfo; import com.heachi.mysql.define.housework.todo.constant.HouseworkTodoStatus; import jakarta.persistence.*; import lombok.AccessLevel; @@ -10,6 +12,9 @@ import org.hibernate.annotations.ColumnDefault; import org.hibernate.annotations.DynamicInsert; +import java.time.LocalDateTime; +import java.util.Date; + @Getter @DynamicInsert @NoArgsConstructor(access = AccessLevel.PROTECTED) @@ -21,6 +26,14 @@ public class HouseworkTodo extends BaseEntity { @Column(name = "HOUSEWORK_TODO_ID") private Long id; // 집안일 할일 아이디 + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "HOUSEWORK_INFO_ID") + private HouseworkInfo houseworkInfo;// 집안일 정보 (HOUSEWORK_PERIOD_DAY)가 아닐때만 참조한다. + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "GROUP_INFO_ID") + private GroupInfo groupInfo; // 그룹 정보 + @Column(name = "HOUSEWORK_MEMBER", nullable = false) private String houseworkMember; // 집안일 담당자 (,)으로 joining @@ -33,22 +46,43 @@ public class HouseworkTodo extends BaseEntity { @Column(name = "DETAIL") private String detail; // 집안일 내용 - @Column(name = "INDEX", nullable = false) + @Column(name = "IDX") @ColumnDefault(value = "0") - private Integer index; // 집안일 인덱스 (사용자가 인덱스를 변경할 수 있음) + private Integer idx; // 집안일 인덱스 (사용자가 인덱스를 변경할 수 있음) @Enumerated(EnumType.STRING) @Column(name = "STATUS") @ColumnDefault(value = "'HOUSEWORK_TODO_INCOMPLETE'") private HouseworkTodoStatus status; // 집안일 진행상황 + @Temporal(TemporalType.DATE) + @Column(name = "DATE", nullable = false) + private Date date; // 집안일 지정 날짜 + + @Column(name = "VERIFICATION_PHOTO_URL") + private String verificationPhotoURL; // 다른 사용자가 확인할 수 있는 인증 사진 URL + + @Column(name = "VERIFIER_ID") + private String verifierId; // 해당 집안일을 인증해준 사용자 + + @Column(name = "VERIFICATION_TIME") + private LocalDateTime verificationTime; // 인증된 시각 + @Builder - private HouseworkTodo(String houseworkMember, String category, String title, String detail, Integer index, HouseworkTodoStatus status) { + private HouseworkTodo(HouseworkInfo houseworkInfo, GroupInfo groupInfo, String houseworkMember, String category, + String title, String detail, Integer idx, HouseworkTodoStatus status, Date date, + String verificationPhotoURL, String verifierId, LocalDateTime verificationTime) { + this.houseworkInfo = houseworkInfo; + this.groupInfo = groupInfo; this.houseworkMember = houseworkMember; this.category = category; this.title = title; this.detail = detail; - this.index = index; + this.idx = idx; this.status = status; + this.date = date; + this.verificationPhotoURL = verificationPhotoURL; + this.verifierId = verifierId; + this.verificationTime = verificationTime; } } diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/user/User.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/user/User.java index 10a25842..25adf2ca 100644 --- a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/user/User.java +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/user/User.java @@ -1,6 +1,7 @@ package com.heachi.mysql.define.user; import com.heachi.mysql.define.BaseEntity; +import com.heachi.mysql.define.group.info.GroupInfo; import com.heachi.mysql.define.user.constant.UserPlatformType; import com.heachi.mysql.define.user.constant.UserRole; import jakarta.persistence.*; @@ -14,6 +15,7 @@ import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; +import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -21,40 +23,44 @@ @DynamicInsert // Entity save 시점에 null 값은 배제하고 Insert Query를 날려줌 @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity(name = "USERS") +@Table(indexes = { @Index(name = "USERS_EMAIL_INDEX", columnList = "EMAIL") }) public class User extends BaseEntity implements UserDetails { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "USER_ID") - private Long id; // 아이디 + private Long id; // 아이디 + + @OneToMany(mappedBy = "user") + private List groupInfoList = new ArrayList<>(); // 가입된 모든 그룹 리스트 @Column(name = "PLATFORM_ID") - private String platformId; // 플랫폼 아이디 + private String platformId; // 플랫폼 아이디 @Enumerated(EnumType.STRING) @Column(name = "PLATFORM_TYPE") @ColumnDefault(value = "'KAKAO'") - private UserPlatformType platformType; // 플랫폼 타입 + private UserPlatformType platformType; // 플랫폼 타입 @Enumerated(EnumType.STRING) @Column(name = "ROLE") @ColumnDefault(value = "'UNAUTH'") - private UserRole role; // 역할 + private UserRole role; // 역할 @Column(name = "NAME") - private String name; // 이름 + private String name; // 이름 @Column(name = "EMAIL", unique = true) - private String email; // 이메일 + private String email; // 이메일 - @Column(name = "PHONE_NUMBER") - private String phoneNumber; // 전화번호 + @Column(name = "PHONE_NUMBER", unique = true) + private String phoneNumber; // 전화번호 @Column(name = "PROFILE_IMAGE_URL") - private String profileImageUrl; // 프로필 사진 + private String profileImageUrl; // 프로필 사진 @Column(name = "PUSH_ALARM_YN") - private boolean pushAlarmYn = false; // 알림 수신 동의 + private boolean pushAlarmYn = false; // 알림 수신 동의 public void updateProfile(String name, String profileImageUrl) { this.profileImageUrl = profileImageUrl; @@ -67,7 +73,8 @@ public void updateRegister(UserRole role, String phoneNumber) { } @Builder - private User(String platformId, UserPlatformType platformType, UserRole role, String name, String email, String phoneNumber, String profileImageUrl) { + private User(List groupInfoList, String platformId, UserPlatformType platformType, UserRole role, String name, String email, String phoneNumber, String profileImageUrl, boolean pushAlarmYn) { + this.groupInfoList = groupInfoList; this.platformId = platformId; this.platformType = platformType; this.role = role; @@ -75,6 +82,7 @@ private User(String platformId, UserPlatformType platformType, UserRole role, St this.email = email; this.phoneNumber = phoneNumber; this.profileImageUrl = profileImageUrl; + this.pushAlarmYn = pushAlarmYn; } // Spring Security UserDetails Area diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/user/constant/UserRole.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/user/constant/UserRole.java index c3fb8ab3..8dec7517 100644 --- a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/user/constant/UserRole.java +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/user/constant/UserRole.java @@ -8,8 +8,7 @@ public enum UserRole { UNAUTH("미인증"), USER("유저"), - CHEMIST("약사"), - CENTER("보건소"); + WITHDRAWAL("탈퇴"); private final String text; } diff --git a/heachi-notify/src/main/java/com/heachi/notify/api/controller/request/NotifyRegistRequest.java b/heachi-notify/src/main/java/com/heachi/notify/api/controller/request/NotifyRegistRequest.java index f579ef1a..be60e13f 100644 --- a/heachi-notify/src/main/java/com/heachi/notify/api/controller/request/NotifyRegistRequest.java +++ b/heachi-notify/src/main/java/com/heachi/notify/api/controller/request/NotifyRegistRequest.java @@ -13,6 +13,5 @@ public class NotifyRegistRequest { private List receiveUserIds = new ArrayList<>(); // 알림을 받는 아이디 private NotifyType type; // 알림 종류 private String message; // 알림 내용 - private String generatedUrl; // 알림의 근원지 private String url; // 알림 클릭 시 이동할 주소 } diff --git a/heachi-notify/src/main/java/com/heachi/notify/api/service/notify/request/NotifyServiceRegistRequest.java b/heachi-notify/src/main/java/com/heachi/notify/api/service/notify/request/NotifyServiceRegistRequest.java index 35196b8a..d1819e67 100644 --- a/heachi-notify/src/main/java/com/heachi/notify/api/service/notify/request/NotifyServiceRegistRequest.java +++ b/heachi-notify/src/main/java/com/heachi/notify/api/service/notify/request/NotifyServiceRegistRequest.java @@ -18,17 +18,15 @@ public class NotifyServiceRegistRequest { private List receiveUserIds = new ArrayList<>(); // 알림을 받는 아이디 private NotifyType type; // 알림 종류 private String message; // 알림 내용 - private String generatedUrl; // 알림의 근원지 private String url; // 알림 클릭 시 이동할 주소 @Builder - private NotifyServiceRegistRequest(String sendUserId, List receiveUserIds, NotifyType type, String message - , String generatedUrl, String url) { + private NotifyServiceRegistRequest(String sendUserId, List receiveUserIds, + NotifyType type, String message, String url) { this.sendUserId = sendUserId; this.receiveUserIds = receiveUserIds; this.type = type; this.message = message; - this.generatedUrl = generatedUrl; this.url = url; } @@ -38,7 +36,6 @@ public static NotifyServiceRegistRequest of(NotifyRegistRequest request, String .receiveUserIds(request.getReceiveUserIds()) .type(request.getType()) .message(request.getMessage()) - .generatedUrl(request.getGeneratedUrl()) .url(request.getUrl()) .build(); } @@ -49,7 +46,6 @@ public Notify toEntity() { .receiveUserIds(this.receiveUserIds) .type(this.type) .message(this.message) - .generatedUrl(this.generatedUrl) .createdTime(LocalDateTime.now()) .checkedTime(new HashMap<>()) .checked(new HashSet<>()) diff --git a/heachi-notify/src/main/java/com/heachi/notify/api/service/notify/response/NotifyServiceReceiverResponse.java b/heachi-notify/src/main/java/com/heachi/notify/api/service/notify/response/NotifyServiceReceiverResponse.java index c0446af0..91cc5a4b 100644 --- a/heachi-notify/src/main/java/com/heachi/notify/api/service/notify/response/NotifyServiceReceiverResponse.java +++ b/heachi-notify/src/main/java/com/heachi/notify/api/service/notify/response/NotifyServiceReceiverResponse.java @@ -17,7 +17,6 @@ public class NotifyServiceReceiverResponse { private String receiveUserIds; // 알림을 받는 아이디 private NotifyType type; // 알림 종류 private String message; // 알림 내용 - private String generatedUrl; // 알림의 근원지 private String url; // 알림 클릭 시 이동할 주소 private LocalDateTime createdTime; // 알림 발생 시간 private LocalDateTime checkedTime; // 알림 확인 시간 @@ -26,14 +25,13 @@ public class NotifyServiceReceiverResponse { @Builder public NotifyServiceReceiverResponse(String id, String sendUserId, String receiveUserIds, NotifyType type, - String message, String generatedUrl, String url, LocalDateTime createdTime, + String message, String url, LocalDateTime createdTime, LocalDateTime checkedTime, boolean checked, String dateDistance) { this.id = id; this.sendUserId = sendUserId; this.receiveUserIds = receiveUserIds; this.type = type; this.message = message; - this.generatedUrl = generatedUrl; this.url = url; this.createdTime = createdTime; this.checkedTime = checkedTime; @@ -48,7 +46,6 @@ public static NotifyServiceReceiverResponse of(Notify notify, String receiveUser .receiveUserIds(receiveUserId) .type(notify.getType()) .message(notify.getMessage()) - .generatedUrl(notify.getGeneratedUrl()) .url(notify.getUrl()) .createdTime(notify.getCreatedTime()) .checkedTime(notify.getCheckedTime().get(receiveUserId)) diff --git a/heachi-notify/src/test/java/com/heachi/notify/api/service/auth/AuthServiceTest.java b/heachi-notify/src/test/java/com/heachi/notify/api/service/auth/AuthServiceTest.java index 7cfe2812..3469fa53 100644 --- a/heachi-notify/src/test/java/com/heachi/notify/api/service/auth/AuthServiceTest.java +++ b/heachi-notify/src/test/java/com/heachi/notify/api/service/auth/AuthServiceTest.java @@ -56,7 +56,7 @@ void getUserInfoSuccess() { // then .expectSubscription() .expectNextMatches(userId -> { - assertThat(userId).isEqualTo("id"); + assertThat(userId).isEqualTo("role"); return true; }) From ca700f11ca697b9fc9efe861c34db1c7229887ad Mon Sep 17 00:00:00 2001 From: ghdcksgml1 Date: Mon, 9 Oct 2023 22:55:15 +0900 Subject: [PATCH 02/21] =?UTF-8?q?feat(#67):=20Entity=20Repository=20interf?= =?UTF-8?q?ace=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../group/background/repository/GroupBgRepository.java | 7 +++++++ .../define/group/info/repository/GroupInfoRepository.java | 7 +++++++ .../category/repository/HouseworkCategoryRepository.java | 7 +++++++ .../housework/info/repository/HouseworkInfoRepository.java | 7 +++++++ .../member/repository/HouseworkMemberRepository.java | 7 +++++++ .../housework/save/repository/HouseworkSaveRepository.java | 7 +++++++ .../housework/todo/repository/HouseworkTodoRepository.java | 7 +++++++ 7 files changed, 49 insertions(+) create mode 100644 heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/background/repository/GroupBgRepository.java create mode 100644 heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/info/repository/GroupInfoRepository.java create mode 100644 heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/category/repository/HouseworkCategoryRepository.java create mode 100644 heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/repository/HouseworkInfoRepository.java create mode 100644 heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepository.java create mode 100644 heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/save/repository/HouseworkSaveRepository.java create mode 100644 heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/todo/repository/HouseworkTodoRepository.java diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/background/repository/GroupBgRepository.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/background/repository/GroupBgRepository.java new file mode 100644 index 00000000..805324b0 --- /dev/null +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/background/repository/GroupBgRepository.java @@ -0,0 +1,7 @@ +package com.heachi.mysql.define.group.background.repository; + +import com.heachi.mysql.define.group.background.GroupBg; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface GroupBgRepository extends JpaRepository { +} diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/info/repository/GroupInfoRepository.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/info/repository/GroupInfoRepository.java new file mode 100644 index 00000000..44f7f4f6 --- /dev/null +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/info/repository/GroupInfoRepository.java @@ -0,0 +1,7 @@ +package com.heachi.mysql.define.group.info.repository; + +import com.heachi.mysql.define.group.info.GroupInfo; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface GroupInfoRepository extends JpaRepository { +} diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/category/repository/HouseworkCategoryRepository.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/category/repository/HouseworkCategoryRepository.java new file mode 100644 index 00000000..9e5bd1a9 --- /dev/null +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/category/repository/HouseworkCategoryRepository.java @@ -0,0 +1,7 @@ +package com.heachi.mysql.define.housework.category.repository; + +import com.heachi.mysql.define.housework.category.HouseworkCategory; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface HouseworkCategoryRepository extends JpaRepository { +} diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/repository/HouseworkInfoRepository.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/repository/HouseworkInfoRepository.java new file mode 100644 index 00000000..cd96d063 --- /dev/null +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/repository/HouseworkInfoRepository.java @@ -0,0 +1,7 @@ +package com.heachi.mysql.define.housework.info.repository; + +import com.heachi.mysql.define.housework.info.HouseworkInfo; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface HouseworkInfoRepository extends JpaRepository { +} diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepository.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepository.java new file mode 100644 index 00000000..f8fce88b --- /dev/null +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/member/repository/HouseworkMemberRepository.java @@ -0,0 +1,7 @@ +package com.heachi.mysql.define.housework.member.repository; + +import com.heachi.mysql.define.housework.member.HouseworkMember; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface HouseworkMemberRepository extends JpaRepository { +} diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/save/repository/HouseworkSaveRepository.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/save/repository/HouseworkSaveRepository.java new file mode 100644 index 00000000..0d9c711a --- /dev/null +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/save/repository/HouseworkSaveRepository.java @@ -0,0 +1,7 @@ +package com.heachi.mysql.define.housework.save.repository; + +import com.heachi.mysql.define.housework.save.HouseworkSave; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface HouseworkSaveRepository extends JpaRepository { +} diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/todo/repository/HouseworkTodoRepository.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/todo/repository/HouseworkTodoRepository.java new file mode 100644 index 00000000..3eff71ac --- /dev/null +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/todo/repository/HouseworkTodoRepository.java @@ -0,0 +1,7 @@ +package com.heachi.mysql.define.housework.todo.repository; + +import com.heachi.mysql.define.housework.todo.HouseworkTodo; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface HouseworkTodoRepository extends JpaRepository { +} From 4a0f5e2da566b81922564697c44a0cd3e456e815 Mon Sep 17 00:00:00 2001 From: ghdcksgml1 Date: Mon, 9 Oct 2023 22:58:14 +0900 Subject: [PATCH 03/21] =?UTF-8?q?refactor(#67):=20AllargsConstructor?= =?UTF-8?q?=EB=8A=94=20@Builder=20=ED=8C=A8=ED=84=B4=EC=9D=84=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=ED=95=98=EB=AF=80=EB=A1=9C,=20private=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/heachi/mysql/define/group/background/GroupBg.java | 2 +- .../java/com/heachi/mysql/define/group/info/GroupInfo.java | 2 +- .../src/main/java/com/heachi/mysql/define/user/User.java | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/background/GroupBg.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/background/GroupBg.java index 12c105c8..c2dcc8ba 100644 --- a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/background/GroupBg.java +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/background/GroupBg.java @@ -27,7 +27,7 @@ public class GroupBg extends BaseEntity { private String gradient; // 그룹의 CSS 속성 @Builder - public GroupBg(String bgColor, String colorCode, String gradient) { + private GroupBg(String bgColor, String colorCode, String gradient) { this.bgColor = bgColor; this.colorCode = colorCode; this.gradient = gradient; diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/info/GroupInfo.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/info/GroupInfo.java index cf5ff417..8be977bb 100644 --- a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/info/GroupInfo.java +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/info/GroupInfo.java @@ -48,7 +48,7 @@ public class GroupInfo extends BaseEntity { private String joinCode; // 그룹 가입코드 @Builder - public GroupInfo(User user, String bgColor, String colorCode, String gradient, String name, String info, String joinCode) { + private GroupInfo(User user, String bgColor, String colorCode, String gradient, String name, String info, String joinCode) { this.user = user; this.bgColor = bgColor; this.colorCode = colorCode; diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/user/User.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/user/User.java index 25adf2ca..007dddd3 100644 --- a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/user/User.java +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/user/User.java @@ -73,7 +73,8 @@ public void updateRegister(UserRole role, String phoneNumber) { } @Builder - private User(List groupInfoList, String platformId, UserPlatformType platformType, UserRole role, String name, String email, String phoneNumber, String profileImageUrl, boolean pushAlarmYn) { + private User(List groupInfoList, String platformId, UserPlatformType platformType, UserRole role, + String name, String email, String phoneNumber, String profileImageUrl, boolean pushAlarmYn) { this.groupInfoList = groupInfoList; this.platformId = platformId; this.platformType = platformType; From d10de5761c0b27ce519caa3d0cb075968fdfae7a Mon Sep 17 00:00:00 2001 From: ghdcksgml1 Date: Tue, 10 Oct 2023 13:15:23 +0900 Subject: [PATCH 04/21] =?UTF-8?q?refactor:=20swagger=20=EC=84=A4=EB=AA=85?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/heachi/auth/config/swagger/SwaggerConfig.java | 5 +++-- .../java/com/heachi/notify/config/swagger/SwaggerConfig.java | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/heachi-core/auth-api/src/main/java/com/heachi/auth/config/swagger/SwaggerConfig.java b/heachi-core/auth-api/src/main/java/com/heachi/auth/config/swagger/SwaggerConfig.java index 096111fe..9ae64f13 100644 --- a/heachi-core/auth-api/src/main/java/com/heachi/auth/config/swagger/SwaggerConfig.java +++ b/heachi-core/auth-api/src/main/java/com/heachi/auth/config/swagger/SwaggerConfig.java @@ -22,9 +22,10 @@ public class SwaggerConfig { @Bean public OpenAPI openAPI(@Value("${heachiCoreAuthUrls}") String[] serverList) { Info info = new Info() - .title("Heachi-Auth Server") + .title("N빵 집안일 사용자 인증 API Document") .version("0.1") - .description("N빵 집안일 인증서버 API 문서입니다.") + .description("N빵 집안일 인증서버 API 문서입니다.\n" + + "해당 문서를 이용해 N빵 집안일 REST API를 테스트해볼 수 있습니다.") .contact(new Contact() .name("📍 N-bbang-housework Backend GitHub Link") .url("https://github.com/ghdcksgml1/N-bbang-housework")) diff --git a/heachi-notify/src/main/java/com/heachi/notify/config/swagger/SwaggerConfig.java b/heachi-notify/src/main/java/com/heachi/notify/config/swagger/SwaggerConfig.java index df91410d..65e028a2 100644 --- a/heachi-notify/src/main/java/com/heachi/notify/config/swagger/SwaggerConfig.java +++ b/heachi-notify/src/main/java/com/heachi/notify/config/swagger/SwaggerConfig.java @@ -22,9 +22,10 @@ public class SwaggerConfig { @Bean public OpenAPI openAPI(@Value("${heachiNotifyUrls}") String[] serverList) { Info info = new Info() - .title("Heachi-Notify Server") + .title("N빵 집안일 알림 API Document") .version("0.1") - .description("N빵 집안일 알림서버 API 문서입니다.") + .description("N빵 집안일 알림서버 API 문서입니다.\n" + + "해당 문서를 이용해 N빵 집안일 REST API를 테스트해볼 수 있습니다.") .contact(new Contact() .name("📍 N-bbang-housework Backend GitHub Link") .url("https://github.com/ghdcksgml1/N-bbang-housework")) From 2dfa1cb0f1bc1384c8432b099f890a5213afc80d Mon Sep 17 00:00:00 2001 From: ghdcksgml1 Date: Sat, 14 Oct 2023 17:25:35 +0900 Subject: [PATCH 05/21] =?UTF-8?q?setting(#61):=20housework=20=EB=AA=A8?= =?UTF-8?q?=EB=93=88=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- heachi-core/housework-api/build.gradle | 70 +++++++++++++++++++ .../housework/HeachiHouseworkApplication.java | 13 ++++ .../heachi/housework/config/AppConfig.java | 45 ++++++++++++ .../config/advice/GlobalExceptionHandler.java | 28 ++++++++ .../config/swagger/SwaggerConfig.java | 53 ++++++++++++++ settings.gradle | 1 + 6 files changed, 210 insertions(+) create mode 100644 heachi-core/housework-api/build.gradle create mode 100644 heachi-core/housework-api/src/main/java/com/heachi/housework/HeachiHouseworkApplication.java create mode 100644 heachi-core/housework-api/src/main/java/com/heachi/housework/config/AppConfig.java create mode 100644 heachi-core/housework-api/src/main/java/com/heachi/housework/config/advice/GlobalExceptionHandler.java create mode 100644 heachi-core/housework-api/src/main/java/com/heachi/housework/config/swagger/SwaggerConfig.java diff --git a/heachi-core/housework-api/build.gradle b/heachi-core/housework-api/build.gradle new file mode 100644 index 00000000..7f5adadb --- /dev/null +++ b/heachi-core/housework-api/build.gradle @@ -0,0 +1,70 @@ +plugins { + id 'com.google.cloud.tools.jib' version '3.3.2' +} + +bootJar { + // 빌드된 Jar 파일명 지정 + archiveFileName = "heachi-housework-" + buildVersion + ".jar" +} + +dependencies { + // 내부 모듈 + implementation project(':heachi-support:common') + implementation project(':heachi-support:logging') + implementation project(':heachi-support:external-clients') + implementation project(':heachi-domain-mysql') + implementation project(':heachi-domain-redis') + + implementation 'org.springframework.boot:spring-boot-starter-web' // Spring Web + implementation 'org.springframework.boot:spring-boot-starter-validation' // Bean Validation + + // Swagger + implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.1.0") + + testCompileOnly project(':heachi-support:common') + testCompileOnly project(':heachi-support:logging') + testCompileOnly project(':heachi-domain-mysql') + testImplementation 'org.springframework.boot:spring-boot-starter-test' +} + +jib { + from { + image = 'eclipse-temurin:17-jre' // https://github.com/GoogleContainerTools/jib/issues/3483 + platforms { + platform { + architecture = "arm64" + os = "linux" + } + } + } + to { + image = 'ghdcksgml1/heachi-housework' + tags = [buildVersion, "latest"] + auth { + username = dockerUsername + password = dockerPassword + } + } + container { + + entrypoint = ['java', '-Dspring.profiles.active=prod', '-jar', 'heachi-housework-' + buildVersion + '.jar'] + jvmFlags = ['-Xms2048m', '-Xmx2048m', '-Xdebug', '-XshowSettings:vm', '-XX:+UnlockExperimentalVMOptions', '-XX:+UseContainerSupport'] + ports = ['8000'] + environment = [SPRING_OUTPUT_ANSI_ENABLED: "ALWAYS"] + + creationTime = 'USE_CURRENT_TIMESTAMP' + format = 'Docker' + } + + // 어디 폴더로 부터 가져올지 + extraDirectories { + paths { + path { + from = file('build/libs') + } + } + } +} + +bootJar.enabled = true +jar.enabled = false \ No newline at end of file diff --git a/heachi-core/housework-api/src/main/java/com/heachi/housework/HeachiHouseworkApplication.java b/heachi-core/housework-api/src/main/java/com/heachi/housework/HeachiHouseworkApplication.java new file mode 100644 index 00000000..f712b970 --- /dev/null +++ b/heachi-core/housework-api/src/main/java/com/heachi/housework/HeachiHouseworkApplication.java @@ -0,0 +1,13 @@ +package com.heachi.housework; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; + +@SpringBootApplication(scanBasePackages = "com.heachi", exclude = SecurityAutoConfiguration.class) +public class HeachiHouseworkApplication { + + public static void main(String[] args) { + SpringApplication.run(HeachiHouseworkApplication.class, args); + } +} diff --git a/heachi-core/housework-api/src/main/java/com/heachi/housework/config/AppConfig.java b/heachi-core/housework-api/src/main/java/com/heachi/housework/config/AppConfig.java new file mode 100644 index 00000000..45c9a475 --- /dev/null +++ b/heachi-core/housework-api/src/main/java/com/heachi/housework/config/AppConfig.java @@ -0,0 +1,45 @@ +package com.heachi.housework.config; + +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@EnableWebMvc +@Configuration +@RequiredArgsConstructor +public class AppConfig implements WebMvcConfigurer { + + @Value("${spring.profiles.active}") + private String activeProfile; + + @Override + public void addCorsMappings(CorsRegistry registry) { + if (activeProfile.equals("prod")) { + prodProfileCorsMapping(registry); + } else { + devProfileCorsMapping(registry); + } + } + + // 개발환경에서는 Cors 모두 오픈 + private void devProfileCorsMapping(CorsRegistry registry) { + + registry.addMapping("/**") + .allowedOriginPatterns("*") + .allowedMethods("GET","POST","OPTIONS") + .allowedHeaders("*") + .allowCredentials(true); + } + + // 프로덕션 환경에서는 Cors 설정을 Front 페이지와 허용할 서버만 등록해준다. + private void prodProfileCorsMapping(CorsRegistry registry) { + registry.addMapping("/**") + .allowedOriginPatterns("*") + .allowedMethods("GET","POST","OPTIONS") + .allowedHeaders("*") + .allowCredentials(true); + } +} diff --git a/heachi-core/housework-api/src/main/java/com/heachi/housework/config/advice/GlobalExceptionHandler.java b/heachi-core/housework-api/src/main/java/com/heachi/housework/config/advice/GlobalExceptionHandler.java new file mode 100644 index 00000000..02667da0 --- /dev/null +++ b/heachi-core/housework-api/src/main/java/com/heachi/housework/config/advice/GlobalExceptionHandler.java @@ -0,0 +1,28 @@ +package com.heachi.housework.config.advice; + +import com.heachi.admin.common.response.JsonResult; +import org.springframework.validation.BindException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import java.util.stream.Collectors; + +@RestControllerAdvice +public class GlobalExceptionHandler { + + @ExceptionHandler(BindException.class) + public JsonResult bindException(BindException e) { + return JsonResult.failOf( + e.getBindingResult() + .getFieldErrors() + .stream() + .map(fieldError -> fieldError.getField() + ": " + fieldError.getDefaultMessage()) + .collect(Collectors.joining(", ")) + ); + } + + @ExceptionHandler(Exception.class) + public JsonResult exception(Exception e) { + return JsonResult.failOf(e.getMessage()); + } +} \ No newline at end of file diff --git a/heachi-core/housework-api/src/main/java/com/heachi/housework/config/swagger/SwaggerConfig.java b/heachi-core/housework-api/src/main/java/com/heachi/housework/config/swagger/SwaggerConfig.java new file mode 100644 index 00000000..08455187 --- /dev/null +++ b/heachi-core/housework-api/src/main/java/com/heachi/housework/config/swagger/SwaggerConfig.java @@ -0,0 +1,53 @@ +package com.heachi.housework.config.swagger; + +import io.swagger.v3.oas.models.Components; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Contact; +import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.info.License; +import io.swagger.v3.oas.models.security.SecurityRequirement; +import io.swagger.v3.oas.models.security.SecurityScheme; +import io.swagger.v3.oas.models.servers.Server; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +@Configuration +public class SwaggerConfig { + + @Bean + public OpenAPI openAPI(@Value("${heachiCoreAuthUrls}") String[] serverList) { + Info info = new Info() + .title("N빵 집안일 도메인 API Document") + .version("0.1") + .description("N빵 집안일 도메인 API 문서입니다.\n" + + "해당 문서를 이용해 N빵 집안일 REST API를 테스트해볼 수 있습니다.") + .contact(new Contact() + .name("📍 N-bbang-housework Backend GitHub Link") + .url("https://github.com/ghdcksgml1/N-bbang-housework")) + .license(new License() + .name("⚖️ Apache License Version 2.0") + .url("http://www.apache.org/licenses/LICENSE-2.0")); + + List servers = Arrays.stream(serverList) + .map((url) -> new Server().url(url)) + .collect(Collectors.toList()); + + SecurityScheme securityScheme = new SecurityScheme() + .name("Bearer Authentication") + .type(SecurityScheme.Type.HTTP) + .bearerFormat("JWT") + .scheme("Bearer"); + SecurityRequirement schemaRequirement = new SecurityRequirement().addList("bearerAuth"); + + return new OpenAPI() + .components(new Components().addSecuritySchemes("bearerAuth", securityScheme)) + .security(Arrays.asList(schemaRequirement)) + .info(info) + .servers(servers); + } +} diff --git a/settings.gradle b/settings.gradle index 7e803280..2596405d 100644 --- a/settings.gradle +++ b/settings.gradle @@ -2,6 +2,7 @@ rootProject.name = "heachi" include( "heachi-core:auth-api", + "heachi-core:housework-api", "heachi-domain-mongo", "heachi-domain-mysql", "heachi-domain-redis", From 3982ecbfe93d5b7a51c9f2e3ec130423e9050206 Mon Sep 17 00:00:00 2001 From: ghdcksgml1 Date: Sat, 14 Oct 2023 17:31:24 +0900 Subject: [PATCH 06/21] =?UTF-8?q?chore(#61):=20=EB=AA=A8=EB=93=88=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EB=B9=8C?= =?UTF-8?q?=EB=93=9C=20=EA=B3=BC=EC=A0=95=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/CI_dev_pull_request.yml | 2 ++ .github/workflows/CI_main_push.yml | 2 ++ 2 files changed, 4 insertions(+) diff --git a/.github/workflows/CI_dev_pull_request.yml b/.github/workflows/CI_dev_pull_request.yml index a5ef2828..2f9b2a81 100644 --- a/.github/workflows/CI_dev_pull_request.yml +++ b/.github/workflows/CI_dev_pull_request.yml @@ -21,6 +21,7 @@ jobs: - name: resources 폴더 생성 run: | mkdir -p ./heachi-core/auth-api/src/main/resources + mkdir -p ./heachi-core/housework-api/src/main/resources mkdir -p ./heachi-domain-mongo/src/main/resources mkdir -p ./heachi-domain-mysql/src/main/resources mkdir -p ./heachi-domain-redis/src/main/resources @@ -32,6 +33,7 @@ jobs: - name: yml 파일 생성 run: | echo "${{ secrets.HEACHICORE_AUTHAPI_APPLICATION }}" > ./heachi-core/auth-api/src/main/resources/application.yml + echo "${{ secrets.HEACHICORE_HOUSEWORKAPI_APPLICATION }}" > ./heachi-core/housework-api/src/main/resources/application.yml echo "${{ secrets.HEACHIDOMAINMONGO_APPLICATION }}" > ./heachi-domain-mongo/src/main/resources/application.yml echo "${{ secrets.HEACHIDOMAINMYSQL_DATABASE }}" > ./heachi-domain-mysql/src/main/resources/database.yml echo "${{ secrets.HEACHIDOMAINREDIS_DATABASE }}" > ./heachi-domain-redis/src/main/resources/redis.yml diff --git a/.github/workflows/CI_main_push.yml b/.github/workflows/CI_main_push.yml index 1df861c7..ec2062bd 100644 --- a/.github/workflows/CI_main_push.yml +++ b/.github/workflows/CI_main_push.yml @@ -21,6 +21,7 @@ jobs: - name: resources 폴더 생성 run: | mkdir -p ./heachi-core/auth-api/src/main/resources + mkdir -p ./heachi-core/housework-api/src/main/resources mkdir -p ./heachi-domain-mongo/src/main/resources mkdir -p ./heachi-domain-mysql/src/main/resources mkdir -p ./heachi-domain-redis/src/main/resources @@ -33,6 +34,7 @@ jobs: - name: yml 파일 생성 run: | echo "${{ secrets.HEACHICORE_AUTHAPI_APPLICATION }}" > ./heachi-core/auth-api/src/main/resources/application.yml + echo "${{ secrets.HEACHICORE_HOUSEWORKAPI_APPLICATION }}" > ./heachi-core/housework-api/src/main/resources/application.yml echo "${{ secrets.HEACHIDOMAINMONGO_APPLICATION }}" > ./heachi-domain-mongo/src/main/resources/application.yml echo "${{ secrets.HEACHIDOMAINMYSQL_DATABASE }}" > ./heachi-domain-mysql/src/main/resources/database.yml echo "${{ secrets.HEACHIDOMAINREDIS_DATABASE }}" > ./heachi-domain-redis/src/main/resources/redis.yml From 3dba61831722f7d0a9c3e87e48b28358598fad49 Mon Sep 17 00:00:00 2001 From: ghdcksgml1 Date: Mon, 16 Oct 2023 13:35:48 +0900 Subject: [PATCH 07/21] =?UTF-8?q?move(#70):=20QueryDsl=EC=9D=84=20domain?= =?UTF-8?q?=20=EB=AA=A8=EB=93=88=EC=97=90=EC=84=9C=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=ED=95=98=EA=B8=B0=20=EC=9C=84=ED=95=B4=20=EC=9C=84=EC=B9=98=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/heachi/mysql/config/querydsl/QueryDslConfig.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename heachi-core/auth-api/src/main/java/com/heachi/auth/config/querydsl/QuerydslConfig.java => heachi-domain-mysql/src/main/java/com/heachi/mysql/config/querydsl/QueryDslConfig.java (85%) diff --git a/heachi-core/auth-api/src/main/java/com/heachi/auth/config/querydsl/QuerydslConfig.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/config/querydsl/QueryDslConfig.java similarity index 85% rename from heachi-core/auth-api/src/main/java/com/heachi/auth/config/querydsl/QuerydslConfig.java rename to heachi-domain-mysql/src/main/java/com/heachi/mysql/config/querydsl/QueryDslConfig.java index ac47a82f..344b36b9 100644 --- a/heachi-core/auth-api/src/main/java/com/heachi/auth/config/querydsl/QuerydslConfig.java +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/config/querydsl/QueryDslConfig.java @@ -1,4 +1,4 @@ -package com.heachi.auth.config.querydsl; +package com.heachi.mysql.config.querydsl; import com.querydsl.jpa.impl.JPAQueryFactory; import jakarta.persistence.EntityManager; @@ -7,7 +7,7 @@ import org.springframework.context.annotation.Configuration; @Configuration -public class QuerydslConfig { +public class QueryDslConfig { @PersistenceContext private EntityManager em; From efbaaeb539bfc2b4f973a13e6826425269bbd804 Mon Sep 17 00:00:00 2001 From: ghdcksgml1 Date: Mon, 16 Oct 2023 13:36:46 +0900 Subject: [PATCH 08/21] =?UTF-8?q?refactor(#70):=20=ED=99=98=EA=B2=BD?= =?UTF-8?q?=EB=B3=80=EC=88=98=EB=A1=9C=20baseUrl=EC=9D=84=20=EC=A7=80?= =?UTF-8?q?=EC=A0=95=ED=95=98=EA=B8=B0=20=EC=9C=84=ED=95=B4=20=EA=B0=92=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 --- .../main/java/com/heachi/external/clients/auth/AuthClients.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/heachi-support/external-clients/src/main/java/com/heachi/external/clients/auth/AuthClients.java b/heachi-support/external-clients/src/main/java/com/heachi/external/clients/auth/AuthClients.java index 71481f01..01ec6e11 100644 --- a/heachi-support/external-clients/src/main/java/com/heachi/external/clients/auth/AuthClients.java +++ b/heachi-support/external-clients/src/main/java/com/heachi/external/clients/auth/AuthClients.java @@ -7,7 +7,7 @@ import org.springframework.web.service.annotation.GetExchange; import reactor.core.publisher.Mono; -@ExternalClients(baseUrl = "http://localhost:8080") +@ExternalClients(baseUrl = "heachi-core.auth-api") public interface AuthClients { @GetExchange(value = "/auth/info") From ea2df084b39f00b64301384db29aef8be7742392 Mon Sep 17 00:00:00 2001 From: ghdcksgml1 Date: Mon, 16 Oct 2023 13:52:37 +0900 Subject: [PATCH 09/21] =?UTF-8?q?feat(#70):=20=EB=82=A0=EC=A7=9C=20?= =?UTF-8?q?=EA=B3=84=EC=82=B0=EA=B3=BC=20=EC=BA=90=EC=8B=B1=EC=97=90=20?= =?UTF-8?q?=ED=95=84=EC=9A=94=ED=95=9C=20=EC=9C=A0=ED=8B=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 --- .../admin/common/utils/CachingStrategy.java | 76 ++++++++++++++++++ .../admin/common/utils/DayOfWeekUtils.java | 34 ++++++++ .../common/utils/CachingStrategyTest.java | 77 +++++++++++++++++++ 3 files changed, 187 insertions(+) create mode 100644 heachi-support/common/src/main/java/com/heachi/admin/common/utils/CachingStrategy.java create mode 100644 heachi-support/common/src/main/java/com/heachi/admin/common/utils/DayOfWeekUtils.java create mode 100644 heachi-support/common/src/test/java/com/heachi/admin/common/utils/CachingStrategyTest.java diff --git a/heachi-support/common/src/main/java/com/heachi/admin/common/utils/CachingStrategy.java b/heachi-support/common/src/main/java/com/heachi/admin/common/utils/CachingStrategy.java new file mode 100644 index 00000000..a1ea53f6 --- /dev/null +++ b/heachi-support/common/src/main/java/com/heachi/admin/common/utils/CachingStrategy.java @@ -0,0 +1,76 @@ +package com.heachi.admin.common.utils; + +import lombok.extern.slf4j.Slf4j; + +import java.util.function.Function; +import java.util.function.Predicate; + +@Slf4j +public class CachingStrategy { + + /** + * Caching을 위한 메소드 t1을 넣어 T2 객체를 받는다. + * f1은 캐싱이 되어있는지 확인해서 되어있다면, 가져오는 메소드 + * f2는 f1에서 가져오지 못했을때 (캐싱이 안되어있는 경우), f2를 실행시킨다. + * + * @param t1 f1, f2에 사용할 Parameter + * @param f1 t1을 받아 실행시킬 람다식 + * @param f2 f1이 실패했을때, t1을 받아 실행시킬 람다식 + * @param t1의 객체 + * @param t1을 f1이나 f2에 넣었을때 리턴하는 객체 + * + * @return + */ + public static T2 cachingIfEmpty(T1 t1, + Function f1, + Function f2) { + try { + T2 result = f1.apply(t1); // f1에 t1을 넣고 실행 + + // 만약, result가 null이라면, + if (result == null) { + return f2.apply(t1); + } else { + return result; + } + } catch (RuntimeException e) { + log.warn(">>>> Caching 과정에서 오류가 발생했습니다."); + + throw new RuntimeException(); + } + } + + /** + * Caching을 위한 메소드 t1을 넣어 T2 객체를 받는다. + * f1은 캐싱이 되어있는지 확인해서 되어있다면, 가져오는 메소드 + * f2는 f1에서 가져오지 못했을때 (캐싱이 안되어있는 경우) or 조건에 부합하지 않는 경우, f2를 실행시킨다. + * + * @param t1 f1, f2에 사용할 Parameter + * @param f1 t1을 받아 실행시킬 람다식 + * @param f2 f1이 실패했을때, t1을 받아 실행시킬 람다식 + * @param conditional f1의 리턴값인 T2가 조건을 만족하지 않는다면, f2를 실행시킴 + * @param t1의 객체 + * @param t1을 f1이나 f2에 넣었을때 리턴하는 객체 + * + * @return + */ + public static T2 cachingIfEmpty(T1 t1, + Function f1, + Function f2, + Predicate conditional) { + try { + T2 result = f1.apply(t1); // f1에 t1을 넣고 실행 + + // 만약, result가 null이거나, 조건에 부합하지 않으면 + if (result == null || !conditional.test(result)) { + return f2.apply(t1); + } else { + return result; + } + } catch (RuntimeException e) { + log.warn(">>>> Caching 과정에서 오류가 발생했습니다."); + + throw new RuntimeException(); + } + } +} diff --git a/heachi-support/common/src/main/java/com/heachi/admin/common/utils/DayOfWeekUtils.java b/heachi-support/common/src/main/java/com/heachi/admin/common/utils/DayOfWeekUtils.java new file mode 100644 index 00000000..6d65f442 --- /dev/null +++ b/heachi-support/common/src/main/java/com/heachi/admin/common/utils/DayOfWeekUtils.java @@ -0,0 +1,34 @@ +package com.heachi.admin.common.utils; + +import java.time.LocalDate; +import java.util.Arrays; + +public class DayOfWeekUtils { + + /** + * 해당 날짜가 day가 나타내는 요일인지 + * + * @param day 요일을 나타내는 숫자 (월: 1 ~ 일: 7) + * @param target day가 나타내는 요일과 같은지 판단할 날짜 + * @return + */ + public static boolean equals(int day, LocalDate target) { + + return (day == target.getDayOfWeek().getValue()); + } + + /** + * 여러개의 요일 중 하나라도 target 날짜에 들어가면 True 반환 + * + * @param day 요일을 나타내는 한개 이상의 숫자 (1,3,5 => 월,수,금) + * @param target day가 나타내는 요일과 같은지 판단할 날짜 + * @return + */ + public static boolean equals(String day, LocalDate target) { + + return Arrays.stream(day.split(",")) + .mapToInt(Integer::parseInt) + .filter(i -> equals(i, target)) + .findFirst().isPresent(); + } +} diff --git a/heachi-support/common/src/test/java/com/heachi/admin/common/utils/CachingStrategyTest.java b/heachi-support/common/src/test/java/com/heachi/admin/common/utils/CachingStrategyTest.java new file mode 100644 index 00000000..387f11b4 --- /dev/null +++ b/heachi-support/common/src/test/java/com/heachi/admin/common/utils/CachingStrategyTest.java @@ -0,0 +1,77 @@ +package com.heachi.admin.common.utils; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +class CachingStrategyTest { + + @Test + @DisplayName("만약 메소드에서 올바른 리턴값이 나온다면, 그대로 리턴해준다.") + void cachingIfEmpty() { + // given + UserTest user = new UserTest("hong", "chanhee"); + + // when + String s = CachingStrategy.cachingIfEmpty(user, UserTest::getName, UserTest::getReflectName); + + // then + assertThat(s).isEqualTo("hong chanhee"); + } + + @Test + @DisplayName("만약 첫번째 메소드에서 null이라는 리턴값이 나온다면, 두번째 메소드를 실행시킨다.") + void cachingIfEmptyMiss() { + // given + UserTest user = new UserTest("hong", "chanhee"); + + // when + String s = CachingStrategy.cachingIfEmpty(user, UserTest::nullName, UserTest::getReflectName); + + // then + assertThat(s).isEqualTo("chanhee hong"); + } + + @Test + @DisplayName("만약 첫번째 메소드에서 리턴값이 나왔지만, 조건에 걸린다면, 두번째 메소드를 실행시킨다.") + void cachingIfEmptyAddConditional() { + // given + UserTest user = new UserTest("hong", "chanhee"); + + // when + String s = CachingStrategy.cachingIfEmpty(user, UserTest::getName, UserTest::getReflectName, (str) -> str.equals(user.getReflectName())); + + // then + assertThat(s).isEqualTo("chanhee hong"); + } + + private static class UserTest { + private String firstName; + private String lastName; + + public UserTest(String firstName, String lastName) { + this.firstName = firstName; + this.lastName = lastName; + } + + public String nullName() { + return null; + } + + public String getName() { + return firstName + " " + lastName; + } + + public String getReflectName() { + + return lastName + " " + firstName; + } + + public boolean isName(String name) { + + return name.equals(getName()); + } + } +} \ No newline at end of file From f4036b1c0d66a135abe01f197b1cad66e5888a68 Mon Sep 17 00:00:00 2001 From: ghdcksgml1 Date: Mon, 16 Oct 2023 13:57:39 +0900 Subject: [PATCH 10/21] =?UTF-8?q?feat(#70):=20email=EA=B3=BC=20HOUSEWORK?= =?UTF-8?q?=5FINFO=5FID=EB=A1=9C=20=EA=B7=B8=EB=A3=B9=EB=A9=A4=EB=B2=84=20?= =?UTF-8?q?=EC=97=AC=EB=B6=80=EB=A5=BC=20=ED=99=95=EC=9D=B8=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EC=BF=BC=EB=A6=AC=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/GroupMemberRepository.java | 2 +- .../GroupMemberRepositoryCustom.java | 7 ++ .../repository/GroupMemberRepositoryImpl.java | 32 +++++++ .../repository/GroupMemberRepositoryTest.java | 92 +++++++++++++++++++ 4 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/member/repository/GroupMemberRepositoryCustom.java create mode 100644 heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/member/repository/GroupMemberRepositoryImpl.java create mode 100644 heachi-domain-mysql/src/test/java/com/heachi/mysql/define/group/member/repository/GroupMemberRepositoryTest.java diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/member/repository/GroupMemberRepository.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/member/repository/GroupMemberRepository.java index fda521af..dfabfbb8 100644 --- a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/member/repository/GroupMemberRepository.java +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/member/repository/GroupMemberRepository.java @@ -3,5 +3,5 @@ import com.heachi.mysql.define.group.member.GroupMember; import org.springframework.data.jpa.repository.JpaRepository; -public interface GroupMemberRepository extends JpaRepository { +public interface GroupMemberRepository extends JpaRepository, GroupMemberRepositoryCustom { } diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/member/repository/GroupMemberRepositoryCustom.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/member/repository/GroupMemberRepositoryCustom.java new file mode 100644 index 00000000..bd681da6 --- /dev/null +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/member/repository/GroupMemberRepositoryCustom.java @@ -0,0 +1,7 @@ +package com.heachi.mysql.define.group.member.repository; + +public interface GroupMemberRepositoryCustom { + + // Email과 GroupId를 통해 사용자가 해당 그룹의 구성원인지 확인하는 쿼리 + public boolean existsGroupMemberByUserEmailAndGroupInfoId(String email, Long groupId); +} diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/member/repository/GroupMemberRepositoryImpl.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/member/repository/GroupMemberRepositoryImpl.java new file mode 100644 index 00000000..a4f2d90a --- /dev/null +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/member/repository/GroupMemberRepositoryImpl.java @@ -0,0 +1,32 @@ +package com.heachi.mysql.define.group.member.repository; + +import com.heachi.mysql.define.group.member.constant.GroupMemberStatus; +import com.querydsl.jpa.JPAExpressions; +import com.querydsl.jpa.impl.JPAQueryFactory; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import static com.heachi.mysql.define.group.member.QGroupMember.groupMember; +import static com.heachi.mysql.define.user.QUser.user; + +@Component +@RequiredArgsConstructor +public class GroupMemberRepositoryImpl implements GroupMemberRepositoryCustom { + + private final JPAQueryFactory queryFactory; + + @Override + public boolean existsGroupMemberByUserEmailAndGroupInfoId(String email, Long groupId) { + + return queryFactory.from(groupMember) + .where(groupMember.groupInfo.id.eq(groupId) + .and(groupMember.user.id.eq( + // Sub Query + JPAExpressions + .select(user.id) + .from(user) + .where(user.email.eq(email)))) + .and(groupMember.status.eq(GroupMemberStatus.ACCEPT))) + .fetchFirst() != null; + } +} diff --git a/heachi-domain-mysql/src/test/java/com/heachi/mysql/define/group/member/repository/GroupMemberRepositoryTest.java b/heachi-domain-mysql/src/test/java/com/heachi/mysql/define/group/member/repository/GroupMemberRepositoryTest.java new file mode 100644 index 00000000..39dddecd --- /dev/null +++ b/heachi-domain-mysql/src/test/java/com/heachi/mysql/define/group/member/repository/GroupMemberRepositoryTest.java @@ -0,0 +1,92 @@ +package com.heachi.mysql.define.group.member.repository; + +import com.heachi.mysql.TestConfig; +import com.heachi.mysql.define.group.info.GroupInfo; +import com.heachi.mysql.define.group.info.repository.GroupInfoRepository; +import com.heachi.mysql.define.group.member.GroupMember; +import com.heachi.mysql.define.group.member.constant.GroupMemberRole; +import com.heachi.mysql.define.group.member.constant.GroupMemberStatus; +import com.heachi.mysql.define.user.User; +import com.heachi.mysql.define.user.constant.UserPlatformType; +import com.heachi.mysql.define.user.constant.UserRole; +import com.heachi.mysql.define.user.repository.UserRepository; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.AfterEach; +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 static org.assertj.core.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest +class GroupMemberRepositoryTest extends TestConfig { + + @Autowired + private GroupMemberRepository groupMemberRepository; + + @Autowired + private UserRepository userRepository; + + @Autowired + private GroupInfoRepository groupInfoRepository; + + @AfterEach + void tearDown() { + groupMemberRepository.deleteAllInBatch(); + groupInfoRepository.deleteAllInBatch(); + userRepository.deleteAllInBatch(); + } + + @Test + @DisplayName("email과 groupId를 통해 사용자의 그룹멤버 여부를 판단할 수 있다.") + void existsGroupMemberByUserEmailAndGroupInfoId() { + // given + User user = userRepository.save(generateUser()); + GroupInfo groupInfo = groupInfoRepository.save(generateGroupInfo(user)); + GroupMember groupMember = groupMemberRepository.save(generateGroupMember(user, groupInfo)); + + // when + boolean result = groupMemberRepository.existsGroupMemberByUserEmailAndGroupInfoId(user.getEmail(), groupInfo.getId()); + + // then + assertThat(result).isTrue(); + } + + public static User generateUser() { + + return User.builder() + .platformId("123456") + .platformType(UserPlatformType.KAKAO) + .role(UserRole.USER) + .name("kms") + .email("kms@kakao.com") + .phoneNumber("010-0000-0000") + .profileImageUrl("https://google.com") + .pushAlarmYn(true) + .build(); + } + + public static GroupInfo generateGroupInfo(User user) { + + return GroupInfo.builder() + .user(user) + .bgColor("bbbbbb") + .colorCode("111111") + .gradient("csscssscss") + .name("group") + .info("hello world!") + .build(); + } + + public static GroupMember generateGroupMember(User user, GroupInfo groupInfo) { + + return GroupMember.builder() + .groupInfo(groupInfo) + .user(user) + .role(GroupMemberRole.GROUP_MEMBER) + .status(GroupMemberStatus.ACCEPT) + .build(); + } +} \ No newline at end of file From febb83a041b77fa1853195dbbf1befcd5f99534d Mon Sep 17 00:00:00 2001 From: ghdcksgml1 Date: Mon, 16 Oct 2023 13:59:44 +0900 Subject: [PATCH 11/21] =?UTF-8?q?feat(#70):=20=EC=9C=A0=EC=A0=80=20?= =?UTF-8?q?=EC=9D=B8=EC=A6=9D=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/service/auth/AuthExternalService.java | 54 +++++++++++++++++++ .../common/exception/ExceptionMessage.java | 3 ++ .../group/member/GroupMemberException.java | 10 ++++ 3 files changed, 67 insertions(+) create mode 100644 heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/auth/AuthExternalService.java create mode 100644 heachi-support/common/src/main/java/com/heachi/admin/common/exception/group/member/GroupMemberException.java diff --git a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/auth/AuthExternalService.java b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/auth/AuthExternalService.java new file mode 100644 index 00000000..cdf485bc --- /dev/null +++ b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/auth/AuthExternalService.java @@ -0,0 +1,54 @@ +package com.heachi.housework.api.service.auth; + +import com.heachi.admin.common.exception.ExceptionMessage; +import com.heachi.admin.common.exception.auth.AuthException; +import com.heachi.admin.common.exception.group.member.GroupMemberException; +import com.heachi.admin.common.response.JsonResult; +import com.heachi.external.clients.auth.AuthClients; +import com.heachi.external.clients.auth.response.UserInfoResponse; +import com.heachi.mysql.define.group.member.repository.GroupMemberRepository; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +@RequiredArgsConstructor +public class AuthExternalService { + + private final AuthClients authClients; + private final GroupMemberRepository groupMemberRepository; + + // Auth 서버에 인증 요청을 보낸다. + public UserInfoResponse userAuthenticate(String authorization) { + JsonResult jsonResult = authClients.getUserInfo(authorization).block(); // Mono 객체이므로 Block + + if (jsonResult.getResCode() != 200) { + log.warn(">>>> 유저 인증에 실패했습니다."); + + throw new AuthException(ExceptionMessage.AUTH_SERVER_NOT_RESPOND); + } + + return jsonResult.getResObj(); + } + + // Auth 서버에 인증 요청을 보낸 후 가져온 정보로 해당 그룹원인지 판별한다. + public UserInfoResponse userAuthenticateAndGroupMatch(String authorization, Long groupId) { + JsonResult jsonResult = authClients.getUserInfo(authorization).block(); // Mono 객체이므로 Block + + if (jsonResult.getResCode() != 200) { + log.warn(">>>> 유저 인증에 실패했습니다."); + + throw new AuthException(ExceptionMessage.AUTH_SERVER_NOT_RESPOND); + } + + if (!groupMemberRepository.existsGroupMemberByUserEmailAndGroupInfoId( + jsonResult.getResObj().getEmail(), groupId)) { + log.warn(">>>> 해당 유저[{}]는 해당 그룹[{}]의 소속이 아닙니다.", jsonResult.getResObj().getEmail(), groupId); + + throw new GroupMemberException(ExceptionMessage.GROUP_MEMBER_NOT_FOUND); + } + + return jsonResult.getResObj(); + } +} diff --git a/heachi-support/common/src/main/java/com/heachi/admin/common/exception/ExceptionMessage.java b/heachi-support/common/src/main/java/com/heachi/admin/common/exception/ExceptionMessage.java index 0457e074..2267f9f4 100644 --- a/heachi-support/common/src/main/java/com/heachi/admin/common/exception/ExceptionMessage.java +++ b/heachi-support/common/src/main/java/com/heachi/admin/common/exception/ExceptionMessage.java @@ -37,6 +37,9 @@ public enum ExceptionMessage { AUTH_NOT_FOUND("계정 정보를 찾을 수 없습니다."), AUTH_DELETE_FAIL("계정 삭제에 실패했습니다."), + // GroupMemberException + GROUP_MEMBER_NOT_FOUND("그룹 멤버를 찾지 못했습니다."), + // NotifyException NOTIFY_NOT_FOUND("해당 아이디의 알림을 찾을 수 없습니다."), NOTIFY_DUPLICATE_ID("SendUser와 ReceiveUser가 같습니다."), diff --git a/heachi-support/common/src/main/java/com/heachi/admin/common/exception/group/member/GroupMemberException.java b/heachi-support/common/src/main/java/com/heachi/admin/common/exception/group/member/GroupMemberException.java new file mode 100644 index 00000000..450c9006 --- /dev/null +++ b/heachi-support/common/src/main/java/com/heachi/admin/common/exception/group/member/GroupMemberException.java @@ -0,0 +1,10 @@ +package com.heachi.admin.common.exception.group.member; + +import com.heachi.admin.common.exception.ExceptionMessage; +import com.heachi.admin.common.exception.HeachiException; + +public class GroupMemberException extends HeachiException { + public GroupMemberException(ExceptionMessage message) { + super(message.getText()); + } +} From fe54bd103d2dab36df5b8afa67281ac2abce9539 Mon Sep 17 00:00:00 2001 From: ghdcksgml1 Date: Mon, 16 Oct 2023 15:18:21 +0900 Subject: [PATCH 12/21] =?UTF-8?q?refactor(#70):=20Date=20=ED=83=80?= =?UTF-8?q?=EC=9E=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mysql/define/housework/info/HouseworkInfo.java | 13 +++++++------ .../mysql/define/housework/todo/HouseworkTodo.java | 6 +++--- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/HouseworkInfo.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/HouseworkInfo.java index fb6bf104..09163c8b 100644 --- a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/HouseworkInfo.java +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/HouseworkInfo.java @@ -3,7 +3,6 @@ import com.heachi.mysql.define.BaseEntity; import com.heachi.mysql.define.housework.category.HouseworkCategory; import com.heachi.mysql.define.housework.info.constant.HouseworkPeriodType; -import com.heachi.mysql.define.housework.todo.constant.HouseworkTodoStatus; import com.heachi.mysql.define.housework.member.HouseworkMember; import jakarta.persistence.*; import lombok.AccessLevel; @@ -11,8 +10,9 @@ import lombok.Getter; import lombok.NoArgsConstructor; +import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.ArrayList; -import java.util.Date; import java.util.List; @Getter @@ -44,7 +44,7 @@ public class HouseworkInfo extends BaseEntity { @Temporal(TemporalType.DATE) @Column(name = "DAY_DATE") - private Date dayDate; // 단건: 날짜 정보 + private LocalDate dayDate; // 단건: 날짜 정보 @Column(name = "WEEK_DATE") private String weekDate; // 매주: 요일 정보 (일~토: 0~6) @@ -52,12 +52,13 @@ public class HouseworkInfo extends BaseEntity { @Column(name = "MONTH_DATE") private String monthDate; // 매달: 일 정보 (1,23,25) - @Temporal(TemporalType.TIME) @Column(name = "END_TIME") - private Date endTime; // 집안일 마감 시간 (시간정보만) + private LocalDateTime endTime; // 집안일 마감 시간 (시간정보만) @Builder - private HouseworkInfo(List houseworkMembers, HouseworkCategory houseworkCategory, String title, String detail, HouseworkPeriodType type, Date dayDate, String weekDate, String monthDate, Date endTime) { + private HouseworkInfo(List houseworkMembers, HouseworkCategory houseworkCategory, String title, + String detail, HouseworkPeriodType type, LocalDate dayDate, String weekDate, String monthDate, + LocalDateTime endTime) { this.houseworkMembers = houseworkMembers; this.houseworkCategory = houseworkCategory; this.title = title; diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/todo/HouseworkTodo.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/todo/HouseworkTodo.java index ba382af0..32990d6c 100644 --- a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/todo/HouseworkTodo.java +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/todo/HouseworkTodo.java @@ -12,8 +12,8 @@ import org.hibernate.annotations.ColumnDefault; import org.hibernate.annotations.DynamicInsert; +import java.time.LocalDate; import java.time.LocalDateTime; -import java.util.Date; @Getter @DynamicInsert @@ -57,7 +57,7 @@ public class HouseworkTodo extends BaseEntity { @Temporal(TemporalType.DATE) @Column(name = "DATE", nullable = false) - private Date date; // 집안일 지정 날짜 + private LocalDate date; // 집안일 지정 날짜 @Column(name = "VERIFICATION_PHOTO_URL") private String verificationPhotoURL; // 다른 사용자가 확인할 수 있는 인증 사진 URL @@ -70,7 +70,7 @@ public class HouseworkTodo extends BaseEntity { @Builder private HouseworkTodo(HouseworkInfo houseworkInfo, GroupInfo groupInfo, String houseworkMember, String category, - String title, String detail, Integer idx, HouseworkTodoStatus status, Date date, + String title, String detail, Integer idx, HouseworkTodoStatus status, LocalDate date, String verificationPhotoURL, String verifierId, LocalDateTime verificationTime) { this.houseworkInfo = houseworkInfo; this.groupInfo = groupInfo; From 73fd3fe1f3b24ce954baf8e704f47e6e0b6d25ae Mon Sep 17 00:00:00 2001 From: ghdcksgml1 Date: Mon, 16 Oct 2023 15:46:27 +0900 Subject: [PATCH 13/21] =?UTF-8?q?refactor(#70):=20Date=20=ED=83=80?= =?UTF-8?q?=EC=9E=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../define/housework/info/HouseworkInfo.java | 6 ++--- .../define/housework/todo/HouseworkTodo.java | 22 +++++++++++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/HouseworkInfo.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/HouseworkInfo.java index 09163c8b..f3df067a 100644 --- a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/HouseworkInfo.java +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/HouseworkInfo.java @@ -11,7 +11,7 @@ import lombok.NoArgsConstructor; import java.time.LocalDate; -import java.time.LocalDateTime; +import java.time.LocalTime; import java.util.ArrayList; import java.util.List; @@ -53,12 +53,12 @@ public class HouseworkInfo extends BaseEntity { private String monthDate; // 매달: 일 정보 (1,23,25) @Column(name = "END_TIME") - private LocalDateTime endTime; // 집안일 마감 시간 (시간정보만) + private LocalTime endTime; // 집안일 마감 시간 (시간정보만) @Builder private HouseworkInfo(List houseworkMembers, HouseworkCategory houseworkCategory, String title, String detail, HouseworkPeriodType type, LocalDate dayDate, String weekDate, String monthDate, - LocalDateTime endTime) { + LocalTime endTime) { this.houseworkMembers = houseworkMembers; this.houseworkCategory = houseworkCategory; this.title = title; diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/todo/HouseworkTodo.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/todo/HouseworkTodo.java index 32990d6c..cb27a5b0 100644 --- a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/todo/HouseworkTodo.java +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/todo/HouseworkTodo.java @@ -3,6 +3,7 @@ import com.heachi.mysql.define.BaseEntity; import com.heachi.mysql.define.group.info.GroupInfo; import com.heachi.mysql.define.housework.info.HouseworkInfo; +import com.heachi.mysql.define.housework.info.constant.HouseworkPeriodType; import com.heachi.mysql.define.housework.todo.constant.HouseworkTodoStatus; import jakarta.persistence.*; import lombok.AccessLevel; @@ -14,6 +15,8 @@ import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.LocalTime; +import java.util.stream.Collectors; @Getter @DynamicInsert @@ -59,6 +62,9 @@ public class HouseworkTodo extends BaseEntity { @Column(name = "DATE", nullable = false) private LocalDate date; // 집안일 지정 날짜 + @Column(name = "END_TIME") + private LocalTime endTime; // 집안일 마감 시간 (시간정보만) + @Column(name = "VERIFICATION_PHOTO_URL") private String verificationPhotoURL; // 다른 사용자가 확인할 수 있는 인증 사진 URL @@ -85,4 +91,20 @@ private HouseworkTodo(HouseworkInfo houseworkInfo, GroupInfo groupInfo, String h this.verifierId = verifierId; this.verificationTime = verificationTime; } + + public static HouseworkTodo makeTodoReferInfo(HouseworkInfo houseworkInfo, GroupInfo groupInfo, LocalDate date) { + + return HouseworkTodo.builder() + .houseworkInfo(houseworkInfo.getType() == HouseworkPeriodType.HOUSEWORK_PERIOD_DAY ? null : houseworkInfo) + .groupInfo(groupInfo) + .houseworkMember(houseworkInfo.getHouseworkMembers().stream() + .map(hm -> hm.getId().toString()) + .collect(Collectors.joining(","))) + .category(houseworkInfo.getHouseworkCategory().getName()) + .title(houseworkInfo.getTitle()) + .detail(houseworkInfo.getDetail()) + .status(HouseworkTodoStatus.HOUSEWORK_TODO_INCOMPLETE) + .date(date) + .build(); + } } From 7f791cf23781b178eb3ddbe3f4097dbcbcba081e Mon Sep 17 00:00:00 2001 From: ghdcksgml1 Date: Tue, 17 Oct 2023 11:54:00 +0900 Subject: [PATCH 14/21] =?UTF-8?q?test(#70):=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=EC=84=B8=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/heachi/housework/TestConfig.java | 100 ++++++++++++++++++ heachi-domain-mysql/build.gradle | 2 +- .../java/com/heachi/mysql/TestConfig.java | 90 ++++++++++++++++ 3 files changed, 191 insertions(+), 1 deletion(-) create mode 100644 heachi-core/housework-api/src/test/java/com/heachi/housework/TestConfig.java diff --git a/heachi-core/housework-api/src/test/java/com/heachi/housework/TestConfig.java b/heachi-core/housework-api/src/test/java/com/heachi/housework/TestConfig.java new file mode 100644 index 00000000..c0d84994 --- /dev/null +++ b/heachi-core/housework-api/src/test/java/com/heachi/housework/TestConfig.java @@ -0,0 +1,100 @@ +package com.heachi.housework; + +import com.heachi.mysql.define.group.info.GroupInfo; +import com.heachi.mysql.define.group.info.repository.GroupInfoRepository; +import com.heachi.mysql.define.group.member.GroupMember; +import com.heachi.mysql.define.group.member.constant.GroupMemberRole; +import com.heachi.mysql.define.group.member.constant.GroupMemberStatus; +import com.heachi.mysql.define.group.member.repository.GroupMemberRepository; +import com.heachi.mysql.define.housework.category.HouseworkCategory; +import com.heachi.mysql.define.housework.category.repository.HouseworkCategoryRepository; +import com.heachi.mysql.define.housework.info.HouseworkInfo; +import com.heachi.mysql.define.housework.info.constant.HouseworkPeriodType; +import com.heachi.mysql.define.housework.info.repository.HouseworkInfoRepository; +import com.heachi.mysql.define.housework.member.HouseworkMember; +import com.heachi.mysql.define.housework.member.repository.HouseworkMemberRepository; +import com.heachi.mysql.define.housework.todo.HouseworkTodo; +import com.heachi.mysql.define.housework.todo.repository.HouseworkTodoRepository; +import com.heachi.mysql.define.user.User; +import com.heachi.mysql.define.user.constant.UserPlatformType; +import com.heachi.mysql.define.user.constant.UserRole; +import com.heachi.mysql.define.user.repository.UserRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.TestConstructor; + +import java.time.LocalDate; +import java.time.LocalTime; + +@ActiveProfiles("test") +@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) +public class TestConfig { + + public static User generateUser() { + + return User.builder() + .platformId("123456") + .platformType(UserPlatformType.KAKAO) + .role(UserRole.USER) + .name("kms") + .email("kms@kakao.com") + .phoneNumber("010-0000-0000") + .profileImageUrl("https://google.com") + .pushAlarmYn(true) + .build(); + } + + public static GroupInfo generateGroupInfo(User user) { + + return GroupInfo.builder() + .user(user) + .bgColor("bbbbbb") + .colorCode("111111") + .gradient("csscssscss") + .name("group") + .info("hello world!") + .build(); + } + + public static GroupMember generateGroupMember(User user, GroupInfo groupInfo) { + + return GroupMember.builder() + .groupInfo(groupInfo) + .user(user) + .role(GroupMemberRole.GROUP_MEMBER) + .status(GroupMemberStatus.ACCEPT) + .build(); + } + + public static HouseworkCategory generateHouseworkCategory() { + + return HouseworkCategory.builder() + .name("집안일") + .build(); + } + + public static HouseworkInfo generateHouseworkInfo(GroupInfo groupInfo, HouseworkCategory category) { + + return HouseworkInfo.builder() + .houseworkCategory(category) + .groupInfo(groupInfo) + .title("빨래") + .detail("빨래 돌리기") + .type(HouseworkPeriodType.HOUSEWORK_PERIOD_EVERYDAY) + .endTime(LocalTime.of(18,0)) + .build(); + } + + public static HouseworkMember generateHouseworkMember(GroupMember groupMember, HouseworkInfo houseworkInfo) { + + return HouseworkMember.builder() + .houseworkInfo(houseworkInfo) + .groupMember(groupMember) + .build(); + } + + public static HouseworkTodo generateHouseworkTodo(HouseworkInfo houseworkInfo, GroupInfo groupInfo, LocalDate date) { + + return HouseworkTodo.makeTodoReferInfo(houseworkInfo, groupInfo, date); + } +} diff --git a/heachi-domain-mysql/build.gradle b/heachi-domain-mysql/build.gradle index bca17882..79a3c2dd 100644 --- a/heachi-domain-mysql/build.gradle +++ b/heachi-domain-mysql/build.gradle @@ -10,7 +10,7 @@ jar.enabled = true dependencies { implementation"org.springframework.boot:spring-boot-starter-web" - implementation 'org.springframework.boot:spring-boot-starter-security' + api 'org.springframework.boot:spring-boot-starter-security' api "org.springframework.boot:spring-boot-starter-data-jpa" runtimeOnly 'com.h2database:h2' diff --git a/heachi-domain-mysql/src/test/java/com/heachi/mysql/TestConfig.java b/heachi-domain-mysql/src/test/java/com/heachi/mysql/TestConfig.java index 4870cd3d..92d787b9 100644 --- a/heachi-domain-mysql/src/test/java/com/heachi/mysql/TestConfig.java +++ b/heachi-domain-mysql/src/test/java/com/heachi/mysql/TestConfig.java @@ -1,9 +1,99 @@ package com.heachi.mysql; +import com.heachi.mysql.define.group.info.GroupInfo; +import com.heachi.mysql.define.group.info.repository.GroupInfoRepository; +import com.heachi.mysql.define.group.member.GroupMember; +import com.heachi.mysql.define.group.member.constant.GroupMemberRole; +import com.heachi.mysql.define.group.member.constant.GroupMemberStatus; +import com.heachi.mysql.define.group.member.repository.GroupMemberRepository; +import com.heachi.mysql.define.housework.category.HouseworkCategory; +import com.heachi.mysql.define.housework.category.repository.HouseworkCategoryRepository; +import com.heachi.mysql.define.housework.info.HouseworkInfo; +import com.heachi.mysql.define.housework.info.constant.HouseworkPeriodType; +import com.heachi.mysql.define.housework.info.repository.HouseworkInfoRepository; +import com.heachi.mysql.define.housework.member.HouseworkMember; +import com.heachi.mysql.define.housework.member.repository.HouseworkMemberRepository; +import com.heachi.mysql.define.housework.todo.HouseworkTodo; +import com.heachi.mysql.define.housework.todo.repository.HouseworkTodoRepository; +import com.heachi.mysql.define.user.User; +import com.heachi.mysql.define.user.constant.UserPlatformType; +import com.heachi.mysql.define.user.constant.UserRole; +import com.heachi.mysql.define.user.repository.UserRepository; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.TestConstructor; +import java.time.LocalDate; +import java.time.LocalTime; + @ActiveProfiles("test") @TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) public class TestConfig { + + public static User generateUser() { + + return User.builder() + .platformId("123456") + .platformType(UserPlatformType.KAKAO) + .role(UserRole.USER) + .name("kms") + .email("kms@kakao.com") + .phoneNumber("010-0000-0000") + .profileImageUrl("https://google.com") + .pushAlarmYn(true) + .build(); + } + + public static GroupInfo generateGroupInfo(User user) { + + return GroupInfo.builder() + .user(user) + .bgColor("bbbbbb") + .colorCode("111111") + .gradient("csscssscss") + .name("group") + .info("hello world!") + .build(); + } + + public static GroupMember generateGroupMember(User user, GroupInfo groupInfo) { + + return GroupMember.builder() + .groupInfo(groupInfo) + .user(user) + .role(GroupMemberRole.GROUP_MEMBER) + .status(GroupMemberStatus.ACCEPT) + .build(); + } + + public static HouseworkCategory generateHouseworkCategory() { + + return HouseworkCategory.builder() + .name("집안일") + .build(); + } + + public static HouseworkInfo generateHouseworkInfo(HouseworkCategory category) { + + return HouseworkInfo.builder() + .houseworkCategory(category) + .title("빨래") + .detail("빨래 돌리기") + .type(HouseworkPeriodType.HOUSEWORK_PERIOD_EVERYDAY) + .endTime(LocalTime.of(18,0)) + .build(); + } + + public static HouseworkMember generateHouseworkMember(GroupMember groupMember, HouseworkInfo houseworkInfo) { + + return HouseworkMember.builder() + .houseworkInfo(houseworkInfo) + .groupMember(groupMember) + .build(); + } + + public static HouseworkTodo generateHouseworkTodo(HouseworkInfo houseworkInfo, GroupInfo groupInfo, LocalDate date) { + + return HouseworkTodo.makeTodoReferInfo(houseworkInfo, groupInfo, date); + } } From 5ab67454d46984ac031b458299b21f2cb45f29d8 Mon Sep 17 00:00:00 2001 From: ghdcksgml1 Date: Tue, 17 Oct 2023 11:55:22 +0900 Subject: [PATCH 15/21] =?UTF-8?q?feat(#70):=20Todo=20=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../housework/todo/TodoController.java | 33 +++++++++ .../service/housework/todo/TodoService.java | 67 +++++++++++++++++ .../todo/request/TodoSelectRequest.java | 19 +++++ .../housework/todo/response/TodoResponse.java | 74 +++++++++++++++++++ .../housework/todo/response/TodoUser.java | 31 ++++++++ .../GroupMemberRepositoryCustom.java | 7 ++ .../repository/GroupMemberRepositoryImpl.java | 13 ++++ .../define/housework/info/HouseworkInfo.java | 15 ++-- .../repository/HouseworkInfoRepository.java | 2 +- .../HouseworkInfoRepositoryCustom.java | 16 ++++ .../HouseworkInfoRepositoryImpl.java | 45 +++++++++++ .../repository/HouseworkTodoRepository.java | 10 +++ 12 files changed, 326 insertions(+), 6 deletions(-) create mode 100644 heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/housework/todo/TodoController.java create mode 100644 heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/todo/TodoService.java create mode 100644 heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/todo/request/TodoSelectRequest.java create mode 100644 heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/todo/response/TodoResponse.java create mode 100644 heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/todo/response/TodoUser.java create mode 100644 heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/repository/HouseworkInfoRepositoryCustom.java create mode 100644 heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/repository/HouseworkInfoRepositoryImpl.java diff --git a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/housework/todo/TodoController.java b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/housework/todo/TodoController.java new file mode 100644 index 00000000..09b7250a --- /dev/null +++ b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/housework/todo/TodoController.java @@ -0,0 +1,33 @@ +package com.heachi.housework.api.controller.housework.todo; + +import com.heachi.admin.common.response.JsonResult; +import com.heachi.external.clients.auth.response.UserInfoResponse; +import com.heachi.housework.api.service.auth.AuthExternalService; +import com.heachi.housework.api.service.housework.todo.TodoService; +import com.heachi.housework.api.service.housework.todo.request.TodoSelectRequest; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import java.time.LocalDate; + +@Slf4j +@RestController +@RequiredArgsConstructor +@RequestMapping("/housework/todo") +public class TodoController { + + private final AuthExternalService authExternalService; + private final TodoService todoService; + + // Todo List 가져오기 + @GetMapping("/{groupId}") + public JsonResult selectTodo(@RequestHeader(name = "Authorization") String authorization, + @PathVariable(name = "groupId") Long groupId, + @RequestParam(value = "date") LocalDate date) { + UserInfoResponse userInfo = authExternalService.userAuthenticateAndGroupMatch(authorization, groupId); + + return JsonResult.successOf(todoService.selectTodo( + TodoSelectRequest.builder().groupId(groupId).date(date).build())); + } +} diff --git a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/todo/TodoService.java b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/todo/TodoService.java new file mode 100644 index 00000000..97894c98 --- /dev/null +++ b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/todo/TodoService.java @@ -0,0 +1,67 @@ +package com.heachi.housework.api.service.housework.todo; + +import com.heachi.admin.common.utils.DayOfWeekUtils; +import com.heachi.housework.api.service.housework.todo.request.TodoSelectRequest; +import com.heachi.housework.api.service.housework.todo.response.TodoResponse; +import com.heachi.mysql.define.group.member.repository.GroupMemberRepository; +import com.heachi.mysql.define.housework.info.HouseworkInfo; +import com.heachi.mysql.define.housework.info.repository.HouseworkInfoRepository; +import com.heachi.mysql.define.housework.todo.HouseworkTodo; +import com.heachi.mysql.define.housework.todo.repository.HouseworkTodoRepository; +import com.heachi.mysql.define.user.User; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDate; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class TodoService { + + private final GroupMemberRepository groupMemberRepository; + private final HouseworkTodoRepository houseworkTodoRepository; + private final HouseworkInfoRepository houseworkInfoRepository; + + // GroupInfoId와 Date를 통해 Todo List 가져오기 + public List selectTodo(TodoSelectRequest request) { + Long groupId = request.getGroupId(); + LocalDate date = request.getDate(); + + // Map + Map todoMap = houseworkTodoRepository.findByGroupInfoAndDate(groupId, date).stream() + .collect(Collectors.toMap(todo -> todo.getHouseworkInfo().getId(), todo -> todo)); + + // 그룹의 HouseworkInfo 조회 후 필터링해서 추가해야하는 TodoList를 만든다. + List insertTodoList = houseworkInfoRepository.findHouseworkInfoByGroupInfoId(groupId).stream() + .filter(info -> !todoMap.containsKey(info.getId())) // HouseworkTodo에 이미 있는 INFO는 제외 + .filter(info -> // PERIOD에 맞는 INFO 선별 + switch (info.getType()) { + case HOUSEWORK_PERIOD_EVERYDAY -> true; + case HOUSEWORK_PERIOD_WEEK -> DayOfWeekUtils.equals(info.getWeekDate(), date); + case HOUSEWORK_PERIOD_MONTH -> Arrays.asList(info.getMonthDate().split(",")).stream() + .filter(d -> Integer.parseInt(d) == date.getDayOfMonth()) + .findFirst().isPresent(); + default -> false; + }) + .map(info -> HouseworkTodo.makeTodoReferInfo(info, info.getGroupInfo(), date)) + .collect(Collectors.toList()); + + houseworkTodoRepository.saveAll(insertTodoList); // Todo 저장 + + // Map + Map userMap = groupMemberRepository.findGroupMemberByGroupId(groupId).stream() + .collect(Collectors.toMap(gm -> gm.getId(), gm -> gm.getUser())); + + return houseworkTodoRepository.findByGroupInfoAndDate(groupId, date).stream() // 최신 Todo 불러와 리턴 + .map(todo -> TodoResponse.of(todo, userMap)) + .collect(Collectors.toList()); + } +} diff --git a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/todo/request/TodoSelectRequest.java b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/todo/request/TodoSelectRequest.java new file mode 100644 index 00000000..b7a15a83 --- /dev/null +++ b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/todo/request/TodoSelectRequest.java @@ -0,0 +1,19 @@ +package com.heachi.housework.api.service.housework.todo.request; + +import lombok.Builder; +import lombok.Getter; + +import java.time.LocalDate; + +@Getter +public class TodoSelectRequest { + + Long groupId; + LocalDate date; + + @Builder + private TodoSelectRequest(Long groupId, LocalDate date) { + this.groupId = groupId; + this.date = date; + } +} diff --git a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/todo/response/TodoResponse.java b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/todo/response/TodoResponse.java new file mode 100644 index 00000000..e618d0d1 --- /dev/null +++ b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/todo/response/TodoResponse.java @@ -0,0 +1,74 @@ +package com.heachi.housework.api.service.housework.todo.response; + +import com.heachi.mysql.define.housework.todo.HouseworkTodo; +import com.heachi.mysql.define.housework.todo.constant.HouseworkTodoStatus; +import com.heachi.mysql.define.user.User; +import lombok.Builder; +import lombok.Getter; +import lombok.ToString; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Getter +@ToString +public class TodoResponse { + + private Long id; + private List houseworkMembers; + private String category; + private String title; + private String detail; + private Integer idx; + private HouseworkTodoStatus status; + private LocalDate date; + private LocalTime endTime; + private String verificationPhotoURL; + private String verifierId; + private LocalDateTime verificationTime; + + @Builder + private TodoResponse(Long id, List houseworkMembers, String category, String title, String detail, + Integer idx, HouseworkTodoStatus status, LocalDate date, LocalTime endTime, + String verificationPhotoURL, String verifierId, LocalDateTime verificationTime) { + this.id = id; + this.houseworkMembers = houseworkMembers; + this.category = category; + this.title = title; + this.detail = detail; + this.idx = idx; + this.status = status; + this.date = date; + this.endTime = endTime; + this.verificationPhotoURL = verificationPhotoURL; + this.verifierId = verifierId; + this.verificationTime = verificationTime; + } + + public static TodoResponse of(HouseworkTodo todo, Map userMap) { + + return TodoResponse.builder() + .id(todo.getId()) + .houseworkMembers(todo.getHouseworkMember() != "" ? Arrays.asList(todo.getHouseworkMember().split(",")).stream() + .map(Long::parseLong) + .map(i -> TodoUser.of(userMap.get(i))) + .collect(Collectors.toList()) : null) + .category(todo.getCategory()) + .title(todo.getTitle()) + .detail(todo.getDetail()) + .idx(todo.getIdx()) + .status(todo.getStatus()) + .date(todo.getDate()) + .endTime(todo.getEndTime()) + .verificationPhotoURL(todo.getVerificationPhotoURL()) + .verifierId(todo.getVerifierId()) + .verificationTime(todo.getVerificationTime()) + .build(); + } +} diff --git a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/todo/response/TodoUser.java b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/todo/response/TodoUser.java new file mode 100644 index 00000000..399b8121 --- /dev/null +++ b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/todo/response/TodoUser.java @@ -0,0 +1,31 @@ +package com.heachi.housework.api.service.housework.todo.response; + +import com.heachi.mysql.define.user.User; +import lombok.Builder; +import lombok.Getter; +import lombok.ToString; + +@Getter +@ToString +public class TodoUser { + + private String name; + private String email; + private String profileImageUrl; + + @Builder + private TodoUser(String name, String email, String profileImageUrl) { + this.name = name; + this.email = email; + this.profileImageUrl = profileImageUrl; + } + + public static TodoUser of(User user) { + + return TodoUser.builder() + .name(user.getName()) + .email(user.getEmail()) + .profileImageUrl(user.getProfileImageUrl()) + .build(); + } +} diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/member/repository/GroupMemberRepositoryCustom.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/member/repository/GroupMemberRepositoryCustom.java index bd681da6..16455b40 100644 --- a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/member/repository/GroupMemberRepositoryCustom.java +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/member/repository/GroupMemberRepositoryCustom.java @@ -1,7 +1,14 @@ package com.heachi.mysql.define.group.member.repository; +import com.heachi.mysql.define.group.member.GroupMember; + +import java.util.List; + public interface GroupMemberRepositoryCustom { // Email과 GroupId를 통해 사용자가 해당 그룹의 구성원인지 확인하는 쿼리 public boolean existsGroupMemberByUserEmailAndGroupInfoId(String email, Long groupId); + + // GroupId를 통해 그룹의 구성원을 리턴해주는 쿼리 + public List findGroupMemberByGroupId(Long groupId); } diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/member/repository/GroupMemberRepositoryImpl.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/member/repository/GroupMemberRepositoryImpl.java index a4f2d90a..24539da3 100644 --- a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/member/repository/GroupMemberRepositoryImpl.java +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/group/member/repository/GroupMemberRepositoryImpl.java @@ -1,11 +1,14 @@ package com.heachi.mysql.define.group.member.repository; +import com.heachi.mysql.define.group.member.GroupMember; import com.heachi.mysql.define.group.member.constant.GroupMemberStatus; import com.querydsl.jpa.JPAExpressions; import com.querydsl.jpa.impl.JPAQueryFactory; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; +import java.util.List; + import static com.heachi.mysql.define.group.member.QGroupMember.groupMember; import static com.heachi.mysql.define.user.QUser.user; @@ -29,4 +32,14 @@ public boolean existsGroupMemberByUserEmailAndGroupInfoId(String email, Long gro .and(groupMember.status.eq(GroupMemberStatus.ACCEPT))) .fetchFirst() != null; } + + @Override + public List findGroupMemberByGroupId(Long groupId) { + + return queryFactory.selectFrom(groupMember) + .innerJoin(groupMember.user, user).fetchJoin() + .where(groupMember.groupInfo.id.eq(groupId) + .and(groupMember.status.eq(GroupMemberStatus.ACCEPT))) + .fetch(); + } } diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/HouseworkInfo.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/HouseworkInfo.java index f3df067a..0f5d4158 100644 --- a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/HouseworkInfo.java +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/HouseworkInfo.java @@ -1,6 +1,7 @@ package com.heachi.mysql.define.housework.info; import com.heachi.mysql.define.BaseEntity; +import com.heachi.mysql.define.group.info.GroupInfo; import com.heachi.mysql.define.housework.category.HouseworkCategory; import com.heachi.mysql.define.housework.info.constant.HouseworkPeriodType; import com.heachi.mysql.define.housework.member.HouseworkMember; @@ -28,6 +29,10 @@ public class HouseworkInfo extends BaseEntity { @OneToMany(mappedBy = "houseworkInfo") private List houseworkMembers = new ArrayList<>(); // 집안일 담당자 + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "GROUP_INFO_ID") + private GroupInfo groupInfo; // 어떤 그룹의 집안일 정보인지 + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "HOUSEWORK_CATEGORY_ID") private HouseworkCategory houseworkCategory; // 집안일 카테고리 @@ -47,7 +52,7 @@ public class HouseworkInfo extends BaseEntity { private LocalDate dayDate; // 단건: 날짜 정보 @Column(name = "WEEK_DATE") - private String weekDate; // 매주: 요일 정보 (일~토: 0~6) + private String weekDate; // 매주: 요일 정보 (월~일: 1~7) @Column(name = "MONTH_DATE") private String monthDate; // 매달: 일 정보 (1,23,25) @@ -56,10 +61,10 @@ public class HouseworkInfo extends BaseEntity { private LocalTime endTime; // 집안일 마감 시간 (시간정보만) @Builder - private HouseworkInfo(List houseworkMembers, HouseworkCategory houseworkCategory, String title, - String detail, HouseworkPeriodType type, LocalDate dayDate, String weekDate, String monthDate, - LocalTime endTime) { - this.houseworkMembers = houseworkMembers; + private HouseworkInfo(GroupInfo groupInfo, HouseworkCategory houseworkCategory, + String title, String detail, HouseworkPeriodType type, LocalDate dayDate, String weekDate, + String monthDate, LocalTime endTime) { + this.groupInfo = groupInfo; this.houseworkCategory = houseworkCategory; this.title = title; this.detail = detail; diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/repository/HouseworkInfoRepository.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/repository/HouseworkInfoRepository.java index cd96d063..d158c532 100644 --- a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/repository/HouseworkInfoRepository.java +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/repository/HouseworkInfoRepository.java @@ -3,5 +3,5 @@ import com.heachi.mysql.define.housework.info.HouseworkInfo; import org.springframework.data.jpa.repository.JpaRepository; -public interface HouseworkInfoRepository extends JpaRepository { +public interface HouseworkInfoRepository extends JpaRepository, HouseworkInfoRepositoryCustom { } diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/repository/HouseworkInfoRepositoryCustom.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/repository/HouseworkInfoRepositoryCustom.java new file mode 100644 index 00000000..a19ef81d --- /dev/null +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/repository/HouseworkInfoRepositoryCustom.java @@ -0,0 +1,16 @@ +package com.heachi.mysql.define.housework.info.repository; + +import com.heachi.mysql.define.housework.info.HouseworkInfo; + +import java.util.List; +import java.util.Optional; + +public interface HouseworkInfoRepositoryCustom { + + // HouseworkInfo 조회하는데 fetch Join으로 가져옴. HouseworkTodo.makeTodoReferInfo에서 사용 + public Optional findHouseworkInfoByIdJoinFetchHouseworkMembers(Long houseworkInfoId); + + // HouseworkInfo 조회하는데 GroupInfoId로 조회한다. + public List findHouseworkInfoByGroupInfoId(Long groupId); + +} diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/repository/HouseworkInfoRepositoryImpl.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/repository/HouseworkInfoRepositoryImpl.java new file mode 100644 index 00000000..1fcd26ec --- /dev/null +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/repository/HouseworkInfoRepositoryImpl.java @@ -0,0 +1,45 @@ +package com.heachi.mysql.define.housework.info.repository; + +import com.heachi.mysql.define.housework.info.HouseworkInfo; +import com.heachi.mysql.define.housework.info.QHouseworkInfo; +import com.heachi.mysql.define.housework.member.QHouseworkMember; +import com.querydsl.jpa.impl.JPAQueryFactory; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Optional; + +import static com.heachi.mysql.define.group.info.QGroupInfo.groupInfo; +import static com.heachi.mysql.define.housework.category.QHouseworkCategory.houseworkCategory; +import static com.heachi.mysql.define.housework.info.QHouseworkInfo.*; +import static com.heachi.mysql.define.housework.member.QHouseworkMember.*; + +@Component +@RequiredArgsConstructor +public class HouseworkInfoRepositoryImpl implements HouseworkInfoRepositoryCustom { + + private final JPAQueryFactory queryFactory; + + @Override + public Optional findHouseworkInfoByIdJoinFetchHouseworkMembers(Long houseworkInfoId) { + + return Optional.of(queryFactory.selectFrom(houseworkInfo) + .innerJoin(houseworkInfo.houseworkMembers, houseworkMember).fetchJoin() + .innerJoin(houseworkInfo.houseworkCategory, houseworkCategory).fetchJoin() + .where(houseworkInfo.id.eq(houseworkInfoId)) + .fetchOne()); + } + + @Override + public List findHouseworkInfoByGroupInfoId(Long groupId) { + + return queryFactory.selectFrom(houseworkInfo) + .innerJoin(houseworkInfo.houseworkMembers, houseworkMember).fetchJoin() + .innerJoin(houseworkInfo.houseworkCategory, houseworkCategory).fetchJoin() + .innerJoin(houseworkInfo.groupInfo, groupInfo).fetchJoin() + .where(houseworkInfo.groupInfo.id.eq(groupId)) + .fetch(); + } + +} diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/todo/repository/HouseworkTodoRepository.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/todo/repository/HouseworkTodoRepository.java index 3eff71ac..61dcc943 100644 --- a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/todo/repository/HouseworkTodoRepository.java +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/todo/repository/HouseworkTodoRepository.java @@ -2,6 +2,16 @@ import com.heachi.mysql.define.housework.todo.HouseworkTodo; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.time.LocalDate; +import java.util.List; public interface HouseworkTodoRepository extends JpaRepository { + + @Query("select ht from HOUSEWORK_TODO ht where ht.groupInfo.id = :groupId and ht.date = :date") + public List findByGroupInfoAndDate(@Param(value = "groupId") Long groupId, + @Param(value = "date") LocalDate date); + } From 7fb071707e6dbf9eabc1f47df1315f7ca9967cf1 Mon Sep 17 00:00:00 2001 From: ghdcksgml1 Date: Tue, 17 Oct 2023 11:55:46 +0900 Subject: [PATCH 16/21] =?UTF-8?q?test(#70):=20Todo=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BD=94=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../housework/todo/TodoServiceTest.java | 123 ++++++++++++++ .../define/housework/todo/HouseworkTodo.java | 8 +- .../repository/GroupMemberRepositoryTest.java | 36 ----- .../HouseworkTodoRepositoryTest.java | 153 ++++++++++++++++++ 4 files changed, 281 insertions(+), 39 deletions(-) create mode 100644 heachi-core/housework-api/src/test/java/com/heachi/housework/api/service/housework/todo/TodoServiceTest.java create mode 100644 heachi-domain-mysql/src/test/java/com/heachi/mysql/define/housework/todo/repository/HouseworkTodoRepositoryTest.java diff --git a/heachi-core/housework-api/src/test/java/com/heachi/housework/api/service/housework/todo/TodoServiceTest.java b/heachi-core/housework-api/src/test/java/com/heachi/housework/api/service/housework/todo/TodoServiceTest.java new file mode 100644 index 00000000..9c454521 --- /dev/null +++ b/heachi-core/housework-api/src/test/java/com/heachi/housework/api/service/housework/todo/TodoServiceTest.java @@ -0,0 +1,123 @@ +package com.heachi.housework.api.service.housework.todo; + +import com.heachi.housework.TestConfig; +import com.heachi.housework.api.service.housework.todo.request.TodoSelectRequest; +import com.heachi.housework.api.service.housework.todo.response.TodoResponse; +import com.heachi.housework.api.service.housework.todo.response.TodoUser; +import com.heachi.mysql.define.group.info.GroupInfo; +import com.heachi.mysql.define.group.info.repository.GroupInfoRepository; +import com.heachi.mysql.define.group.member.GroupMember; +import com.heachi.mysql.define.group.member.repository.GroupMemberRepository; +import com.heachi.mysql.define.housework.category.HouseworkCategory; +import com.heachi.mysql.define.housework.category.repository.HouseworkCategoryRepository; +import com.heachi.mysql.define.housework.info.HouseworkInfo; +import com.heachi.mysql.define.housework.info.repository.HouseworkInfoRepository; +import com.heachi.mysql.define.housework.member.HouseworkMember; +import com.heachi.mysql.define.housework.member.repository.HouseworkMemberRepository; +import com.heachi.mysql.define.housework.todo.constant.HouseworkTodoStatus; +import com.heachi.mysql.define.housework.todo.repository.HouseworkTodoRepository; +import com.heachi.mysql.define.user.User; +import com.heachi.mysql.define.user.repository.UserRepository; +import org.junit.jupiter.api.AfterEach; +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 java.time.LocalDate; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest +class TodoServiceTest extends TestConfig { + @Autowired private GroupMemberRepository groupMemberRepository; + @Autowired private UserRepository userRepository; + @Autowired private GroupInfoRepository groupInfoRepository; + @Autowired private HouseworkCategoryRepository houseworkCategoryRepository; + @Autowired private HouseworkInfoRepository houseworkInfoRepository; + @Autowired private HouseworkTodoRepository houseworkTodoRepository; + @Autowired private HouseworkMemberRepository houseworkMemberRepository; + + @Autowired private TodoService todoService; + + @AfterEach + void tearDown() { + houseworkTodoRepository.deleteAllInBatch(); + houseworkMemberRepository.deleteAllInBatch(); + houseworkInfoRepository.deleteAllInBatch(); + houseworkCategoryRepository.deleteAllInBatch(); + groupMemberRepository.deleteAllInBatch(); + groupInfoRepository.deleteAllInBatch(); + userRepository.deleteAllInBatch(); + } + + @Test + @DisplayName("INFO에 저장되어 있지만, 반영되지 않은 TODO는 생성된다.") + void test1() { + // given + User user = userRepository.save(generateUser()); + GroupInfo groupInfo = groupInfoRepository.save(generateGroupInfo(user)); + GroupMember groupMember = groupMemberRepository.save(generateGroupMember(user, groupInfo)); + + HouseworkCategory houseworkCategory = houseworkCategoryRepository.save(generateHouseworkCategory()); + HouseworkInfo houseworkInfo = houseworkInfoRepository.save(generateHouseworkInfo(groupInfo, houseworkCategory)); + + HouseworkMember houseworkMember = houseworkMemberRepository.save(generateHouseworkMember(groupMember, houseworkInfo)); + HouseworkInfo findHouseworkInfo = houseworkInfoRepository.findHouseworkInfoByIdJoinFetchHouseworkMembers(houseworkInfo.getId()).get(); + + // when + List todoResponses = todoService.selectTodo(TodoSelectRequest.builder().groupId(groupInfo.getId()).date(LocalDate.now()).build()); + + // then + assertAll(() -> { + TodoResponse todoResponse = todoResponses.get(0); + TodoUser todoUser = todoResponse.getHouseworkMembers().get(0); + assertThat(todoUser.getName()).isEqualTo("kms"); + assertThat(todoUser.getEmail()).isEqualTo("kms@kakao.com"); + assertThat(todoUser.getProfileImageUrl()).isEqualTo("https://google.com"); + + assertThat(todoResponse.getCategory()).isEqualTo("집안일"); + assertThat(todoResponse.getTitle()).isEqualTo("빨래"); + assertThat(todoResponse.getDetail()).isEqualTo("빨래 돌리기"); + assertThat(todoResponse.getStatus()).isEqualTo(HouseworkTodoStatus.HOUSEWORK_TODO_INCOMPLETE); + assertThat(todoResponse.getTitle()).isEqualTo("빨래"); + }); + } + + @Test + @DisplayName("INFO에 저장되어 있으면서, 반영되어 있는 TODO는 생성되지 않는다.") + void test2() { + // given + User user = userRepository.save(generateUser()); + GroupInfo groupInfo = groupInfoRepository.save(generateGroupInfo(user)); + GroupMember groupMember = groupMemberRepository.save(generateGroupMember(user, groupInfo)); + + HouseworkCategory houseworkCategory = houseworkCategoryRepository.save(generateHouseworkCategory()); + HouseworkInfo houseworkInfo = houseworkInfoRepository.save(generateHouseworkInfo(groupInfo, houseworkCategory)); + + HouseworkMember houseworkMember = houseworkMemberRepository.save(generateHouseworkMember(groupMember, houseworkInfo)); + HouseworkInfo findHouseworkInfo = houseworkInfoRepository.findHouseworkInfoByIdJoinFetchHouseworkMembers(houseworkInfo.getId()).get(); + + houseworkTodoRepository.save(generateHouseworkTodo(findHouseworkInfo, groupInfo, LocalDate.now())); + + // when + List todoResponses = todoService.selectTodo(TodoSelectRequest.builder().groupId(groupInfo.getId()).date(LocalDate.now()).build()); + + // then + assertAll(() -> { + TodoResponse todoResponse = todoResponses.get(0); + TodoUser todoUser = todoResponse.getHouseworkMembers().get(0); + assertThat(todoUser.getName()).isEqualTo("kms"); + assertThat(todoUser.getEmail()).isEqualTo("kms@kakao.com"); + assertThat(todoUser.getProfileImageUrl()).isEqualTo("https://google.com"); + + assertThat(todoResponse.getCategory()).isEqualTo("집안일"); + assertThat(todoResponse.getTitle()).isEqualTo("빨래"); + assertThat(todoResponse.getDetail()).isEqualTo("빨래 돌리기"); + assertThat(todoResponse.getStatus()).isEqualTo(HouseworkTodoStatus.HOUSEWORK_TODO_INCOMPLETE); + assertThat(todoResponse.getTitle()).isEqualTo("빨래"); + }); + } +} \ No newline at end of file diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/todo/HouseworkTodo.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/todo/HouseworkTodo.java index cb27a5b0..e7f22876 100644 --- a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/todo/HouseworkTodo.java +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/todo/HouseworkTodo.java @@ -38,7 +38,7 @@ public class HouseworkTodo extends BaseEntity { private GroupInfo groupInfo; // 그룹 정보 @Column(name = "HOUSEWORK_MEMBER", nullable = false) - private String houseworkMember; // 집안일 담당자 (,)으로 joining + private String houseworkMember; // GroupMember ID를 (,)으로 joining @Column(name = "CATEGORY", nullable = false) private String category; // 집안일 카테고리 @@ -77,7 +77,7 @@ public class HouseworkTodo extends BaseEntity { @Builder private HouseworkTodo(HouseworkInfo houseworkInfo, GroupInfo groupInfo, String houseworkMember, String category, String title, String detail, Integer idx, HouseworkTodoStatus status, LocalDate date, - String verificationPhotoURL, String verifierId, LocalDateTime verificationTime) { + LocalTime endTime, String verificationPhotoURL, String verifierId, LocalDateTime verificationTime) { this.houseworkInfo = houseworkInfo; this.groupInfo = groupInfo; this.houseworkMember = houseworkMember; @@ -87,6 +87,7 @@ private HouseworkTodo(HouseworkInfo houseworkInfo, GroupInfo groupInfo, String h this.idx = idx; this.status = status; this.date = date; + this.endTime = endTime; this.verificationPhotoURL = verificationPhotoURL; this.verifierId = verifierId; this.verificationTime = verificationTime; @@ -98,13 +99,14 @@ public static HouseworkTodo makeTodoReferInfo(HouseworkInfo houseworkInfo, Group .houseworkInfo(houseworkInfo.getType() == HouseworkPeriodType.HOUSEWORK_PERIOD_DAY ? null : houseworkInfo) .groupInfo(groupInfo) .houseworkMember(houseworkInfo.getHouseworkMembers().stream() - .map(hm -> hm.getId().toString()) + .map(hm -> hm.getGroupMember().getId().toString()) .collect(Collectors.joining(","))) .category(houseworkInfo.getHouseworkCategory().getName()) .title(houseworkInfo.getTitle()) .detail(houseworkInfo.getDetail()) .status(HouseworkTodoStatus.HOUSEWORK_TODO_INCOMPLETE) .date(date) + .endTime(houseworkInfo.getEndTime()) .build(); } } diff --git a/heachi-domain-mysql/src/test/java/com/heachi/mysql/define/group/member/repository/GroupMemberRepositoryTest.java b/heachi-domain-mysql/src/test/java/com/heachi/mysql/define/group/member/repository/GroupMemberRepositoryTest.java index 39dddecd..21ddb240 100644 --- a/heachi-domain-mysql/src/test/java/com/heachi/mysql/define/group/member/repository/GroupMemberRepositoryTest.java +++ b/heachi-domain-mysql/src/test/java/com/heachi/mysql/define/group/member/repository/GroupMemberRepositoryTest.java @@ -53,40 +53,4 @@ void existsGroupMemberByUserEmailAndGroupInfoId() { // then assertThat(result).isTrue(); } - - public static User generateUser() { - - return User.builder() - .platformId("123456") - .platformType(UserPlatformType.KAKAO) - .role(UserRole.USER) - .name("kms") - .email("kms@kakao.com") - .phoneNumber("010-0000-0000") - .profileImageUrl("https://google.com") - .pushAlarmYn(true) - .build(); - } - - public static GroupInfo generateGroupInfo(User user) { - - return GroupInfo.builder() - .user(user) - .bgColor("bbbbbb") - .colorCode("111111") - .gradient("csscssscss") - .name("group") - .info("hello world!") - .build(); - } - - public static GroupMember generateGroupMember(User user, GroupInfo groupInfo) { - - return GroupMember.builder() - .groupInfo(groupInfo) - .user(user) - .role(GroupMemberRole.GROUP_MEMBER) - .status(GroupMemberStatus.ACCEPT) - .build(); - } } \ No newline at end of file diff --git a/heachi-domain-mysql/src/test/java/com/heachi/mysql/define/housework/todo/repository/HouseworkTodoRepositoryTest.java b/heachi-domain-mysql/src/test/java/com/heachi/mysql/define/housework/todo/repository/HouseworkTodoRepositoryTest.java new file mode 100644 index 00000000..4132823f --- /dev/null +++ b/heachi-domain-mysql/src/test/java/com/heachi/mysql/define/housework/todo/repository/HouseworkTodoRepositoryTest.java @@ -0,0 +1,153 @@ +package com.heachi.mysql.define.housework.todo.repository; + +import com.heachi.mysql.TestConfig; +import com.heachi.mysql.define.group.info.GroupInfo; +import com.heachi.mysql.define.group.info.repository.GroupInfoRepository; +import com.heachi.mysql.define.group.member.GroupMember; +import com.heachi.mysql.define.group.member.constant.GroupMemberRole; +import com.heachi.mysql.define.group.member.constant.GroupMemberStatus; +import com.heachi.mysql.define.group.member.repository.GroupMemberRepository; +import com.heachi.mysql.define.housework.category.HouseworkCategory; +import com.heachi.mysql.define.housework.category.repository.HouseworkCategoryRepository; +import com.heachi.mysql.define.housework.info.HouseworkInfo; +import com.heachi.mysql.define.housework.info.constant.HouseworkPeriodType; +import com.heachi.mysql.define.housework.info.repository.HouseworkInfoRepository; +import com.heachi.mysql.define.housework.member.HouseworkMember; +import com.heachi.mysql.define.housework.member.repository.HouseworkMemberRepository; +import com.heachi.mysql.define.housework.todo.HouseworkTodo; +import com.heachi.mysql.define.user.User; +import com.heachi.mysql.define.user.constant.UserPlatformType; +import com.heachi.mysql.define.user.constant.UserRole; +import com.heachi.mysql.define.user.repository.UserRepository; +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 java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest +class HouseworkTodoRepositoryTest extends TestConfig { + + @Autowired + private GroupMemberRepository groupMemberRepository; + + @Autowired + private UserRepository userRepository; + + @Autowired + private GroupInfoRepository groupInfoRepository; + + @Autowired + private HouseworkCategoryRepository houseworkCategoryRepository; + + @Autowired + private HouseworkInfoRepository houseworkInfoRepository; + + @Autowired + private HouseworkTodoRepository houseworkTodoRepository; + + @Autowired + private HouseworkMemberRepository houseworkMemberRepository; + + @Test + @DisplayName("GroupInfoId와 Date를 이용해 값을 맵으로 조회한다.") + void findByGroupInfoAndDateReturnSetTest() { + // given + User user = userRepository.save(generateUser()); + GroupInfo groupInfo = groupInfoRepository.save(generateGroupInfo(user)); + GroupMember groupMember = groupMemberRepository.save(generateGroupMember(user, groupInfo)); + + HouseworkCategory houseworkCategory = houseworkCategoryRepository.save(generateHouseworkCategory()); + HouseworkInfo houseworkInfo = houseworkInfoRepository.save(generateHouseworkInfo(houseworkCategory)); + + HouseworkMember houseworkMember = houseworkMemberRepository.save(generateHouseworkMember(groupMember, houseworkInfo)); + HouseworkInfo findHouseworkInfo = houseworkInfoRepository.findHouseworkInfoByIdJoinFetchHouseworkMembers(houseworkInfo.getId()).get(); + + HouseworkTodo houseworkTodo = houseworkTodoRepository.save(generateHouseworkTodo(findHouseworkInfo, groupInfo, LocalDate.of(2022, 10, 10))); + + // when + Map result = houseworkTodoRepository.findByGroupInfoAndDate(groupInfo.getId(), LocalDate.of(2022, 10, 10)) + .stream() + .collect(Collectors.toMap(obj -> obj.getId(), obj -> obj)); + + // then + assertThat(result.get(1L).getDate()).isEqualTo(LocalDate.of(2022, 10, 10)); + } + + public static User generateUser() { + + return User.builder() + .platformId("123456") + .platformType(UserPlatformType.KAKAO) + .role(UserRole.USER) + .name("kms") + .email("kms@kakao.com") + .phoneNumber("010-0000-0000") + .profileImageUrl("https://google.com") + .pushAlarmYn(true) + .build(); + } + + public static GroupInfo generateGroupInfo(User user) { + + return GroupInfo.builder() + .user(user) + .bgColor("bbbbbb") + .colorCode("111111") + .gradient("csscssscss") + .name("group") + .info("hello world!") + .build(); + } + + public static GroupMember generateGroupMember(User user, GroupInfo groupInfo) { + + return GroupMember.builder() + .groupInfo(groupInfo) + .user(user) + .role(GroupMemberRole.GROUP_MEMBER) + .status(GroupMemberStatus.ACCEPT) + .build(); + } + + public static HouseworkCategory generateHouseworkCategory() { + + return HouseworkCategory.builder() + .name("집안일") + .build(); + } + + public static HouseworkInfo generateHouseworkInfo(HouseworkCategory category) { + + return HouseworkInfo.builder() + .houseworkCategory(category) + .title("빨래") + .detail("빨래 돌리기") + .type(HouseworkPeriodType.HOUSEWORK_PERIOD_EVERYDAY) + .endTime(LocalTime.of(18,0)) + .build(); + } + + public static HouseworkMember generateHouseworkMember(GroupMember groupMember, HouseworkInfo houseworkInfo) { + + return HouseworkMember.builder() + .houseworkInfo(houseworkInfo) + .groupMember(groupMember) + .build(); + } + + public static HouseworkTodo generateHouseworkTodo(HouseworkInfo houseworkInfo, GroupInfo groupInfo, LocalDate date) { + + return HouseworkTodo.makeTodoReferInfo(houseworkInfo, groupInfo, date); + } +} \ No newline at end of file From 08b505766c7471fbf1781f1044e9266943a8060d Mon Sep 17 00:00:00 2001 From: ghdcksgml1 Date: Tue, 17 Oct 2023 16:43:42 +0900 Subject: [PATCH 17/21] =?UTF-8?q?feat(#70):=20Redis=EC=97=90=20=EC=BA=90?= =?UTF-8?q?=EC=8B=B1=ED=95=A0=20TodoList=20=EA=B0=9D=EC=B2=B4=20=EC=A0=95?= =?UTF-8?q?=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/service/state/LoginStateService.java | 2 +- .../service/state/LoginStateServiceTest.java | 2 +- .../housework/todo/response/TodoResponse.java | 1 - .../define/housework/info/QHouseworkInfo.java | 7 ++- .../define/housework/todo/QHouseworkTodo.java | 6 +- .../redis/define/housework/todo/Todo.java | 46 +++++++++++++++ .../redis/define/housework/todo/TodoList.java | 34 +++++++++++ .../redis/define/housework/todo/TodoUser.java | 21 +++++++ .../todo/repository/TodoListRepository.java | 7 +++ .../LoginStateRepository.java | 3 +- .../define/housework/todo/TodoListTest.java | 56 +++++++++++++++++++ .../state/LoginStateRepositoryTest.java | 1 + 12 files changed, 178 insertions(+), 8 deletions(-) create mode 100644 heachi-domain-redis/src/main/java/com/heachi/redis/define/housework/todo/Todo.java create mode 100644 heachi-domain-redis/src/main/java/com/heachi/redis/define/housework/todo/TodoList.java create mode 100644 heachi-domain-redis/src/main/java/com/heachi/redis/define/housework/todo/TodoUser.java create mode 100644 heachi-domain-redis/src/main/java/com/heachi/redis/define/housework/todo/repository/TodoListRepository.java rename heachi-domain-redis/src/main/java/com/heachi/redis/define/state/{ => repository}/LoginStateRepository.java (62%) create mode 100644 heachi-domain-redis/src/test/java/com/heachi/redis/define/housework/todo/TodoListTest.java diff --git a/heachi-core/auth-api/src/main/java/com/heachi/auth/api/service/state/LoginStateService.java b/heachi-core/auth-api/src/main/java/com/heachi/auth/api/service/state/LoginStateService.java index 15f97bed..9ddb7525 100644 --- a/heachi-core/auth-api/src/main/java/com/heachi/auth/api/service/state/LoginStateService.java +++ b/heachi-core/auth-api/src/main/java/com/heachi/auth/api/service/state/LoginStateService.java @@ -3,7 +3,7 @@ import com.heachi.admin.common.exception.ExceptionMessage; import com.heachi.admin.common.exception.state.LoginStateException; import com.heachi.redis.define.state.LoginState; -import com.heachi.redis.define.state.LoginStateRepository; +import com.heachi.redis.define.state.repository.LoginStateRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; diff --git a/heachi-core/auth-api/src/test/java/com/heachi/auth/api/service/state/LoginStateServiceTest.java b/heachi-core/auth-api/src/test/java/com/heachi/auth/api/service/state/LoginStateServiceTest.java index 98a90c9a..9c3c9a91 100644 --- a/heachi-core/auth-api/src/test/java/com/heachi/auth/api/service/state/LoginStateServiceTest.java +++ b/heachi-core/auth-api/src/test/java/com/heachi/auth/api/service/state/LoginStateServiceTest.java @@ -3,7 +3,7 @@ import com.heachi.admin.common.exception.state.LoginStateException; import com.heachi.auth.TestConfig; import com.heachi.redis.define.state.LoginState; -import com.heachi.redis.define.state.LoginStateRepository; +import com.heachi.redis.define.state.repository.LoginStateRepository; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; diff --git a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/todo/response/TodoResponse.java b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/todo/response/TodoResponse.java index e618d0d1..b3ac569a 100644 --- a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/todo/response/TodoResponse.java +++ b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/todo/response/TodoResponse.java @@ -10,7 +10,6 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; diff --git a/heachi-domain-mysql/src/main/generated/com/heachi/mysql/define/housework/info/QHouseworkInfo.java b/heachi-domain-mysql/src/main/generated/com/heachi/mysql/define/housework/info/QHouseworkInfo.java index a9abb12c..c15da3ad 100644 --- a/heachi-domain-mysql/src/main/generated/com/heachi/mysql/define/housework/info/QHouseworkInfo.java +++ b/heachi-domain-mysql/src/main/generated/com/heachi/mysql/define/housework/info/QHouseworkInfo.java @@ -27,11 +27,13 @@ public class QHouseworkInfo extends EntityPathBase { //inherited public final DateTimePath createdDateTime = _super.createdDateTime; - public final DatePath dayDate = createDate("dayDate", java.util.Date.class); + public final DatePath dayDate = createDate("dayDate", java.time.LocalDate.class); public final StringPath detail = createString("detail"); - public final TimePath endTime = createTime("endTime", java.util.Date.class); + public final TimePath endTime = createTime("endTime", java.time.LocalTime.class); + + public final com.heachi.mysql.define.group.info.QGroupInfo groupInfo; public final com.heachi.mysql.define.housework.category.QHouseworkCategory houseworkCategory; @@ -68,6 +70,7 @@ public QHouseworkInfo(PathMetadata metadata, PathInits inits) { public QHouseworkInfo(Class type, PathMetadata metadata, PathInits inits) { super(type, metadata, inits); + this.groupInfo = inits.isInitialized("groupInfo") ? new com.heachi.mysql.define.group.info.QGroupInfo(forProperty("groupInfo"), inits.get("groupInfo")) : null; this.houseworkCategory = inits.isInitialized("houseworkCategory") ? new com.heachi.mysql.define.housework.category.QHouseworkCategory(forProperty("houseworkCategory")) : null; } diff --git a/heachi-domain-mysql/src/main/generated/com/heachi/mysql/define/housework/todo/QHouseworkTodo.java b/heachi-domain-mysql/src/main/generated/com/heachi/mysql/define/housework/todo/QHouseworkTodo.java index d9b95dd5..699a32e3 100644 --- a/heachi-domain-mysql/src/main/generated/com/heachi/mysql/define/housework/todo/QHouseworkTodo.java +++ b/heachi-domain-mysql/src/main/generated/com/heachi/mysql/define/housework/todo/QHouseworkTodo.java @@ -29,10 +29,12 @@ public class QHouseworkTodo extends EntityPathBase { //inherited public final DateTimePath createdDateTime = _super.createdDateTime; - public final DatePath date = createDate("date", java.util.Date.class); + public final DatePath date = createDate("date", java.time.LocalDate.class); public final StringPath detail = createString("detail"); + public final TimePath endTime = createTime("endTime", java.time.LocalTime.class); + public final com.heachi.mysql.define.group.info.QGroupInfo groupInfo; public final com.heachi.mysql.define.housework.info.QHouseworkInfo houseworkInfo; @@ -41,7 +43,7 @@ public class QHouseworkTodo extends EntityPathBase { public final NumberPath id = createNumber("id", Long.class); - public final NumberPath index = createNumber("index", Integer.class); + public final NumberPath idx = createNumber("idx", Integer.class); //inherited public final DateTimePath modifiedDateTime = _super.modifiedDateTime; diff --git a/heachi-domain-redis/src/main/java/com/heachi/redis/define/housework/todo/Todo.java b/heachi-domain-redis/src/main/java/com/heachi/redis/define/housework/todo/Todo.java new file mode 100644 index 00000000..b8fa0023 --- /dev/null +++ b/heachi-domain-redis/src/main/java/com/heachi/redis/define/housework/todo/Todo.java @@ -0,0 +1,46 @@ +package com.heachi.redis.define.housework.todo; + +import lombok.Builder; +import lombok.Getter; +import lombok.ToString; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.util.List; + +@Getter +@ToString +public class Todo { + + private Long id; + private List houseworkMembers; + private String category; + private String title; + private String detail; + private Integer idx; + private String status; + private LocalDate date; + private LocalTime endTime; + private String verificationPhotoURL; + private String verifierId; + private LocalDateTime verificationTime; + + @Builder + private Todo(Long id, List houseworkMembers, String category, String title, String detail, Integer idx, + String status, LocalDate date, LocalTime endTime, String verificationPhotoURL, String verifierId, + LocalDateTime verificationTime) { + this.id = id; + this.houseworkMembers = houseworkMembers; + this.category = category; + this.title = title; + this.detail = detail; + this.idx = idx; + this.status = status; + this.date = date; + this.endTime = endTime; + this.verificationPhotoURL = verificationPhotoURL; + this.verifierId = verifierId; + this.verificationTime = verificationTime; + } +} diff --git a/heachi-domain-redis/src/main/java/com/heachi/redis/define/housework/todo/TodoList.java b/heachi-domain-redis/src/main/java/com/heachi/redis/define/housework/todo/TodoList.java new file mode 100644 index 00000000..aabc5d81 --- /dev/null +++ b/heachi-domain-redis/src/main/java/com/heachi/redis/define/housework/todo/TodoList.java @@ -0,0 +1,34 @@ +package com.heachi.redis.define.housework.todo; + +import lombok.Builder; +import lombok.Getter; +import lombok.ToString; +import org.springframework.data.annotation.Id; +import org.springframework.data.redis.core.RedisHash; + +import java.time.LocalDate; +import java.util.List; + +@Getter +@ToString +@RedisHash(value = "todoList", timeToLive = 60 * 60 * 24) // 1일 동안 캐싱 +public class TodoList { + @Id + private String id; + private Long groupInfoId; + private LocalDate date; + private List todoList; + private boolean dirtyBit = false; + + @Builder + private TodoList(String id, Long groupInfoId, LocalDate date, List todoList) { + this.id = id; + this.groupInfoId = groupInfoId; + this.date = date; + this.todoList = todoList; + } + + public void checkDirtyBit() { + this.dirtyBit = true; + } +} diff --git a/heachi-domain-redis/src/main/java/com/heachi/redis/define/housework/todo/TodoUser.java b/heachi-domain-redis/src/main/java/com/heachi/redis/define/housework/todo/TodoUser.java new file mode 100644 index 00000000..b9e59963 --- /dev/null +++ b/heachi-domain-redis/src/main/java/com/heachi/redis/define/housework/todo/TodoUser.java @@ -0,0 +1,21 @@ +package com.heachi.redis.define.housework.todo; + +import lombok.Builder; +import lombok.Getter; +import lombok.ToString; + +@Getter +@ToString +public class TodoUser { + + private String name; + private String email; + private String profileImageUrl; + + @Builder + private TodoUser(String name, String email, String profileImageUrl) { + this.name = name; + this.email = email; + this.profileImageUrl = profileImageUrl; + } +} \ No newline at end of file diff --git a/heachi-domain-redis/src/main/java/com/heachi/redis/define/housework/todo/repository/TodoListRepository.java b/heachi-domain-redis/src/main/java/com/heachi/redis/define/housework/todo/repository/TodoListRepository.java new file mode 100644 index 00000000..48647ba7 --- /dev/null +++ b/heachi-domain-redis/src/main/java/com/heachi/redis/define/housework/todo/repository/TodoListRepository.java @@ -0,0 +1,7 @@ +package com.heachi.redis.define.housework.todo.repository; + +import com.heachi.redis.define.housework.todo.TodoList; +import org.springframework.data.repository.CrudRepository; + +public interface TodoListRepository extends CrudRepository { +} diff --git a/heachi-domain-redis/src/main/java/com/heachi/redis/define/state/LoginStateRepository.java b/heachi-domain-redis/src/main/java/com/heachi/redis/define/state/repository/LoginStateRepository.java similarity index 62% rename from heachi-domain-redis/src/main/java/com/heachi/redis/define/state/LoginStateRepository.java rename to heachi-domain-redis/src/main/java/com/heachi/redis/define/state/repository/LoginStateRepository.java index 39b5e647..9a5e4319 100644 --- a/heachi-domain-redis/src/main/java/com/heachi/redis/define/state/LoginStateRepository.java +++ b/heachi-domain-redis/src/main/java/com/heachi/redis/define/state/repository/LoginStateRepository.java @@ -1,5 +1,6 @@ -package com.heachi.redis.define.state; +package com.heachi.redis.define.state.repository; +import com.heachi.redis.define.state.LoginState; import org.springframework.data.repository.CrudRepository; import java.util.UUID; diff --git a/heachi-domain-redis/src/test/java/com/heachi/redis/define/housework/todo/TodoListTest.java b/heachi-domain-redis/src/test/java/com/heachi/redis/define/housework/todo/TodoListTest.java new file mode 100644 index 00000000..938ff203 --- /dev/null +++ b/heachi-domain-redis/src/test/java/com/heachi/redis/define/housework/todo/TodoListTest.java @@ -0,0 +1,56 @@ +package com.heachi.redis.define.housework.todo; + +import com.heachi.redis.define.housework.todo.repository.TodoListRepository; +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 java.time.LocalDate; +import java.time.LocalTime; +import java.util.List; +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest +class TodoListTest { + + @Autowired + private TodoListRepository todoListRepository; + + @Test + @DisplayName("TodoList를 생성해서 Redis에 저장할때 객체들이 잘 저장되는지 확인하는 테스트") + void todoListSaveTest() { + // given + LocalDate date = LocalDate.now(); + LocalTime endTime = LocalTime.of(18, 0); + + TodoList todoList = todoListRepository.save(TodoList.builder() + .groupInfoId(1L) + .date(date) + .todoList(List.of(Todo.builder() + .id(1L) + .houseworkMembers(List.of(TodoUser.builder() + .name("kms") + .email("kms@kakao.com") + .profileImageUrl("https://google.com") + .build())) + .category("집안일") + .title("빨래") + .detail("빨래 돌리기") + .status("HOUSEWORK_TODO_INCOMPLETE") + .date(date) + .endTime(endTime) + .build())) + .build()); + + // when + TodoList result = todoListRepository.findById(todoList.getId()).get(); + + // then + assertThat(result).isNotNull(); + } + +} \ No newline at end of file diff --git a/heachi-domain-redis/src/test/java/com/heachi/redis/define/state/LoginStateRepositoryTest.java b/heachi-domain-redis/src/test/java/com/heachi/redis/define/state/LoginStateRepositoryTest.java index 1a68782c..16bb6c06 100644 --- a/heachi-domain-redis/src/test/java/com/heachi/redis/define/state/LoginStateRepositoryTest.java +++ b/heachi-domain-redis/src/test/java/com/heachi/redis/define/state/LoginStateRepositoryTest.java @@ -1,5 +1,6 @@ package com.heachi.redis.define.state; +import com.heachi.redis.define.state.repository.LoginStateRepository; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; From 945b3fb129eae631fe5c1ae636451665b554e674 Mon Sep 17 00:00:00 2001 From: ghdcksgml1 Date: Tue, 17 Oct 2023 19:13:09 +0900 Subject: [PATCH 18/21] =?UTF-8?q?feat(#70):=20=EC=BA=90=EC=8B=B1=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 --- .../housework/todo/TodoController.java | 2 +- .../service/housework/todo/TodoService.java | 41 ++++++++++++++++++- .../todo/repository/TodoListRepository.java | 6 +++ 3 files changed, 47 insertions(+), 2 deletions(-) diff --git a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/housework/todo/TodoController.java b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/housework/todo/TodoController.java index 09b7250a..c65a2ec6 100644 --- a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/housework/todo/TodoController.java +++ b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/controller/housework/todo/TodoController.java @@ -27,7 +27,7 @@ public JsonResult selectTodo(@RequestHeader(name = "Authorization") String au @RequestParam(value = "date") LocalDate date) { UserInfoResponse userInfo = authExternalService.userAuthenticateAndGroupMatch(authorization, groupId); - return JsonResult.successOf(todoService.selectTodo( + return JsonResult.successOf(todoService.cachedSelectTodo( TodoSelectRequest.builder().groupId(groupId).date(date).build())); } } diff --git a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/todo/TodoService.java b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/todo/TodoService.java index 97894c98..76750966 100644 --- a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/todo/TodoService.java +++ b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/todo/TodoService.java @@ -1,14 +1,18 @@ package com.heachi.housework.api.service.housework.todo; +import com.heachi.admin.common.utils.CachingStrategy; import com.heachi.admin.common.utils.DayOfWeekUtils; import com.heachi.housework.api.service.housework.todo.request.TodoSelectRequest; import com.heachi.housework.api.service.housework.todo.response.TodoResponse; import com.heachi.mysql.define.group.member.repository.GroupMemberRepository; -import com.heachi.mysql.define.housework.info.HouseworkInfo; import com.heachi.mysql.define.housework.info.repository.HouseworkInfoRepository; import com.heachi.mysql.define.housework.todo.HouseworkTodo; import com.heachi.mysql.define.housework.todo.repository.HouseworkTodoRepository; import com.heachi.mysql.define.user.User; +import com.heachi.redis.define.housework.todo.Todo; +import com.heachi.redis.define.housework.todo.TodoList; +import com.heachi.redis.define.housework.todo.TodoUser; +import com.heachi.redis.define.housework.todo.repository.TodoListRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -26,10 +30,45 @@ @Transactional(readOnly = true) public class TodoService { + private final TodoListRepository todoListRepository; + private final GroupMemberRepository groupMemberRepository; private final HouseworkTodoRepository houseworkTodoRepository; private final HouseworkInfoRepository houseworkInfoRepository; + public TodoList cachedSelectTodo(TodoSelectRequest request) { + + return CachingStrategy.cachingIfEmpty(request, + (req) -> todoListRepository.findByGroupInfoIdAndDate(req.getGroupId(), req.getDate()), + (req) -> { + List todoResponseList = selectTodo(req); + + return todoListRepository.save(TodoList.builder() // List => TodoList 후 save + .groupInfoId(req.getGroupId()) + .date(req.getDate()) + .todoList(todoResponseList.stream() + .map(todo -> Todo.builder() + .id(todo.getId()) + .houseworkMembers(todo.getHouseworkMembers().stream() + .map(u -> TodoUser.builder() + .name(u.getName()) + .email(u.getEmail()) + .profileImageUrl(u.getProfileImageUrl()) + .build()) + .collect(Collectors.toList())) + .category(todo.getCategory()) + .title(todo.getTitle()) + .detail(todo.getDetail()) + .status(todo.getStatus().name()) + .date(todo.getDate()) + .endTime(todo.getEndTime()) + .build()) + .collect(Collectors.toList())) + .build()); + }, + (todo) -> todo.isDirtyBit() == false); // dirtyBit가 false가 아니면 캐시 업데이트 + } + // GroupInfoId와 Date를 통해 Todo List 가져오기 public List selectTodo(TodoSelectRequest request) { Long groupId = request.getGroupId(); diff --git a/heachi-domain-redis/src/main/java/com/heachi/redis/define/housework/todo/repository/TodoListRepository.java b/heachi-domain-redis/src/main/java/com/heachi/redis/define/housework/todo/repository/TodoListRepository.java index 48647ba7..53fdf7b7 100644 --- a/heachi-domain-redis/src/main/java/com/heachi/redis/define/housework/todo/repository/TodoListRepository.java +++ b/heachi-domain-redis/src/main/java/com/heachi/redis/define/housework/todo/repository/TodoListRepository.java @@ -2,6 +2,12 @@ import com.heachi.redis.define.housework.todo.TodoList; import org.springframework.data.repository.CrudRepository; +import org.springframework.data.repository.query.Param; + +import java.time.LocalDate; public interface TodoListRepository extends CrudRepository { + + public TodoList findByGroupInfoIdAndDate(@Param("groupInfoId") Long groupInfoId, @Param("date") LocalDate date); + } From cfb0ca13560096ca45598892772a304219c9532b Mon Sep 17 00:00:00 2001 From: ghdcksgml1 Date: Tue, 17 Oct 2023 23:26:40 +0900 Subject: [PATCH 19/21] =?UTF-8?q?refactor(#70):=20TodoList=20Id=20?= =?UTF-8?q?=EA=B0=92=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/housework/todo/TodoService.java | 54 +++++++++++-------- .../housework/todo/response/TodoResponse.java | 5 +- .../redis/define/housework/todo/TodoList.java | 8 ++- .../todo/repository/TodoListRepository.java | 3 -- 4 files changed, 40 insertions(+), 30 deletions(-) diff --git a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/todo/TodoService.java b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/todo/TodoService.java index 76750966..8631d7c0 100644 --- a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/todo/TodoService.java +++ b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/todo/TodoService.java @@ -39,32 +39,14 @@ public class TodoService { public TodoList cachedSelectTodo(TodoSelectRequest request) { return CachingStrategy.cachingIfEmpty(request, - (req) -> todoListRepository.findByGroupInfoIdAndDate(req.getGroupId(), req.getDate()), + (req) -> todoListRepository.findById(TodoList.makeId(req.getGroupId(), req.getDate())).orElse(null), (req) -> { List todoResponseList = selectTodo(req); - return todoListRepository.save(TodoList.builder() // List => TodoList 후 save - .groupInfoId(req.getGroupId()) - .date(req.getDate()) - .todoList(todoResponseList.stream() - .map(todo -> Todo.builder() - .id(todo.getId()) - .houseworkMembers(todo.getHouseworkMembers().stream() - .map(u -> TodoUser.builder() - .name(u.getName()) - .email(u.getEmail()) - .profileImageUrl(u.getProfileImageUrl()) - .build()) - .collect(Collectors.toList())) - .category(todo.getCategory()) - .title(todo.getTitle()) - .detail(todo.getDetail()) - .status(todo.getStatus().name()) - .date(todo.getDate()) - .endTime(todo.getEndTime()) - .build()) - .collect(Collectors.toList())) - .build()); + TodoList todoList = caching(req, todoResponseList); + log.info(">>>> [{}]의 캐싱이 완료 되었습니다.", todoList.getId()); + + return todoList; }, (todo) -> todo.isDirtyBit() == false); // dirtyBit가 false가 아니면 캐시 업데이트 } @@ -103,4 +85,30 @@ public List selectTodo(TodoSelectRequest request) { .map(todo -> TodoResponse.of(todo, userMap)) .collect(Collectors.toList()); } + + private TodoList caching(TodoSelectRequest req, List todoResponseList) { + + return todoListRepository.save(TodoList.builder() // List => TodoList 후 save + .groupInfoId(req.getGroupId()) + .date(req.getDate()) + .todoList(todoResponseList.stream() + .map(todo -> Todo.builder() + .id(todo.getId()) + .houseworkMembers(todo.getHouseworkMembers().stream() + .map(u -> TodoUser.builder() + .name(u.getName()) + .email(u.getEmail()) + .profileImageUrl(u.getProfileImageUrl()) + .build()) + .collect(Collectors.toList())) + .category(todo.getCategory()) + .title(todo.getTitle()) + .detail(todo.getDetail()) + .status(todo.getStatus().name()) + .date(todo.getDate()) + .endTime(todo.getEndTime()) + .build()) + .collect(Collectors.toList())) + .build()); + } } diff --git a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/todo/response/TodoResponse.java b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/todo/response/TodoResponse.java index b3ac569a..5925f7ee 100644 --- a/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/todo/response/TodoResponse.java +++ b/heachi-core/housework-api/src/main/java/com/heachi/housework/api/service/housework/todo/response/TodoResponse.java @@ -10,6 +10,7 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; @@ -54,10 +55,10 @@ public static TodoResponse of(HouseworkTodo todo, Map userMap) { return TodoResponse.builder() .id(todo.getId()) - .houseworkMembers(todo.getHouseworkMember() != "" ? Arrays.asList(todo.getHouseworkMember().split(",")).stream() + .houseworkMembers(!todo.getHouseworkMember().equals("") ? Arrays.asList(todo.getHouseworkMember().split(",")).stream() .map(Long::parseLong) .map(i -> TodoUser.of(userMap.get(i))) - .collect(Collectors.toList()) : null) + .collect(Collectors.toList()) : new ArrayList<>()) .category(todo.getCategory()) .title(todo.getTitle()) .detail(todo.getDetail()) diff --git a/heachi-domain-redis/src/main/java/com/heachi/redis/define/housework/todo/TodoList.java b/heachi-domain-redis/src/main/java/com/heachi/redis/define/housework/todo/TodoList.java index aabc5d81..a03190c5 100644 --- a/heachi-domain-redis/src/main/java/com/heachi/redis/define/housework/todo/TodoList.java +++ b/heachi-domain-redis/src/main/java/com/heachi/redis/define/housework/todo/TodoList.java @@ -21,13 +21,17 @@ public class TodoList { private boolean dirtyBit = false; @Builder - private TodoList(String id, Long groupInfoId, LocalDate date, List todoList) { - this.id = id; + private TodoList(Long groupInfoId, LocalDate date, List todoList) { + this.id = groupInfoId.toString() + "," + date.toString(); this.groupInfoId = groupInfoId; this.date = date; this.todoList = todoList; } + public static String makeId(Long groupInfoId, LocalDate date) { + return groupInfoId.toString() + "," + date.toString(); + } + public void checkDirtyBit() { this.dirtyBit = true; } diff --git a/heachi-domain-redis/src/main/java/com/heachi/redis/define/housework/todo/repository/TodoListRepository.java b/heachi-domain-redis/src/main/java/com/heachi/redis/define/housework/todo/repository/TodoListRepository.java index 53fdf7b7..fbcb1a89 100644 --- a/heachi-domain-redis/src/main/java/com/heachi/redis/define/housework/todo/repository/TodoListRepository.java +++ b/heachi-domain-redis/src/main/java/com/heachi/redis/define/housework/todo/repository/TodoListRepository.java @@ -7,7 +7,4 @@ import java.time.LocalDate; public interface TodoListRepository extends CrudRepository { - - public TodoList findByGroupInfoIdAndDate(@Param("groupInfoId") Long groupInfoId, @Param("date") LocalDate date); - } From fe296f1ac22a946c8d5c11cdabbf5ca643c4d95f Mon Sep 17 00:00:00 2001 From: ghdcksgml1 Date: Tue, 17 Oct 2023 23:27:35 +0900 Subject: [PATCH 20/21] =?UTF-8?q?test(#70):=20caching=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BD=94=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/heachi/housework/TestConfig.java | 14 +++++ .../housework/todo/TodoServiceTest.java | 57 +++++++++++++++++++ .../HouseworkInfoRepositoryImpl.java | 2 +- 3 files changed, 72 insertions(+), 1 deletion(-) diff --git a/heachi-core/housework-api/src/test/java/com/heachi/housework/TestConfig.java b/heachi-core/housework-api/src/test/java/com/heachi/housework/TestConfig.java index c0d84994..36e42c8f 100644 --- a/heachi-core/housework-api/src/test/java/com/heachi/housework/TestConfig.java +++ b/heachi-core/housework-api/src/test/java/com/heachi/housework/TestConfig.java @@ -44,6 +44,20 @@ public static User generateUser() { .build(); } + public static User generateUser(String email, String phoneNumber) { + + return User.builder() + .platformId("123456") + .platformType(UserPlatformType.KAKAO) + .role(UserRole.USER) + .name("kms") + .email(email) + .phoneNumber(phoneNumber) + .profileImageUrl("https://google.com") + .pushAlarmYn(true) + .build(); + } + public static GroupInfo generateGroupInfo(User user) { return GroupInfo.builder() diff --git a/heachi-core/housework-api/src/test/java/com/heachi/housework/api/service/housework/todo/TodoServiceTest.java b/heachi-core/housework-api/src/test/java/com/heachi/housework/api/service/housework/todo/TodoServiceTest.java index 9c454521..0080b0cc 100644 --- a/heachi-core/housework-api/src/test/java/com/heachi/housework/api/service/housework/todo/TodoServiceTest.java +++ b/heachi-core/housework-api/src/test/java/com/heachi/housework/api/service/housework/todo/TodoServiceTest.java @@ -18,6 +18,8 @@ import com.heachi.mysql.define.housework.todo.repository.HouseworkTodoRepository; import com.heachi.mysql.define.user.User; import com.heachi.mysql.define.user.repository.UserRepository; +import com.heachi.redis.define.housework.todo.TodoList; +import com.heachi.redis.define.housework.todo.repository.TodoListRepository; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -41,6 +43,7 @@ class TodoServiceTest extends TestConfig { @Autowired private HouseworkMemberRepository houseworkMemberRepository; @Autowired private TodoService todoService; + @Autowired private TodoListRepository todoListRepository; @AfterEach void tearDown() { @@ -51,6 +54,8 @@ void tearDown() { groupMemberRepository.deleteAllInBatch(); groupInfoRepository.deleteAllInBatch(); userRepository.deleteAllInBatch(); + + todoListRepository.deleteAll(); } @Test @@ -120,4 +125,56 @@ void test2() { assertThat(todoResponse.getTitle()).isEqualTo("빨래"); }); } + + @Test + @DisplayName("캐싱되어 있는 데이터가 있으면 그대로 가져와 리턴한다.") + void test3() { + // given + User user = userRepository.save(generateUser()); + GroupInfo groupInfo = groupInfoRepository.save(generateGroupInfo(user)); + GroupMember groupMember = groupMemberRepository.save(generateGroupMember(user, groupInfo)); + + HouseworkCategory houseworkCategory = houseworkCategoryRepository.save(generateHouseworkCategory()); + HouseworkInfo houseworkInfo = houseworkInfoRepository.save(generateHouseworkInfo(groupInfo, houseworkCategory)); + + HouseworkMember houseworkMember = houseworkMemberRepository.save(generateHouseworkMember(groupMember, houseworkInfo)); + + // when + todoService.cachedSelectTodo(TodoSelectRequest.builder().groupId(groupInfo.getId()).date(LocalDate.now()).build()); + + // then + todoService.cachedSelectTodo(TodoSelectRequest.builder().groupId(groupInfo.getId()).date(LocalDate.now()).build()); + } + + @Test + @DisplayName("캐싱되어 있는 데이터가 있지만, dirtyBit가 true라면 HOUSEWORK_TODO를 최신화 시켜 캐싱한다.") + void test4() { + // given + User user = userRepository.save(generateUser()); + User user2 = userRepository.save(generateUser("kmm@kakao.com", "010-1111-1111")); + GroupInfo groupInfo = groupInfoRepository.save(generateGroupInfo(user)); + GroupMember groupMember = groupMemberRepository.save(generateGroupMember(user, groupInfo)); + GroupMember groupMember2 = groupMemberRepository.save(generateGroupMember(user2, groupInfo)); + + HouseworkCategory houseworkCategory = houseworkCategoryRepository.save(generateHouseworkCategory()); + HouseworkInfo houseworkInfo = houseworkInfoRepository.save(generateHouseworkInfo(groupInfo, houseworkCategory)); + + HouseworkMember houseworkMember = houseworkMemberRepository.save(generateHouseworkMember(groupMember, houseworkInfo)); + HouseworkMember houseworkMember2 = houseworkMemberRepository.save(generateHouseworkMember(groupMember2, houseworkInfo)); + + // when + TodoList todoList = todoService.cachedSelectTodo(TodoSelectRequest.builder().groupId(groupInfo.getId()).date(LocalDate.now()).build()); + + // HOUSEWORK_INFO 추가 + HouseworkInfo houseworkInfo1 = houseworkInfoRepository.save(generateHouseworkInfo(groupInfo, houseworkCategory)); + todoList.checkDirtyBit(); + todoListRepository.save(todoList); + + TodoList result = todoService.cachedSelectTodo(TodoSelectRequest.builder().groupId(groupInfo.getId()).date(LocalDate.now()).build()); + + // then + assertThat(result.isDirtyBit()).isFalse(); + assertThat(result.getTodoList().size()).isEqualTo(2); + System.out.println("result = " + result); + } } \ No newline at end of file diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/repository/HouseworkInfoRepositoryImpl.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/repository/HouseworkInfoRepositoryImpl.java index 1fcd26ec..520a67c8 100644 --- a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/repository/HouseworkInfoRepositoryImpl.java +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/repository/HouseworkInfoRepositoryImpl.java @@ -35,7 +35,7 @@ public Optional findHouseworkInfoByIdJoinFetchHouseworkMembers(Lo public List findHouseworkInfoByGroupInfoId(Long groupId) { return queryFactory.selectFrom(houseworkInfo) - .innerJoin(houseworkInfo.houseworkMembers, houseworkMember).fetchJoin() + .leftJoin(houseworkInfo.houseworkMembers, houseworkMember).fetchJoin() .innerJoin(houseworkInfo.houseworkCategory, houseworkCategory).fetchJoin() .innerJoin(houseworkInfo.groupInfo, groupInfo).fetchJoin() .where(houseworkInfo.groupInfo.id.eq(groupId)) From b60c8393daa13fff20f1d348ff7527dd904c96ea Mon Sep 17 00:00:00 2001 From: ghdcksgml1 Date: Tue, 17 Oct 2023 23:37:09 +0900 Subject: [PATCH 21/21] refactor(#70): @OneToMany inner join => left join --- .../housework/info/repository/HouseworkInfoRepositoryImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/repository/HouseworkInfoRepositoryImpl.java b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/repository/HouseworkInfoRepositoryImpl.java index 520a67c8..d057e1fd 100644 --- a/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/repository/HouseworkInfoRepositoryImpl.java +++ b/heachi-domain-mysql/src/main/java/com/heachi/mysql/define/housework/info/repository/HouseworkInfoRepositoryImpl.java @@ -25,7 +25,7 @@ public class HouseworkInfoRepositoryImpl implements HouseworkInfoRepositoryCusto public Optional findHouseworkInfoByIdJoinFetchHouseworkMembers(Long houseworkInfoId) { return Optional.of(queryFactory.selectFrom(houseworkInfo) - .innerJoin(houseworkInfo.houseworkMembers, houseworkMember).fetchJoin() + .leftJoin(houseworkInfo.houseworkMembers, houseworkMember).fetchJoin() .innerJoin(houseworkInfo.houseworkCategory, houseworkCategory).fetchJoin() .where(houseworkInfo.id.eq(houseworkInfoId)) .fetchOne());