From 112cfd465ccb5852aab1a9ed94c787328c5ad586 Mon Sep 17 00:00:00 2001 From: Raymond Date: Sun, 14 Jul 2024 03:24:53 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=8A=A4=ED=8E=98=EC=9D=B4=EC=8A=A4=20?= =?UTF-8?q?=ED=9A=8C=EC=9B=90=20=EC=88=98=20=EC=A1=B0=ED=9A=8C=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 --- build.gradle | 6 +- .../org/layer/domain/space/api/SpaceApi.java | 4 +- .../space/controller/SpaceController.java | 2 +- .../layer/domain/space/dto/SpaceResponse.java | 16 ++-- .../domain/space/service/SpaceService.java | 7 +- .../space/dto/SpaceWithMemberCount.java | 6 +- .../space/repository/SpaceRepositoryImpl.java | 77 +++++++------------ 7 files changed, 48 insertions(+), 70 deletions(-) diff --git a/build.gradle b/build.gradle index e6980303..2ca459fd 100644 --- a/build.gradle +++ b/build.gradle @@ -138,9 +138,9 @@ project(":layer-external") { bootJar.enabled = false jar.enabled = true - dependencies { - implementation project(path: ':layer-common') - implementation project(path: ':layer-domain') + dependencies { + implementation project(path: ':layer-common') + implementation project(path: ':layer-domain') testImplementation platform('org.junit:junit-bom:5.9.1') testImplementation 'org.junit.jupiter:junit-jupiter' diff --git a/layer-api/src/main/java/org/layer/domain/space/api/SpaceApi.java b/layer-api/src/main/java/org/layer/domain/space/api/SpaceApi.java index e8201323..334e6940 100644 --- a/layer-api/src/main/java/org/layer/domain/space/api/SpaceApi.java +++ b/layer-api/src/main/java/org/layer/domain/space/api/SpaceApi.java @@ -74,8 +74,8 @@ public interface SpaceApi { """) @ApiResponses({ @ApiResponse(responseCode = "200", content = { - @Content(mediaType = "application/json", schema = @Schema(implementation = SpaceResponse.SpaceWithUserCountInfo.class)) + @Content(mediaType = "application/json", schema = @Schema(implementation = SpaceResponse.SpaceWithMemberCountInfo.class)) }) }) - ResponseEntity getSpaceById(@MemberId Long memberId, @PathVariable Long spaceId); + ResponseEntity getSpaceById(@MemberId Long memberId, @PathVariable Long spaceId); } diff --git a/layer-api/src/main/java/org/layer/domain/space/controller/SpaceController.java b/layer-api/src/main/java/org/layer/domain/space/controller/SpaceController.java index 91858a96..ed6526ea 100644 --- a/layer-api/src/main/java/org/layer/domain/space/controller/SpaceController.java +++ b/layer-api/src/main/java/org/layer/domain/space/controller/SpaceController.java @@ -42,7 +42,7 @@ public void updateSpace(@MemberId Long memberId, @RequestBody @Validated SpaceRe } @GetMapping("/{spaceId}") - public ResponseEntity getSpaceById(@MemberId Long memberId, @PathVariable Long spaceId) { + public ResponseEntity getSpaceById(@MemberId Long memberId, @PathVariable Long spaceId) { var foundSpace = spaceService.getSpaceById(memberId, spaceId); return ResponseEntity.ok((foundSpace)); } diff --git a/layer-api/src/main/java/org/layer/domain/space/dto/SpaceResponse.java b/layer-api/src/main/java/org/layer/domain/space/dto/SpaceResponse.java index 33f7e603..365d7577 100644 --- a/layer-api/src/main/java/org/layer/domain/space/dto/SpaceResponse.java +++ b/layer-api/src/main/java/org/layer/domain/space/dto/SpaceResponse.java @@ -14,11 +14,11 @@ import static org.layer.domain.auth.exception.TokenExceptionType.INVALID_REFRESH_TOKEN; public class SpaceResponse { - + @Builder @Schema(description = "스페이스 정보 응답") - public record SpaceWithUserCountInfo( + public record SpaceWithMemberCountInfo( @Schema(description = "스페이스 ID") @NotNull Long id, @@ -40,13 +40,13 @@ public record SpaceWithUserCountInfo( Long formId, @Schema(description = "소속된 회원 수") - Long userCount + Long memberCount ) { - public static SpaceWithUserCountInfo toResponse(SpaceWithMemberCount space) { + public static SpaceWithMemberCountInfo toResponse(SpaceWithMemberCount space) { return Optional.ofNullable(space) - .map(it -> SpaceWithUserCountInfo.builder().id(it.getId()).category(it.getCategory()) + .map(it -> SpaceWithMemberCountInfo.builder().id(it.getId()).category(it.getCategory()) .field(it.getField()).name(it.getName()).introduction(it.getIntroduction()) - .formId(it.getFormId()).userCount(it.getUserCount()).build()) + .formId(it.getFormId()).memberCount(it.getMemberCount()).build()) .orElseThrow(() -> new BaseCustomException(INVALID_REFRESH_TOKEN)); } } @@ -55,13 +55,13 @@ public static SpaceWithUserCountInfo toResponse(SpaceWithMemberCount space) { @Schema() public record SpacePage( @Schema() - List data, + List data, @Schema() Meta meta ) { - public static SpacePage toResponse(List spaceInfo, Meta meta) { + public static SpacePage toResponse(List spaceInfo, Meta meta) { return SpacePage.builder().data(spaceInfo).meta(meta).build(); } } diff --git a/layer-api/src/main/java/org/layer/domain/space/service/SpaceService.java b/layer-api/src/main/java/org/layer/domain/space/service/SpaceService.java index cd8aee2a..a83e940d 100644 --- a/layer-api/src/main/java/org/layer/domain/space/service/SpaceService.java +++ b/layer-api/src/main/java/org/layer/domain/space/service/SpaceService.java @@ -3,7 +3,6 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; - import org.layer.common.dto.Meta; import org.layer.common.exception.BaseCustomException; import org.layer.domain.space.dto.SpaceRequest; @@ -37,7 +36,7 @@ public SpaceResponse.SpacePage getSpaceListFromMemberId(Long memberId, SpaceRequ Long newCursor = !hasNextPage ? null : spacePages.isEmpty() ? null : spacePages.get(spacePages.size() - 1).getId(); - var spaceList = spacePages.stream().map(SpaceResponse.SpaceWithUserCountInfo::toResponse).collect(Collectors.toList()); + var spaceList = spacePages.stream().map(SpaceResponse.SpaceWithMemberCountInfo::toResponse).collect(Collectors.toList()); var meta = Meta.builder().cursor(newCursor).hasNextPage(hasNextPage).build(); return SpaceResponse.SpacePage.toResponse(spaceList, meta); @@ -57,10 +56,10 @@ public void updateSpace(Long memberId, SpaceRequest.UpdateSpaceRequest updateSpa spaceRepository.updateSpace(updateSpaceRequest.id(), updateSpaceRequest.category(), updateSpaceRequest.field(), updateSpaceRequest.name(), updateSpaceRequest.introduction()); } - public SpaceResponse.SpaceWithUserCountInfo getSpaceById(Long memberId, Long spaceId) { + public SpaceResponse.SpaceWithMemberCountInfo getSpaceById(Long memberId, Long spaceId) { var foundSpace = spaceRepository.findByIdAndJoinedMemberId(spaceId, memberId).orElseThrow(() -> new BaseCustomException(SPACE_NOT_FOUND)); - return SpaceResponse.SpaceWithUserCountInfo.toResponse(foundSpace); + return SpaceResponse.SpaceWithMemberCountInfo.toResponse(foundSpace); } } diff --git a/layer-domain/src/main/java/org/layer/domain/space/dto/SpaceWithMemberCount.java b/layer-domain/src/main/java/org/layer/domain/space/dto/SpaceWithMemberCount.java index 962c8597..1bc348af 100644 --- a/layer-domain/src/main/java/org/layer/domain/space/dto/SpaceWithMemberCount.java +++ b/layer-domain/src/main/java/org/layer/domain/space/dto/SpaceWithMemberCount.java @@ -27,10 +27,10 @@ public class SpaceWithMemberCount { @NotNull private Long leaderId; private Long formId; - private Long userCount; + private Long memberCount; @QueryProjection - public SpaceWithMemberCount(Long id, LocalDateTime createdAt, LocalDateTime updatedAt, SpaceCategory category, SpaceField field, String name, String introduction, Long leaderId, Long formId, Long userCount) { + public SpaceWithMemberCount(Long id, LocalDateTime createdAt, LocalDateTime updatedAt, SpaceCategory category, SpaceField field, String name, String introduction, Long leaderId, Long formId, Long memberCount) { this.id = id; this.createdAt = createdAt; this.updatedAt = updatedAt; @@ -40,6 +40,6 @@ public SpaceWithMemberCount(Long id, LocalDateTime createdAt, LocalDateTime upda this.introduction = introduction; this.leaderId = leaderId; this.formId = formId; - this.userCount = userCount; + this.memberCount = memberCount; } } \ No newline at end of file diff --git a/layer-domain/src/main/java/org/layer/domain/space/repository/SpaceRepositoryImpl.java b/layer-domain/src/main/java/org/layer/domain/space/repository/SpaceRepositoryImpl.java index 5a231600..0cbfece1 100644 --- a/layer-domain/src/main/java/org/layer/domain/space/repository/SpaceRepositoryImpl.java +++ b/layer-domain/src/main/java/org/layer/domain/space/repository/SpaceRepositoryImpl.java @@ -1,13 +1,13 @@ package org.layer.domain.space.repository; -import com.querydsl.core.types.ExpressionUtils; import com.querydsl.core.types.dsl.BooleanExpression; -import com.querydsl.jpa.JPAExpressions; +import com.querydsl.jpa.impl.JPAQuery; import com.querydsl.jpa.impl.JPAQueryFactory; import jakarta.persistence.EntityManager; import lombok.extern.slf4j.Slf4j; import org.layer.domain.space.dto.QSpaceWithMemberCount; import org.layer.domain.space.dto.SpaceWithMemberCount; +import org.layer.domain.space.entity.QMemberSpaceRelation; import org.layer.domain.space.entity.SpaceCategory; import org.layer.domain.space.entity.SpaceField; import org.springframework.stereotype.Repository; @@ -34,26 +34,7 @@ public List findAllSpacesByMemberIdAndCategoryAndCursor(Lo .and(cursorId == null ? null : space.id.gt(cursorId)) .and(hasCategory(category)); - return queryFactory.select( - new QSpaceWithMemberCount( - space.id, - space.createdAt, - space.updatedAt, - space.category, - space.field, - space.name, - space.introduction, - space.leaderId, - space.formId, - ExpressionUtils.as(JPAExpressions.select( - memberSpaceRelation.id.count() - ) - .from(memberSpaceRelation) - .where(memberSpaceRelation.space.id.eq(space.id)) - , "userCount") - )) - .from(space) - .join(memberSpaceRelation).on(space.id.eq(memberSpaceRelation.space.id)) + return getSpaceWithMemberCountQuery() .where(predicate) .groupBy(space.id) .orderBy(space.id.asc()) @@ -63,27 +44,8 @@ public List findAllSpacesByMemberIdAndCategoryAndCursor(Lo @Override public Optional findByIdAndJoinedMemberId(Long spaceId, Long memberId) { - var foundSpace = queryFactory.select( - new QSpaceWithMemberCount(space.id, - space.createdAt, - space.updatedAt, - space.category, - space.field, - space.name, - space.introduction, - space.leaderId, - space.formId, - ExpressionUtils.as(JPAExpressions.select( - memberSpaceRelation.id.count() - ) - .from(memberSpaceRelation) - .where(memberSpaceRelation.space.id.eq(space.id)) - , "userCount") - ) - ) - .from(memberSpaceRelation) - .join(space) - .on(space.id.eq(memberSpaceRelation.space.id)) + + var foundSpace = getSpaceWithMemberCountQuery() .where(space.id.eq(spaceId) .and(memberSpaceRelation.memberId.eq(memberId))) .limit(1) @@ -93,7 +55,7 @@ public Optional findByIdAndJoinedMemberId(Long spaceId, Lo return Optional.empty(); } // TODO: 커스텀 에러로 변경 - return Optional.ofNullable(foundSpace); + return Optional.of(foundSpace); } @Override @@ -109,15 +71,32 @@ public Long updateSpace(Long spaceId, SpaceCategory category, SpaceField field, return query.where(space.id.eq(spaceId)).execute(); } + private JPAQuery getSpaceWithMemberCountQuery() { + QMemberSpaceRelation memberCountRelationTable = new QMemberSpaceRelation("msr"); + return queryFactory.select( + new QSpaceWithMemberCount( + space.id, + space.createdAt, + space.updatedAt, + space.category, + space.field, + space.name, + space.introduction, + space.leaderId, + space.formId, + memberCountRelationTable.space.id.count().as("memberCount") + )) + .from(space) + .leftJoin(memberSpaceRelation).on(space.id.eq(memberSpaceRelation.space.id)) + .leftJoin(memberCountRelationTable).on(space.id.eq(memberCountRelationTable.space.id)); + } + private BooleanExpression hasCategory(Optional category) { - if (category.isPresent()) { - return space.category.eq(category.get()); - } - return null; + return category.map(space.category::eq).orElse(null); } private boolean isSpaceWithMemberCountEmpty(SpaceWithMemberCount space) { - return space.getId() == null && space.getName() == null && space.getUserCount() == 0; + return space.getId() == null && space.getName() == null && space.getMemberCount() == 0; } }