From 83b5a03899cda2165304d41eb9c41363b0521787 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=A3=BC=EC=9B=90?= Date: Mon, 28 Jul 2025 15:07:26 +0900 Subject: [PATCH 01/13] =?UTF-8?q?feat=20(=20#14=20)=20:=20model=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entrydsm/user/domain/admin/model/Admin.kt | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/model/Admin.kt diff --git a/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/model/Admin.kt b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/model/Admin.kt new file mode 100644 index 0000000..9020f16 --- /dev/null +++ b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/model/Admin.kt @@ -0,0 +1,17 @@ +package hs.kr.entrydsm.user.domain.admin.model + +import java.util.UUID + +/** + * 관리자 도메인 모델을 나타내는 데이터 클래스입니다. + * 시스템 관리자의 인증 정보를 관리합니다. + * + * @property id 관리자 고유 식별자 + * @property adminId 관리자 로그인 ID + * @property password 암호화된 비밀번호 + */ +data class Admin( + val id: UUID?, + val adminId: String, + val password: String, +) From adb1b3e5d82d6a159597bb496c96e73641cd3cb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=A3=BC=EC=9B=90?= Date: Mon, 28 Jul 2025 15:08:00 +0900 Subject: [PATCH 02/13] =?UTF-8?q?feat=20(=20#14=20)=20:=20application=20in?= =?UTF-8?q?/port=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/port/in/AdminFacadeUseCase.kt | 18 ++++++++++++++++++ .../application/port/in/AdminLoginUseCase.kt | 18 ++++++++++++++++++ .../port/in/AdminTokenRefreshUseCase.kt | 13 +++++++++++++ .../port/in/DeleteAllTableUseCase.kt | 11 +++++++++++ .../port/in/QueryAdminByUUIDUseCase.kt | 14 ++++++++++++++ 5 files changed, 74 insertions(+) create mode 100644 casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/port/in/AdminFacadeUseCase.kt create mode 100644 casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/port/in/AdminLoginUseCase.kt create mode 100644 casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/port/in/AdminTokenRefreshUseCase.kt create mode 100644 casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/port/in/DeleteAllTableUseCase.kt create mode 100644 casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/port/in/QueryAdminByUUIDUseCase.kt diff --git a/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/port/in/AdminFacadeUseCase.kt b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/port/in/AdminFacadeUseCase.kt new file mode 100644 index 0000000..1b373d3 --- /dev/null +++ b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/port/in/AdminFacadeUseCase.kt @@ -0,0 +1,18 @@ +package hs.kr.entrydsm.user.domain.admin.application.port.`in` + +import hs.kr.entrydsm.user.domain.admin.model.Admin + +/** + * 관리자 Facade 기능을 정의하는 UseCase 인터페이스입니다. + */ +interface AdminFacadeUseCase { + /** + * 현재 인증된 관리자의 사용자 정보를 조회합니다. + */ + fun getCurrentUser(): Admin + + /** + * 관리자 ID로 사용자 정보를 조회합니다. + */ + fun getUserById(adminId: String): Admin +} diff --git a/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/port/in/AdminLoginUseCase.kt b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/port/in/AdminLoginUseCase.kt new file mode 100644 index 0000000..14a9681 --- /dev/null +++ b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/port/in/AdminLoginUseCase.kt @@ -0,0 +1,18 @@ +package hs.kr.entrydsm.user.domain.admin.application.port.`in` + +import hs.kr.entrydsm.user.domain.admin.adapter.`in`.web.dto.request.AdminLoginRequest +import hs.kr.entrydsm.user.global.utils.token.dto.TokenResponse + +/** + * 관리자 로그인 유스케이스 인터페이스입니다. + * 관리자 인증 및 토큰 발급 처리를 정의합니다. + */ +interface AdminLoginUseCase { + /** + * 관리자 로그인을 처리합니다. + * + * @param request 관리자 로그인 요청 정보 + * @return 생성된 인증 토큰 응답 + */ + fun login(request: AdminLoginRequest): TokenResponse +} diff --git a/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/port/in/AdminTokenRefreshUseCase.kt b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/port/in/AdminTokenRefreshUseCase.kt new file mode 100644 index 0000000..044adc3 --- /dev/null +++ b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/port/in/AdminTokenRefreshUseCase.kt @@ -0,0 +1,13 @@ +package hs.kr.entrydsm.user.domain.admin.application.port.`in` + +import hs.kr.entrydsm.user.global.utils.token.dto.TokenResponse + +/** + * 관리자 토큰 갱신 기능을 정의하는 UseCase 인터페이스입니다. + */ +interface AdminTokenRefreshUseCase { + /** + * 관리자 토큰을 갱신합니다. + */ + fun refresh(token: String): TokenResponse +} diff --git a/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/port/in/DeleteAllTableUseCase.kt b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/port/in/DeleteAllTableUseCase.kt new file mode 100644 index 0000000..2f5cd5b --- /dev/null +++ b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/port/in/DeleteAllTableUseCase.kt @@ -0,0 +1,11 @@ +package hs.kr.entrydsm.user.domain.admin.application.port.`in` + +/** + * 모든 테이블 삭제 기능을 정의하는 UseCase 인터페이스입니다. + */ +interface DeleteAllTableUseCase { + /** + * 모든 테이블을 삭제합니다. + */ + fun deleteAllTables() +} diff --git a/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/port/in/QueryAdminByUUIDUseCase.kt b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/port/in/QueryAdminByUUIDUseCase.kt new file mode 100644 index 0000000..5d34082 --- /dev/null +++ b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/port/in/QueryAdminByUUIDUseCase.kt @@ -0,0 +1,14 @@ +package hs.kr.entrydsm.user.domain.admin.application.port.`in` + +import hs.kr.entrydsm.user.domain.admin.adapter.`in`.web.dto.response.InternalAdminResponse +import java.util.UUID + +/** + * UUID로 관리자 조회 기능을 정의하는 UseCase 인터페이스입니다. + */ +interface QueryAdminByUUIDUseCase { + /** + * UUID로 관리자 정보를 조회합니다. + */ + fun queryByUUID(adminId: UUID): InternalAdminResponse +} From bdc4a8cc9e0cf7778f62c28feb7a5b6979e049b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=A3=BC=EC=9B=90?= Date: Mon, 28 Jul 2025 15:08:22 +0900 Subject: [PATCH 03/13] =?UTF-8?q?feat=20(=20#14=20)=20:=20application=20ou?= =?UTF-8?q?t/port=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/application/port/out/AdminPort.kt | 7 +++++ .../application/port/out/QueryAdminPort.kt | 26 +++++++++++++++++++ .../application/port/out/SaveAdminPort.kt | 16 ++++++++++++ 3 files changed, 49 insertions(+) create mode 100644 casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/port/out/AdminPort.kt create mode 100644 casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/port/out/QueryAdminPort.kt create mode 100644 casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/port/out/SaveAdminPort.kt diff --git a/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/port/out/AdminPort.kt b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/port/out/AdminPort.kt new file mode 100644 index 0000000..5eb2dcd --- /dev/null +++ b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/port/out/AdminPort.kt @@ -0,0 +1,7 @@ +package hs.kr.entrydsm.user.domain.admin.application.port.out + +/** + * 관리자 관련 모든 포트 인터페이스를 통합한 포트입니다. + * 관리자 데이터의 CRUD 작업을 위한 모든 인터페이스를 상속받습니다. + */ +interface AdminPort : SaveAdminPort, QueryAdminPort diff --git a/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/port/out/QueryAdminPort.kt b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/port/out/QueryAdminPort.kt new file mode 100644 index 0000000..de87863 --- /dev/null +++ b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/port/out/QueryAdminPort.kt @@ -0,0 +1,26 @@ +package hs.kr.entrydsm.user.domain.admin.application.port.out + +import hs.kr.entrydsm.user.domain.admin.model.Admin +import java.util.UUID + +/** + * 관리자 조회 작업을 위한 포트 인터페이스입니다. + * 헥사고날 아키텍처에서 도메인 계층이 인프라스트럭처 계층과 통신하기 위한 인터페이스입니다. + */ +interface QueryAdminPort { + /** + * 관리자 ID로 관리자를 조회합니다. + * + * @param adminId 조회할 관리자 ID + * @return 조회된 관리자 도메인 모델 (없으면 null) + */ + fun findByAdminId(adminId: String): Admin? + + /** + * UUID로 관리자를 조회합니다. + * + * @param id 조회할 관리자 UUID + * @return 조회된 관리자 도메인 모델 (없으면 null) + */ + fun findById(id: UUID): Admin? +} diff --git a/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/port/out/SaveAdminPort.kt b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/port/out/SaveAdminPort.kt new file mode 100644 index 0000000..c309f27 --- /dev/null +++ b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/port/out/SaveAdminPort.kt @@ -0,0 +1,16 @@ +package hs.kr.entrydsm.user.domain.admin.application.port.out + +import hs.kr.entrydsm.user.domain.admin.model.Admin + +/** + * 관리자 저장 작업을 위한 포트 인터페이스입니다. + * 헥사고날 아키텍처에서 도메인 계층이 인프라스트럭처 계층과 통신하기 위한 인터페이스입니다. + */ +interface SaveAdminPort { + /** + * 관리자 정보를 저장합니다. + * + * @param admin 저장할 관리자 도메인 모델 + */ + fun save(admin: Admin) +} From c1f7353c424f3d3d7d2b6bb72f56af41d3959f3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=A3=BC=EC=9B=90?= Date: Mon, 28 Jul 2025 15:09:03 +0900 Subject: [PATCH 04/13] =?UTF-8?q?feat=20(=20#14=20)=20:=20application=20se?= =?UTF-8?q?rvice=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/AdminTokenRefreshService.kt | 21 ++++++++++++++ .../service/DeleteAllTableService.kt | 18 ++++++++++++ .../service/QueryAdminByUUIDService.kt | 28 +++++++++++++++++++ 3 files changed, 67 insertions(+) create mode 100644 casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/service/AdminTokenRefreshService.kt create mode 100644 casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/service/DeleteAllTableService.kt create mode 100644 casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/service/QueryAdminByUUIDService.kt diff --git a/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/service/AdminTokenRefreshService.kt b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/service/AdminTokenRefreshService.kt new file mode 100644 index 0000000..2e58d2a --- /dev/null +++ b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/service/AdminTokenRefreshService.kt @@ -0,0 +1,21 @@ +package hs.kr.entrydsm.user.domain.admin.application.service + +import hs.kr.entrydsm.user.domain.admin.application.port.`in`.AdminTokenRefreshUseCase +import hs.kr.entrydsm.user.global.security.jwt.JwtTokenProvider +import hs.kr.entrydsm.user.global.utils.token.dto.TokenResponse +import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Transactional + +/** + * 관리자 토큰 갱신 비즈니스 로직을 처리하는 서비스 클래스입니다. + */ +@Service +class AdminTokenRefreshService( + private val jwtTokenProvider: JwtTokenProvider, +) : AdminTokenRefreshUseCase { + /** + * 관리자의 리프레시 토큰을 이용하여 새로운 액세스 토큰을 발급합니다. + */ + @Transactional + override fun refresh(refreshToken: String): TokenResponse = jwtTokenProvider.reIssue(refreshToken) +} diff --git a/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/service/DeleteAllTableService.kt b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/service/DeleteAllTableService.kt new file mode 100644 index 0000000..807b85a --- /dev/null +++ b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/service/DeleteAllTableService.kt @@ -0,0 +1,18 @@ +package hs.kr.entrydsm.user.domain.admin.application.service + +import hs.kr.entrydsm.user.domain.admin.application.port.`in`.DeleteAllTableUseCase +import hs.kr.entrydsm.user.infrastructure.kafka.producer.DeleteAllTableProducer +import org.springframework.stereotype.Service + +/** + * 모든 테이블 삭제 비즈니스 로직을 처리하는 서비스 클래스입니다. + */ +@Service +class DeleteAllTableService( + private val deleteAllTableProducer: DeleteAllTableProducer, +) : DeleteAllTableUseCase { + /** + * 모든 테이블을 삭제합니다. + */ + override fun deleteAllTables() = deleteAllTableProducer.send() +} diff --git a/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/service/QueryAdminByUUIDService.kt b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/service/QueryAdminByUUIDService.kt new file mode 100644 index 0000000..1ddf192 --- /dev/null +++ b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/application/service/QueryAdminByUUIDService.kt @@ -0,0 +1,28 @@ +package hs.kr.entrydsm.user.domain.admin.application.service + +import hs.kr.entrydsm.user.domain.admin.adapter.`in`.web.dto.response.InternalAdminResponse +import hs.kr.entrydsm.user.domain.admin.application.port.`in`.QueryAdminByUUIDUseCase +import hs.kr.entrydsm.user.domain.admin.application.port.out.QueryAdminPort +import hs.kr.entrydsm.user.domain.admin.exception.AdminNotFoundException +import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Transactional +import java.util.UUID + +/** + * UUID로 관리자 조회 비즈니스 로직을 처리하는 서비스 클래스입니다. + */ +@Service +class QueryAdminByUUIDService( + private val queryAdminPort: QueryAdminPort, +) : QueryAdminByUUIDUseCase { + /** + * UUID를 이용하여 관리자 정보를 조회합니다. + */ + @Transactional(readOnly = true) + override fun queryByUUID(adminId: UUID): InternalAdminResponse { + val admin = queryAdminPort.findById(adminId) ?: throw AdminNotFoundException + return InternalAdminResponse( + id = admin.id!!, + ) + } +} From 660953862ea03d516d0c92a7fb7c42872b0f54c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=A3=BC=EC=9B=90?= Date: Mon, 28 Jul 2025 15:09:58 +0900 Subject: [PATCH 05/13] =?UTF-8?q?feat=20(=20#14=20)=20:=20in/web=20control?= =?UTF-8?q?ler=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/adapter/in/web/AdminController.kt | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/adapter/in/web/AdminController.kt diff --git a/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/adapter/in/web/AdminController.kt b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/adapter/in/web/AdminController.kt new file mode 100644 index 0000000..2da8a4e --- /dev/null +++ b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/adapter/in/web/AdminController.kt @@ -0,0 +1,63 @@ +package hs.kr.entrydsm.user.domain.admin.adapter.`in`.web + +import hs.kr.entrydsm.user.domain.admin.adapter.`in`.web.dto.request.AdminLoginRequest +import hs.kr.entrydsm.user.domain.admin.application.port.`in`.AdminLoginUseCase +import hs.kr.entrydsm.user.domain.admin.application.port.`in`.AdminTokenRefreshUseCase +import hs.kr.entrydsm.user.domain.admin.application.port.`in`.DeleteAllTableUseCase +import hs.kr.entrydsm.user.domain.admin.application.port.`in`.QueryAdminByUUIDUseCase +import hs.kr.entrydsm.user.global.document.admin.AdminApiDocument +import hs.kr.entrydsm.user.global.utils.token.dto.TokenResponse +import jakarta.validation.Valid +import org.springframework.web.bind.annotation.DeleteMapping +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PathVariable +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.PutMapping +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RequestHeader +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController +import java.util.UUID + +/** + * 관리자 관련 HTTP 요청을 처리하는 REST 컨트롤러 클래스입니다. + */ +@RestController +@RequestMapping("/admin") +class AdminController( + private val adminLoginUseCase: AdminLoginUseCase, + private val adminTokenRefreshUseCase: AdminTokenRefreshUseCase, + private val deleteAllTableUseCase: DeleteAllTableUseCase, + private val queryAdminByUUIDUseCase: QueryAdminByUUIDUseCase, +) : AdminApiDocument { + /** + * 관리자 로그인을 처리합니다. + */ + @PostMapping("/auth") + override fun login( + @RequestBody @Valid + adminLoginRequest: AdminLoginRequest, + ): TokenResponse = adminLoginUseCase.login(adminLoginRequest) + + /** + * 관리자 토큰을 갱신합니다. + */ + @PutMapping("/auth") + override fun tokenRefresh( + @RequestHeader("X-Refresh-Token") refreshToken: String, + ): TokenResponse = adminTokenRefreshUseCase.refresh(refreshToken) + + /** + * 모든 테이블을 삭제합니다. + */ + @DeleteMapping("/auth") + override fun deleteAllTable() = deleteAllTableUseCase.deleteAllTables() + + /** + * UUID로 관리자 정보를 조회합니다. + */ + @GetMapping("/{adminId}") + override fun findAdminById( + @PathVariable adminId: UUID, + ) = queryAdminByUUIDUseCase.queryByUUID(adminId) +} From de7d1063fda375841cd5e9790578febb1ffc606e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=A3=BC=EC=9B=90?= Date: Mon, 28 Jul 2025 15:10:16 +0900 Subject: [PATCH 06/13] =?UTF-8?q?feat=20(=20#14=20)=20:=20in/web=20dto=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../in/web/dto/response/InternalAdminResponse.kt | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/adapter/in/web/dto/response/InternalAdminResponse.kt diff --git a/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/adapter/in/web/dto/response/InternalAdminResponse.kt b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/adapter/in/web/dto/response/InternalAdminResponse.kt new file mode 100644 index 0000000..38d00e4 --- /dev/null +++ b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/adapter/in/web/dto/response/InternalAdminResponse.kt @@ -0,0 +1,10 @@ +package hs.kr.entrydsm.user.domain.admin.adapter.`in`.web.dto.response + +import java.util.UUID + +/** + * 내부 시스템 간 관리자 정보 응답 데이터를 담는 DTO 클래스입니다. + */ +data class InternalAdminResponse( + val id: UUID, +) From f79374e23efef69fae9084055d55691a1320c286 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=A3=BC=EC=9B=90?= Date: Mon, 28 Jul 2025 15:10:43 +0900 Subject: [PATCH 07/13] =?UTF-8?q?feat=20(=20#14=20)=20:=20adapter/out=20ma?= =?UTF-8?q?pper=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/adapter/out/mapper/AdminMapper.kt | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/adapter/out/mapper/AdminMapper.kt diff --git a/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/adapter/out/mapper/AdminMapper.kt b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/adapter/out/mapper/AdminMapper.kt new file mode 100644 index 0000000..ea55e46 --- /dev/null +++ b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/adapter/out/mapper/AdminMapper.kt @@ -0,0 +1,16 @@ +package hs.kr.entrydsm.user.domain.admin.adapter.out.mapper + +import hs.kr.entrydsm.user.domain.admin.adapter.out.AdminJpaEntity +import hs.kr.entrydsm.user.domain.admin.model.Admin +import hs.kr.entrydsm.user.global.mapper.GenericMapper +import org.mapstruct.Mapper + +/** + * Admin 도메인 모델과 AdminJpaEntity 간의 변환을 담당하는 매퍼 클래스입니다. + */ +@Mapper +abstract class AdminMapper : GenericMapper { + abstract override fun toEntity(model: Admin): AdminJpaEntity + + abstract override fun toModel(entity: AdminJpaEntity?): Admin? +} From 69418c15d5bba3fe80d5d60ece8e2f6d4415f982 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=A3=BC=EC=9B=90?= Date: Mon, 28 Jul 2025 15:11:21 +0900 Subject: [PATCH 08/13] =?UTF-8?q?feat=20(=20#14=20)=20:=20adapter/out=20pe?= =?UTF-8?q?rsistence=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../persistence/AdminPersistenceAdapter.kt | 30 +++++++++++++++++++ .../persistence/repository/AdminRepository.kt | 15 ++++++++++ 2 files changed, 45 insertions(+) create mode 100644 casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/adapter/out/persistence/AdminPersistenceAdapter.kt create mode 100644 casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/adapter/out/persistence/repository/AdminRepository.kt diff --git a/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/adapter/out/persistence/AdminPersistenceAdapter.kt b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/adapter/out/persistence/AdminPersistenceAdapter.kt new file mode 100644 index 0000000..964ca50 --- /dev/null +++ b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/adapter/out/persistence/AdminPersistenceAdapter.kt @@ -0,0 +1,30 @@ +package hs.kr.entrydsm.user.domain.admin.adapter.out.persistence + +import hs.kr.entrydsm.user.domain.admin.adapter.out.mapper.AdminMapper +import hs.kr.entrydsm.user.domain.admin.adapter.out.persistence.repository.AdminRepository +import hs.kr.entrydsm.user.domain.admin.application.port.out.AdminPort +import hs.kr.entrydsm.user.domain.admin.model.Admin +import org.springframework.data.repository.findByIdOrNull +import org.springframework.stereotype.Component +import java.util.UUID + +/** + * 관리자 데이터의 영속성 처리를 담당하는 어댑터 클래스입니다. + */ +@Component +class AdminPersistenceAdapter( + private val adminRepository: AdminRepository, + private val adminMapper: AdminMapper, +) : AdminPort { + override fun findById(id: UUID): Admin? { + return adminRepository.findByIdOrNull(id)?.let { adminMapper.toModel(it) } + } + + override fun findByAdminId(adminId: String): Admin? { + return adminRepository.findByAdminId(adminId)?.let { adminMapper.toModel(it) } + } + + override fun save(admin: Admin) { + adminRepository.save(adminMapper.toEntity(admin)) + } +} diff --git a/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/adapter/out/persistence/repository/AdminRepository.kt b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/adapter/out/persistence/repository/AdminRepository.kt new file mode 100644 index 0000000..6d3bdc5 --- /dev/null +++ b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/adapter/out/persistence/repository/AdminRepository.kt @@ -0,0 +1,15 @@ +package hs.kr.entrydsm.user.domain.admin.adapter.out.persistence.repository + +import hs.kr.entrydsm.user.domain.admin.adapter.out.AdminJpaEntity +import org.springframework.data.jpa.repository.JpaRepository +import java.util.UUID + +/** + * 관리자 JPA 엔티티에 대한 데이터 액세스를 담당하는 리포지토리 인터페이스입니다. + */ +interface AdminRepository : JpaRepository { + /** + * 관리자 ID로 관리자를 조회합니다. + */ + fun findByAdminId(adminId: String): AdminJpaEntity? +} From 883adaa2cc3f844f6659d10144fea4ed3b55d03e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=A3=BC=EC=9B=90?= Date: Mon, 28 Jul 2025 15:12:52 +0900 Subject: [PATCH 09/13] =?UTF-8?q?feat=20(=20#14=20)=20:=20adapter/out=20jp?= =?UTF-8?q?aEntity=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/adapter/out/AdminJpaEntity.kt | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/adapter/out/AdminJpaEntity.kt diff --git a/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/adapter/out/AdminJpaEntity.kt b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/adapter/out/AdminJpaEntity.kt new file mode 100644 index 0000000..e685bd7 --- /dev/null +++ b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/adapter/out/AdminJpaEntity.kt @@ -0,0 +1,22 @@ +package hs.kr.entrydsm.user.domain.admin.adapter.out + +import hs.kr.entrydsm.user.global.base.BaseUUIDEntity +import jakarta.persistence.Column +import jakarta.persistence.Entity +import java.util.UUID + +/** + * 관리자 정보를 데이터베이스에 저장하기 위한 JPA 엔티티 클래스입니다. + * 데이터베이스의 tbl_admin 테이블과 매핑됩니다. + * + * @property adminId 관리자 로그인 ID + * @property password 해시화된 비밀번호 + */ +@Entity(name = "tbl_admin") +class AdminJpaEntity( + id: UUID?, + @Column(name = "admin_id", length = 15, nullable = false) + val adminId: String, + @Column(name = "password", length = 60, nullable = false) + val password: String, +) : BaseUUIDEntity(id) From 93f031cd6651fff96e2a8bb0d6b083829b45bd5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=A3=BC=EC=9B=90?= Date: Tue, 29 Jul 2025 17:57:37 +0900 Subject: [PATCH 10/13] =?UTF-8?q?refactor=20(=20#14=20)=20:=20mapstruct?= =?UTF-8?q?=EA=B0=80=20=EC=9E=90=EB=8F=99=20=EA=B5=AC=ED=98=84=ED=95=A0=20?= =?UTF-8?q?=EC=88=98=20=EC=9E=88=EB=8F=84=EB=A1=9D=20componentModel=20=3D?= =?UTF-8?q?=20"spring"=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/domain/admin/adapter/out/mapper/AdminMapper.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/adapter/out/mapper/AdminMapper.kt b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/adapter/out/mapper/AdminMapper.kt index ea55e46..43d9980 100644 --- a/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/adapter/out/mapper/AdminMapper.kt +++ b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/adapter/out/mapper/AdminMapper.kt @@ -8,7 +8,7 @@ import org.mapstruct.Mapper /** * Admin 도메인 모델과 AdminJpaEntity 간의 변환을 담당하는 매퍼 클래스입니다. */ -@Mapper +@Mapper(componentModel = "spring") abstract class AdminMapper : GenericMapper { abstract override fun toEntity(model: Admin): AdminJpaEntity From c3a2895e4cec3dc503a5a209f0cf12dc2dee8f94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=A3=BC=EC=9B=90?= Date: Tue, 29 Jul 2025 18:01:35 +0900 Subject: [PATCH 11/13] =?UTF-8?q?feat=20(=20#14=20)=20:=20=EB=88=84?= =?UTF-8?q?=EB=9D=BD=EB=90=9C=20kdoc=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/adapter/out/mapper/AdminMapper.kt | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/adapter/out/mapper/AdminMapper.kt b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/adapter/out/mapper/AdminMapper.kt index 43d9980..eff1ff8 100644 --- a/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/adapter/out/mapper/AdminMapper.kt +++ b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/adapter/out/mapper/AdminMapper.kt @@ -6,11 +6,24 @@ import hs.kr.entrydsm.user.global.mapper.GenericMapper import org.mapstruct.Mapper /** - * Admin 도메인 모델과 AdminJpaEntity 간의 변환을 담당하는 매퍼 클래스입니다. + * [Admin] 도메인 모델과 [AdminJpaEntity] JPA 엔티티 간의 변환을 담당하는 MapStruct 매퍼 클래스입니다. */ @Mapper(componentModel = "spring") abstract class AdminMapper : GenericMapper { + + /** + * 도메인 모델 [Admin]을 JPA 엔티티 [AdminJpaEntity]로 변환합니다. + * + * @param model 변환할 도메인 모델 + * @return 변환된 JPA 엔티티 + */ abstract override fun toEntity(model: Admin): AdminJpaEntity + /** + * JPA 엔티티 [AdminJpaEntity]를 도메인 모델 [Admin]로 변환합니다. + * + * @param entity 변환할 JPA 엔티티 (nullable) + * @return 변환된 도메인 모델 (nullable) + */ abstract override fun toModel(entity: AdminJpaEntity?): Admin? } From ed48eee18a2d82605d6a93111e910ca22af07bd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=A3=BC=EC=9B=90?= Date: Thu, 31 Jul 2025 17:01:57 +0900 Subject: [PATCH 12/13] =?UTF-8?q?chore=20(=20#14=20)=20:=20AdminWebAdapter?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/in/web/{AdminController.kt => AdminWebAdapter.kt} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/adapter/in/web/{AdminController.kt => AdminWebAdapter.kt} (99%) diff --git a/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/adapter/in/web/AdminController.kt b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/adapter/in/web/AdminWebAdapter.kt similarity index 99% rename from casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/adapter/in/web/AdminController.kt rename to casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/adapter/in/web/AdminWebAdapter.kt index 2da8a4e..58eb56c 100644 --- a/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/adapter/in/web/AdminController.kt +++ b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/adapter/in/web/AdminWebAdapter.kt @@ -24,7 +24,7 @@ import java.util.UUID */ @RestController @RequestMapping("/admin") -class AdminController( +class AdminWebAdapter( private val adminLoginUseCase: AdminLoginUseCase, private val adminTokenRefreshUseCase: AdminTokenRefreshUseCase, private val deleteAllTableUseCase: DeleteAllTableUseCase, From 3185bc6cf10fb94dd8d36e3fb664b94bcc97526f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=A3=BC=EC=9B=90?= Date: Thu, 31 Jul 2025 17:03:30 +0900 Subject: [PATCH 13/13] =?UTF-8?q?refactor=20(=20#14=20)=20:=20=EB=88=84?= =?UTF-8?q?=EB=9D=BD=EB=90=9C=20kdoc=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../out/persistence/AdminPersistenceAdapter.kt | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/adapter/out/persistence/AdminPersistenceAdapter.kt b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/adapter/out/persistence/AdminPersistenceAdapter.kt index 964ca50..d27a912 100644 --- a/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/adapter/out/persistence/AdminPersistenceAdapter.kt +++ b/casper-user/src/main/kotlin/hs/kr/entrydsm/user/domain/admin/adapter/out/persistence/AdminPersistenceAdapter.kt @@ -16,14 +16,31 @@ class AdminPersistenceAdapter( private val adminRepository: AdminRepository, private val adminMapper: AdminMapper, ) : AdminPort { + /** + * UUID를 이용하여 관리자 정보를 조회합니다. + * + * @param id 조회할 관리자의 UUID + * @return 조회된 관리자 정보, 존재하지 않을 경우 null + */ override fun findById(id: UUID): Admin? { return adminRepository.findByIdOrNull(id)?.let { adminMapper.toModel(it) } } + /** + * 관리자 ID를 이용하여 관리자 정보를 조회합니다. + * + * @param adminId 조회할 관리자의 ID + * @return 조회된 관리자 정보, 존재하지 않을 경우 null + */ override fun findByAdminId(adminId: String): Admin? { return adminRepository.findByAdminId(adminId)?.let { adminMapper.toModel(it) } } + /** + * 관리자 정보를 저장합니다. + * + * @param admin 저장할 관리자 정보 + */ override fun save(admin: Admin) { adminRepository.save(adminMapper.toEntity(admin)) }