From e6c08100eec9ce3d01a830cdba9debbd96a6be99 Mon Sep 17 00:00:00 2001 From: pricelees Date: Sun, 27 Jul 2025 22:48:49 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20=ED=9A=8C=EC=9B=90=20API=20?= =?UTF-8?q?=EB=A1=9C=EA=B9=85=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/business/MemberService.kt | 42 ++++++++++++++----- .../kotlin/roomescape/member/web/MemberDTO.kt | 4 ++ 2 files changed, 35 insertions(+), 11 deletions(-) diff --git a/src/main/kotlin/roomescape/member/business/MemberService.kt b/src/main/kotlin/roomescape/member/business/MemberService.kt index 3f5e112d..ad6881d0 100644 --- a/src/main/kotlin/roomescape/member/business/MemberService.kt +++ b/src/main/kotlin/roomescape/member/business/MemberService.kt @@ -1,5 +1,6 @@ package roomescape.member.business +import io.github.oshai.kotlinlogging.KotlinLogging import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional @@ -10,26 +11,37 @@ import roomescape.member.infrastructure.persistence.MemberRepository import roomescape.member.infrastructure.persistence.Role import roomescape.member.web.* +private val log = KotlinLogging.logger {} + @Service @Transactional(readOnly = true) class MemberService( - private val memberRepository: MemberRepository + private val memberRepository: MemberRepository, ) { - fun findMembers(): MemberRetrieveListResponse = MemberRetrieveListResponse( - members = memberRepository.findAll().map { it.toRetrieveResponse() } - ) + fun findMembers(): MemberRetrieveListResponse { + log.debug { "[MemberService.findMembers] 회원 조회 시작" } - fun findById(memberId: Long): MemberEntity = fetchOrThrow { - memberRepository.findByIdOrNull(memberId) + return memberRepository.findAll() + .also { log.info { "[MemberService.findMembers] 회원 ${it.size}명 조회 완료" } } + .toRetrieveListResponse() } - fun findByEmailAndPassword(email: String, password: String): MemberEntity = fetchOrThrow { - memberRepository.findByEmailAndPassword(email, password) + fun findById(memberId: Long): MemberEntity { + return fetchOrThrow("findById", "memberId=$memberId") { + memberRepository.findByIdOrNull(memberId) + } + } + + fun findByEmailAndPassword(email: String, password: String): MemberEntity { + return fetchOrThrow("findByEmailAndPassword", "email=$email, password=$password") { + memberRepository.findByEmailAndPassword(email, password) + } } @Transactional - fun create(request: SignupRequest): SignupResponse { + fun createMember(request: SignupRequest): SignupResponse { memberRepository.findByEmail(request.email)?.let { + log.info { "[MemberService.createMember] 회원가입 실패(이메일 중복): email=${request.email}" } throw MemberException(MemberErrorCode.DUPLICATE_EMAIL) } @@ -39,10 +51,18 @@ class MemberService( password = request.password, role = Role.MEMBER ) + return memberRepository.save(member).toSignupResponse() + .also { log.info { "[MemberService.create] 회원가입 완료: email=${request.email} memberId=${it.id}" } } } - private fun fetchOrThrow(block: () -> MemberEntity?): MemberEntity { - return block() ?: throw MemberException(MemberErrorCode.MEMBER_NOT_FOUND) + private fun fetchOrThrow(calledBy: String, params: String, block: () -> MemberEntity?): MemberEntity { + log.debug { "[MemberService.$calledBy] 회원 조회 시작: params=$params" } + return block() + ?.also { log.info { "[MemberService.$calledBy] 회원 조회 완료: memberId=${it.id}" } } + ?: run { + log.info { "[MemberService.$calledBy] 회원 조회 실패: $params" } + throw MemberException(MemberErrorCode.MEMBER_NOT_FOUND) + } } } diff --git a/src/main/kotlin/roomescape/member/web/MemberDTO.kt b/src/main/kotlin/roomescape/member/web/MemberDTO.kt index 07e76551..1d36e37e 100644 --- a/src/main/kotlin/roomescape/member/web/MemberDTO.kt +++ b/src/main/kotlin/roomescape/member/web/MemberDTO.kt @@ -16,6 +16,10 @@ data class MemberRetrieveResponse( val name: String ) +fun List.toRetrieveListResponse(): MemberRetrieveListResponse = MemberRetrieveListResponse( + members = this.map { it.toRetrieveResponse() } +) + data class MemberRetrieveListResponse( val members: List )