Skip to content

Commit 8652395

Browse files
Merge pull request #24 from EntryDSM/feature/20-dev-gRPC
feature/20-dev-gRPC
2 parents b3298f5 + 6d54dd7 commit 8652395

5 files changed

Lines changed: 133 additions & 0 deletions

File tree

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package hs.kr.entrydsm.user.infrastructure.grpc.server
2+
3+
import hs.kr.entrydsm.casper.user.proto.UserServiceGrpcKt
4+
import hs.kr.entrydsm.casper.user.proto.UserServiceProto
5+
import hs.kr.entrydsm.user.domain.user.application.port.`in`.QueryUserByUUIDUseCase
6+
import hs.kr.entrydsm.user.infrastructure.grpc.server.mapper.UserGrpcMapper
7+
import io.grpc.Status
8+
import io.grpc.StatusException
9+
import net.devh.boot.grpc.server.service.GrpcService
10+
import java.util.UUID
11+
12+
/**
13+
* 사용자 관련 gRPC 서비스 구현 클래스입니다.
14+
* 다른 마이크로서비스와의 gRPC 통신을 통해 사용자 정보를 제공합니다.
15+
*
16+
* @property queryUserByUUIDUseCase UUID로 사용자 조회 유스케이스
17+
* @property userGrpcMapper gRPC 메시지 변환 매퍼
18+
*/
19+
@GrpcService
20+
class UserGrpcService(
21+
private val queryUserByUUIDUseCase: QueryUserByUUIDUseCase,
22+
private val userGrpcMapper: UserGrpcMapper,
23+
) : UserServiceGrpcKt.UserServiceCoroutineImplBase() {
24+
25+
/**
26+
* 사용자 ID로 사용자 정보를 조회합니다.
27+
*
28+
* @param request 사용자 ID가 포함된 gRPC 요청
29+
* @return 사용자 정보 gRPC 응답
30+
* @throws StatusException UUID 형식이 잘못되었거나 서버 오류가 발생한 경우
31+
*/
32+
override suspend fun getUserInfoByUserId(request: UserServiceProto.GetUserInfoRequest): UserServiceProto.GetUserInfoResponse {
33+
val userId = UUID.fromString(request.userId)
34+
val userInfo = queryUserByUUIDUseCase.getUserById(userId)
35+
return userGrpcMapper.toGetUserInfoResponse(userInfo)
36+
}
37+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package hs.kr.entrydsm.user.infrastructure.grpc.server.dto
2+
3+
import hs.kr.entrydsm.user.domain.user.adapter.out.domain.UserRole
4+
import java.util.UUID
5+
6+
/**
7+
* 내부 gRPC 통신용 사용자 응답 DTO 클래스입니다.
8+
* 다른 마이크로서비스와의 통신에서 사용자 정보를 전달하는 데 사용됩니다.
9+
*
10+
* @property id 사용자 고유 식별자
11+
* @property phoneNumber 사용자 전화번호
12+
* @property name 사용자 이름
13+
* @property isParent 학부모 여부
14+
* @property receiptCode 지원서 접수번호
15+
* @property role 사용자 역할
16+
*/
17+
data class InternalUserResponse(
18+
val id: UUID,
19+
val phoneNumber: String,
20+
val name: String,
21+
val isParent: Boolean,
22+
val receiptCode: Long?,
23+
val role: UserRole,
24+
)
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package hs.kr.entrydsm.user.infrastructure.grpc.server.mapper
2+
3+
import hs.kr.entrydsm.casper.user.proto.UserServiceProto
4+
import hs.kr.entrydsm.user.infrastructure.grpc.server.dto.InternalUserResponse
5+
import hs.kr.entrydsm.user.domain.user.adapter.out.domain.UserRole
6+
import org.springframework.stereotype.Component
7+
8+
/**
9+
* 사용자 정보를 gRPC 프로토콜 버퍼와 매핑하는 매퍼 클래스입니다.
10+
* 내부 DTO와 gRPC 메시지 간의 변환을 담당합니다.
11+
*/
12+
@Component
13+
class UserGrpcMapper {
14+
15+
/**
16+
* InternalUserResponse 객체를 gRPC 사용자 정보 응답으로 변환합니다.
17+
*
18+
* @param userResponse 변환할 사용자 응답 DTO
19+
* @return gRPC 사용자 정보 응답
20+
*/
21+
fun toGetUserInfoResponse(userResponse: InternalUserResponse): UserServiceProto.GetUserInfoResponse {
22+
return UserServiceProto.GetUserInfoResponse.newBuilder()
23+
.setId(userResponse.id.toString())
24+
.setPhoneNumber(userResponse.phoneNumber)
25+
.setName(userResponse.name)
26+
.setIsParent(userResponse.isParent)
27+
.setRole(toProtoUserRole(userResponse.role))
28+
.build()
29+
}
30+
31+
/**
32+
* 도메인 사용자 역할을 gRPC 프로토콜 사용자 역할로 변환합니다.
33+
*
34+
* @param userRole 변환할 도메인 사용자 역할
35+
* @return gRPC 프로토콜 사용자 역할
36+
*/
37+
private fun toProtoUserRole(userRole: UserRole): UserServiceProto.UserRole{
38+
return when(userRole){
39+
UserRole.ROOT -> UserServiceProto.UserRole.ROOT
40+
UserRole.USER -> UserServiceProto.UserRole.USER
41+
UserRole.ADMIN -> UserServiceProto.UserRole.ADMIN
42+
}
43+
}
44+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package hs.kr.entrydsm.user.infrastructure.kafka.producer
2+
3+
/**
4+
* 모든 테이블 삭제 이벤트를 Kafka로 발행하는 Producer 인터페이스입니다.
5+
* 관리자가 전체 데이터를 초기화할 때 다른 마이크로서비스에 알림을 전송하는 역할을 합니다.
6+
*/
7+
interface DeleteAllTableProducer {
8+
/**
9+
* 모든 테이블 삭제 이벤트를 전송합니다.
10+
* 전체 데이터 초기화 이벤트를 Kafka 토픽으로 발행합니다.
11+
*/
12+
fun send()
13+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package hs.kr.entrydsm.user.infrastructure.kafka.producer
2+
3+
/**
4+
* 사용자 삭제 이벤트를 Kafka로 발행하는 Producer 인터페이스입니다.
5+
* 사용자 탈퇴 시 다른 마이크로서비스에 알림을 전송하는 역할을 합니다.
6+
*/
7+
interface DeleteUserProducer {
8+
/**
9+
* 사용자 삭제 이벤트를 전송합니다.
10+
* 사용자의 접수번호를 포함한 삭제 이벤트를 Kafka 토픽으로 발행합니다.
11+
*
12+
* @param receiptCode 삭제된 사용자의 접수번호
13+
*/
14+
fun send(receiptCode: Long)
15+
}

0 commit comments

Comments
 (0)