diff --git a/src/main/java/flipnote/group/adapter/in/web/JoinController.java b/src/main/java/flipnote/group/adapter/in/web/JoinController.java index 2918ace..444d168 100644 --- a/src/main/java/flipnote/group/adapter/in/web/JoinController.java +++ b/src/main/java/flipnote/group/adapter/in/web/JoinController.java @@ -59,7 +59,6 @@ public ResponseEntity joinRequest( /** * 해당 그룹 가입 신청 리스트 조회 - * todo 유저 닉네임 추가 * @param userId * @param groupId * @return diff --git a/src/main/java/flipnote/group/api/dto/response/FindMyJoinListResponseDto.java b/src/main/java/flipnote/group/api/dto/response/FindMyJoinListResponseDto.java index a9b2aa2..7db5208 100644 --- a/src/main/java/flipnote/group/api/dto/response/FindMyJoinListResponseDto.java +++ b/src/main/java/flipnote/group/api/dto/response/FindMyJoinListResponseDto.java @@ -3,10 +3,10 @@ import java.util.List; import flipnote.group.application.port.in.result.FindMyJoinListResult; -import flipnote.group.domain.model.join.JoinInfo; +import flipnote.group.domain.model.join.JoinMyInfo; public record FindMyJoinListResponseDto( - List joinList + List joinList ) { public static FindMyJoinListResponseDto from(FindMyJoinListResult result) { diff --git a/src/main/java/flipnote/group/application/port/in/result/FindJoinFormListResult.java b/src/main/java/flipnote/group/application/port/in/result/FindJoinFormListResult.java index 087feb4..b5db2ef 100644 --- a/src/main/java/flipnote/group/application/port/in/result/FindJoinFormListResult.java +++ b/src/main/java/flipnote/group/application/port/in/result/FindJoinFormListResult.java @@ -1,19 +1,23 @@ package flipnote.group.application.port.in.result; import java.util.List; +import java.util.Map; import flipnote.group.adapter.out.entity.JoinEntity; import flipnote.group.domain.model.join.JoinInfo; +import flipnote.user.grpc.GetUserResponse; public record FindJoinFormListResult( List joinInfoList ) { - public static FindJoinFormListResult of(List joinDomainList) { + public static FindJoinFormListResult of(List joinList, Map userMap) { - List joinInfoList = joinDomainList.stream() - .map(JoinInfo::of) + List results = joinList.stream() + .map(join -> { + GetUserResponse user = userMap.get(join.getUserId()); + return JoinInfo.of(join, user.getNickname()); + }) .toList(); - - return new FindJoinFormListResult(joinInfoList); + return new FindJoinFormListResult(results); } } diff --git a/src/main/java/flipnote/group/application/port/in/result/FindMyJoinListResult.java b/src/main/java/flipnote/group/application/port/in/result/FindMyJoinListResult.java index 80d9e39..69ebe6c 100644 --- a/src/main/java/flipnote/group/application/port/in/result/FindMyJoinListResult.java +++ b/src/main/java/flipnote/group/application/port/in/result/FindMyJoinListResult.java @@ -3,14 +3,14 @@ import java.util.List; import flipnote.group.adapter.out.entity.JoinEntity; -import flipnote.group.domain.model.join.JoinInfo; +import flipnote.group.domain.model.join.JoinMyInfo; public record FindMyJoinListResult( - List joinList + List joinList ) { public static FindMyJoinListResult of(List joinList) { - List joinInfoList = joinList.stream() - .map(JoinInfo::of) + List joinInfoList = joinList.stream() + .map(JoinMyInfo::of) .toList(); return new FindMyJoinListResult(joinInfoList); } diff --git a/src/main/java/flipnote/group/application/service/ApplicationFormService.java b/src/main/java/flipnote/group/application/service/ApplicationFormService.java index 42ef9f1..94e8875 100644 --- a/src/main/java/flipnote/group/application/service/ApplicationFormService.java +++ b/src/main/java/flipnote/group/application/service/ApplicationFormService.java @@ -1,6 +1,8 @@ package flipnote.group.application.service; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -25,6 +27,10 @@ import flipnote.group.domain.model.permission.GroupPermission; import flipnote.group.domain.policy.BusinessException; import flipnote.group.domain.policy.ErrorCode; +import flipnote.user.grpc.GetUserResponse; +import flipnote.user.grpc.GetUsersRequest; +import flipnote.user.grpc.GetUsersResponse; +import flipnote.user.grpc.UserQueryServiceGrpc; import lombok.RequiredArgsConstructor; @Service @@ -35,6 +41,7 @@ public class ApplicationFormService implements JoinUseCase { private final JoinRepositoryPort joinRepository; private final GroupMemberRepositoryPort groupMemberRepository; private final GroupRoleRepositoryPort groupRoleRepository; + private final UserQueryServiceGrpc.UserQueryServiceBlockingStub userQueryServiceStub; private static final GroupPermission JOIN_MANAGE = GroupPermission.JOIN_REQUEST_MANAGE; @@ -90,10 +97,25 @@ public FindJoinFormListResult findJoinFormList(FindJoinFormCommand cmd) { throw new BusinessException(ErrorCode.PERMISSION_DENIED); } - List joinDomainList = joinRepository.findFormList(cmd.groupId()); + List joinList = joinRepository.findFormList(cmd.groupId()); + // userId 목록 추출 + List userIds = joinList.stream() + .map(JoinEntity::getUserId) + .toList(); - return FindJoinFormListResult.of(joinDomainList); + // gRPC로 유저 정보 한번에 조회 + GetUsersResponse usersResponse = userQueryServiceStub.getUsers( + GetUsersRequest.newBuilder() + .addAllUserIds(userIds) + .build() + ); + + // userId -> UserResponse 맵핑 + Map userMap = usersResponse.getUsersList().stream() + .collect(Collectors.toMap(GetUserResponse::getId, u -> u)); + + return FindJoinFormListResult.of(joinList, userMap); } private void checkJoinable(GroupEntity group) { diff --git a/src/main/java/flipnote/group/domain/model/join/JoinInfo.java b/src/main/java/flipnote/group/domain/model/join/JoinInfo.java index 9bb17d9..04a4d1e 100644 --- a/src/main/java/flipnote/group/domain/model/join/JoinInfo.java +++ b/src/main/java/flipnote/group/domain/model/join/JoinInfo.java @@ -9,7 +9,7 @@ public record JoinInfo( String joinIntro, JoinStatus status ) { - public static JoinInfo of(JoinEntity join) { - return new JoinInfo(join.getId(), join.getUserId(), "nickname", join.getForm(), join.getStatus()); + public static JoinInfo of(JoinEntity join, String nickname) { + return new JoinInfo(join.getId(), join.getUserId(), nickname, join.getForm(), join.getStatus()); } } diff --git a/src/main/java/flipnote/group/domain/model/join/JoinMyInfo.java b/src/main/java/flipnote/group/domain/model/join/JoinMyInfo.java new file mode 100644 index 0000000..d5b752f --- /dev/null +++ b/src/main/java/flipnote/group/domain/model/join/JoinMyInfo.java @@ -0,0 +1,13 @@ +package flipnote.group.domain.model.join; + +import flipnote.group.adapter.out.entity.JoinEntity; + +public record JoinMyInfo( + Long groupJoinId, + String joinIntro, + JoinStatus status +) { + public static JoinMyInfo of(JoinEntity join) { + return new JoinMyInfo(join.getId(), join.getForm(), join.getStatus()); + } +} diff --git a/src/main/java/flipnote/group/global/config/GrpcClientConfig.java b/src/main/java/flipnote/group/global/config/GrpcClientConfig.java index c078fca..230f758 100644 --- a/src/main/java/flipnote/group/global/config/GrpcClientConfig.java +++ b/src/main/java/flipnote/group/global/config/GrpcClientConfig.java @@ -5,6 +5,7 @@ import org.springframework.context.annotation.Configuration; import flipnote.image.grpc.v1.ImageCommandServiceGrpc; +import flipnote.user.grpc.UserQueryServiceGrpc; import io.grpc.ManagedChannel; import io.grpc.ManagedChannelBuilder; @@ -26,4 +27,20 @@ public ImageCommandServiceGrpc.ImageCommandServiceBlockingStub imageCommandServi ) { return ImageCommandServiceGrpc.newBlockingStub(imageCommandChannel); } + + @Bean(destroyMethod = "shutdownNow") + public ManagedChannel userQueryChannel( + @Value("${spring.grpc.user.address:localhost:9091}") String target + ) { + return ManagedChannelBuilder.forTarget(target) + .usePlaintext() + .build(); + } + + @Bean + public UserQueryServiceGrpc.UserQueryServiceBlockingStub userQueryServiceStub( + ManagedChannel userQueryChannel + ) { + return UserQueryServiceGrpc.newBlockingStub(userQueryChannel); + } } diff --git a/src/main/proto/user.proto b/src/main/proto/user.proto new file mode 100644 index 0000000..93b3afb --- /dev/null +++ b/src/main/proto/user.proto @@ -0,0 +1,31 @@ +syntax = "proto3"; + +option java_package = "flipnote.user.grpc"; +option java_outer_classname = "UserQueryProto"; +option java_multiple_files = true; + +package user_query; + +service UserQueryService { + rpc GetUser(GetUserRequest) returns (GetUserResponse); + rpc GetUsers(GetUsersRequest) returns (GetUsersResponse); +} + +message GetUserRequest { + int64 user_id = 1; +} + +message GetUserResponse { + int64 id = 1; + string email = 2; + string nickname = 3; + string profile_image_url = 4; +} + +message GetUsersRequest { + repeated int64 user_ids = 1; +} + +message GetUsersResponse { + repeated GetUserResponse users = 1; +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 97d6ac0..21415b0 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -10,6 +10,8 @@ spring: port: 9094 image: address: ${GRPC_IMAGE_URL:localhost:9092} + user: + address: ${GRPC_USER_URL:localhost:9091} datasource: driver-class-name: com.mysql.cj.jdbc.Driver @@ -30,17 +32,21 @@ springdoc: api-docs: path: /groups/v3/api-docs - -image-clean: - batch-size: 300 - orphan-grace-minutes: 10 - -image: - default: - user: https://flipnote-bucket.s3.ap-northeast-2.amazonaws.com/image/default/user.png - group: https://flipnote-bucket.s3.ap-northeast-2.amazonaws.com/image/default/group.png - cardSet: https://flipnote-bucket.s3.ap-northeast-2.amazonaws.com/image/default/cardset.png - logging: level: flipnote.group: DEBUG + +management: + endpoints: + web: + exposure: + include: health + endpoint: + health: + probes: + enabled: true + health: + livenessState: + enabled: true + readinessState: + enabled: true