From d5a0040589e6ce9a06a26be25dfe0e517e348b9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=A0=EA=B4=80=EA=B7=9C?= Date: Tue, 20 Jan 2026 21:08:57 +0900 Subject: [PATCH 01/14] =?UTF-8?q?feat:=20CreateAdminRequest=20JsonProperty?= =?UTF-8?q?=20=EC=96=B4=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../koin/admin/manager/dto/response/CreateAdminRequest.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/in/koreatech/koin/admin/manager/dto/response/CreateAdminRequest.java b/src/main/java/in/koreatech/koin/admin/manager/dto/response/CreateAdminRequest.java index e882146dd..8eabb0849 100644 --- a/src/main/java/in/koreatech/koin/admin/manager/dto/response/CreateAdminRequest.java +++ b/src/main/java/in/koreatech/koin/admin/manager/dto/response/CreateAdminRequest.java @@ -6,6 +6,7 @@ import org.springframework.security.crypto.password.PasswordEncoder; +import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonNaming; import in.koreatech.koin.admin.manager.enums.TeamType; @@ -34,10 +35,12 @@ public record CreateAdminRequest( @Schema(description = "트랙 타입", example = "BACKEND", requiredMode = REQUIRED) @NotNull(message = "트랙 타입을 입력해주세요.") + @JsonProperty(value = "track_name") TrackType trackType, @Schema(description = "팀 타입", example = "USER", requiredMode = REQUIRED) @NotNull(message = "팀 타입을 입력해주세요.") + @JsonProperty(value = "team_name") TeamType teamType ) { From 4b2948dd15810a41f507668a7c66bdb14aedb25a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=A0=EA=B4=80=EA=B7=9C?= Date: Tue, 20 Jan 2026 21:10:54 +0900 Subject: [PATCH 02/14] =?UTF-8?q?docs:=20=EC=96=B4=EB=93=9C=EB=AF=BC=20?= =?UTF-8?q?=ED=9A=8C=EC=9B=90=EA=B0=80=EC=9E=85=20API=20=EC=84=A4=EB=AA=85?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../koreatech/koin/admin/manager/controller/AdminApi.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/in/koreatech/koin/admin/manager/controller/AdminApi.java b/src/main/java/in/koreatech/koin/admin/manager/controller/AdminApi.java index a5a0e99fd..08ce74dc0 100644 --- a/src/main/java/in/koreatech/koin/admin/manager/controller/AdminApi.java +++ b/src/main/java/in/koreatech/koin/admin/manager/controller/AdminApi.java @@ -49,7 +49,13 @@ public interface AdminApi { @ApiResponse(responseCode = "409", content = @Content(schema = @Schema(hidden = true))), } ) - @Operation(summary = "어드민 회원가입") + @Operation(summary = "어드민 회원가입", description = """ + ### track_name + - ANDROID, BACKEND, FRONTEND, GAME, PM, PL, DESIGN, IOS, DA, SECURITY + + ### team_name + - KOIN, BUSINESS, CAMPUS, USER + """) @PostMapping("/admin") ResponseEntity createAdmin( @RequestBody @Valid CreateAdminRequest request, From 4c4656435c021c50e488c4c29cb36085b58ca4ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=A0=EA=B4=80=EA=B7=9C?= Date: Tue, 20 Jan 2026 21:13:17 +0900 Subject: [PATCH 03/14] =?UTF-8?q?fix:=20PUT=20/admin/{id}/authed=20?= =?UTF-8?q?=EA=B6=8C=ED=95=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../in/koreatech/koin/admin/manager/service/AdminService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/in/koreatech/koin/admin/manager/service/AdminService.java b/src/main/java/in/koreatech/koin/admin/manager/service/AdminService.java index 343d635cd..bdf4e4335 100644 --- a/src/main/java/in/koreatech/koin/admin/manager/service/AdminService.java +++ b/src/main/java/in/koreatech/koin/admin/manager/service/AdminService.java @@ -108,7 +108,7 @@ public AdminsResponse getAdmins(AdminsCondition adminsCondition) { @Transactional public void adminAuthenticate(Integer id, Integer adminId) { Admin admin = adminRepository.getById(adminId); - if (!admin.isSuperAdmin()) { + if (!admin.isCanCreateAdmin() || !admin.isSuperAdmin()) { throw new AuthorizationException("어드민 승인 권한이 없습니다."); } From 2183abc702eaf1b6722aaf444f92af10bb5b45e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=A0=EA=B4=80=EA=B7=9C?= Date: Tue, 20 Jan 2026 21:21:49 +0900 Subject: [PATCH 04/14] =?UTF-8?q?fix:=20PUT=20/admin/{id}/authed=20?= =?UTF-8?q?=EC=9A=94=EC=B2=AD=20=EB=B0=94=EB=94=94=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EB=B0=8F=20=EB=82=B4=EB=B6=80=20=EB=A1=9C=EC=A7=81=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../koin/admin/manager/controller/AdminApi.java | 2 ++ .../manager/controller/AdminController.java | 4 +++- .../AdminAuthenticationStatusUpdateRequest.java | 17 +++++++++++++++++ .../admin/manager/service/AdminService.java | 5 +++-- .../koreatech/koin/domain/user/model/User.java | 4 ++++ 5 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 src/main/java/in/koreatech/koin/admin/manager/dto/request/AdminAuthenticationStatusUpdateRequest.java diff --git a/src/main/java/in/koreatech/koin/admin/manager/controller/AdminApi.java b/src/main/java/in/koreatech/koin/admin/manager/controller/AdminApi.java index 08ce74dc0..42b2a7b54 100644 --- a/src/main/java/in/koreatech/koin/admin/manager/controller/AdminApi.java +++ b/src/main/java/in/koreatech/koin/admin/manager/controller/AdminApi.java @@ -14,6 +14,7 @@ import in.koreatech.koin.admin.abtest.useragent.UserAgentInfo; import in.koreatech.koin.admin.history.aop.AdminActivityLogging; import in.koreatech.koin.admin.history.enums.DomainType; +import in.koreatech.koin.admin.manager.dto.request.AdminAuthenticationStatusUpdateRequest; import in.koreatech.koin.admin.manager.dto.request.AdminLoginRequest; import in.koreatech.koin.admin.manager.dto.request.AdminPasswordChangeRequest; import in.koreatech.koin.admin.manager.dto.request.AdminPermissionUpdateRequest; @@ -184,6 +185,7 @@ ResponseEntity getAdmins( @PutMapping("/admin/{id}/authed") @AdminActivityLogging(domain = DomainType.ADMIN, domainIdParam = "id") ResponseEntity adminAuthenticate( + @RequestBody @Valid AdminAuthenticationStatusUpdateRequest request, @PathVariable Integer id, @Auth(permit = {ADMIN}) Integer adminId ); diff --git a/src/main/java/in/koreatech/koin/admin/manager/controller/AdminController.java b/src/main/java/in/koreatech/koin/admin/manager/controller/AdminController.java index 7968c013d..5e6a6badc 100644 --- a/src/main/java/in/koreatech/koin/admin/manager/controller/AdminController.java +++ b/src/main/java/in/koreatech/koin/admin/manager/controller/AdminController.java @@ -17,6 +17,7 @@ import in.koreatech.koin.admin.abtest.useragent.UserAgentInfo; import in.koreatech.koin.admin.history.aop.AdminActivityLogging; import in.koreatech.koin.admin.history.enums.DomainType; +import in.koreatech.koin.admin.manager.dto.request.AdminAuthenticationStatusUpdateRequest; import in.koreatech.koin.admin.manager.dto.request.AdminLoginRequest; import in.koreatech.koin.admin.manager.dto.request.AdminPasswordChangeRequest; import in.koreatech.koin.admin.manager.dto.request.AdminPermissionUpdateRequest; @@ -122,10 +123,11 @@ public ResponseEntity getAdmins( @PutMapping("/admin/{id}/authed") @AdminActivityLogging(domain = DomainType.ADMIN, domainIdParam = "id") public ResponseEntity adminAuthenticate( + @RequestBody @Valid AdminAuthenticationStatusUpdateRequest request, @PathVariable Integer id, @Auth(permit = {ADMIN}) Integer adminId ) { - adminService.adminAuthenticate(id, adminId); + adminService.adminAuthenticate(request, id, adminId); return ResponseEntity.ok().build(); } diff --git a/src/main/java/in/koreatech/koin/admin/manager/dto/request/AdminAuthenticationStatusUpdateRequest.java b/src/main/java/in/koreatech/koin/admin/manager/dto/request/AdminAuthenticationStatusUpdateRequest.java new file mode 100644 index 000000000..ba723775f --- /dev/null +++ b/src/main/java/in/koreatech/koin/admin/manager/dto/request/AdminAuthenticationStatusUpdateRequest.java @@ -0,0 +1,17 @@ +package in.koreatech.koin.admin.manager.dto.request; + +import static com.fasterxml.jackson.databind.PropertyNamingStrategies.SnakeCaseStrategy; +import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; + +import com.fasterxml.jackson.databind.annotation.JsonNaming; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +@JsonNaming(value = SnakeCaseStrategy.class) +public record AdminAuthenticationStatusUpdateRequest( + @Schema(description = "인증 상태", example = "true", requiredMode = REQUIRED) + @NotNull(message = "인증 상태는 필수 입력 사항입니다.") + Boolean isAuthed +) { +} diff --git a/src/main/java/in/koreatech/koin/admin/manager/service/AdminService.java b/src/main/java/in/koreatech/koin/admin/manager/service/AdminService.java index bdf4e4335..1a4292e3e 100644 --- a/src/main/java/in/koreatech/koin/admin/manager/service/AdminService.java +++ b/src/main/java/in/koreatech/koin/admin/manager/service/AdminService.java @@ -9,6 +9,7 @@ import org.springframework.transaction.annotation.Transactional; import in.koreatech.koin.admin.abtest.useragent.UserAgentInfo; +import in.koreatech.koin.admin.manager.dto.request.AdminAuthenticationStatusUpdateRequest; import in.koreatech.koin.admin.manager.dto.request.AdminLoginRequest; import in.koreatech.koin.admin.manager.dto.request.AdminPasswordChangeRequest; import in.koreatech.koin.admin.manager.dto.request.AdminPermissionUpdateRequest; @@ -106,14 +107,14 @@ public AdminsResponse getAdmins(AdminsCondition adminsCondition) { } @Transactional - public void adminAuthenticate(Integer id, Integer adminId) { + public void adminAuthenticate(AdminAuthenticationStatusUpdateRequest request, Integer id, Integer adminId) { Admin admin = adminRepository.getById(adminId); if (!admin.isCanCreateAdmin() || !admin.isSuperAdmin()) { throw new AuthorizationException("어드민 승인 권한이 없습니다."); } User user = adminRepository.getById(id).getUser(); - user.permitAuth(); + user.updateAuthenticationStatus(request.isAuthed()); } @Transactional diff --git a/src/main/java/in/koreatech/koin/domain/user/model/User.java b/src/main/java/in/koreatech/koin/domain/user/model/User.java index 97089bbc1..4775d2a56 100644 --- a/src/main/java/in/koreatech/koin/domain/user/model/User.java +++ b/src/main/java/in/koreatech/koin/domain/user/model/User.java @@ -195,6 +195,10 @@ public void permitAuth() { this.isAuthed = true; } + public void updateAuthenticationStatus(boolean isAuthed) { + this.isAuthed = isAuthed; + } + public void permitNotification(String deviceToken) { this.deviceToken = deviceToken; } From 4d5ab73ed828b5d784a39ca52b2c8d76ccb01c87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=A0=EA=B4=80=EA=B7=9C?= Date: Tue, 20 Jan 2026 21:22:50 +0900 Subject: [PATCH 05/14] =?UTF-8?q?feat:=20AdminUpdateRequest=20JsonProperty?= =?UTF-8?q?=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../koin/admin/manager/dto/request/AdminUpdateRequest.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/in/koreatech/koin/admin/manager/dto/request/AdminUpdateRequest.java b/src/main/java/in/koreatech/koin/admin/manager/dto/request/AdminUpdateRequest.java index 8f0efd2a8..40e661e55 100644 --- a/src/main/java/in/koreatech/koin/admin/manager/dto/request/AdminUpdateRequest.java +++ b/src/main/java/in/koreatech/koin/admin/manager/dto/request/AdminUpdateRequest.java @@ -3,6 +3,7 @@ import static com.fasterxml.jackson.databind.PropertyNamingStrategies.SnakeCaseStrategy; import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; +import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonNaming; import in.koreatech.koin.admin.manager.enums.TeamType; @@ -19,10 +20,12 @@ public record AdminUpdateRequest( @Schema(description = "트랙 타입", example = "BACKEND", requiredMode = REQUIRED) @NotNull(message = "트랙 타입은 필수 입력 사항입니다.") + @JsonProperty(value = "track_name") TrackType trackType, @Schema(description = "팀 타입", example = "USER", requiredMode = REQUIRED) @NotNull(message = "팀 타입은 필수 입력 사항입니다.") + @JsonProperty(value = "team_name") TeamType teamType ) { } From 400dcbe399f78af9a6bfcee15bf400ea14834bf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=A0=EA=B4=80=EA=B7=9C?= Date: Tue, 20 Jan 2026 21:24:28 +0900 Subject: [PATCH 06/14] =?UTF-8?q?fix:=20TeamType=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/manager/dto/request/AdminUpdateRequest.java | 8 +------- .../manager/dto/response/CreateAdminRequest.java | 11 +++-------- .../in/koreatech/koin/admin/manager/model/Admin.java | 3 +-- .../koin/admin/manager/service/AdminService.java | 2 +- 4 files changed, 6 insertions(+), 18 deletions(-) diff --git a/src/main/java/in/koreatech/koin/admin/manager/dto/request/AdminUpdateRequest.java b/src/main/java/in/koreatech/koin/admin/manager/dto/request/AdminUpdateRequest.java index 40e661e55..601b3c797 100644 --- a/src/main/java/in/koreatech/koin/admin/manager/dto/request/AdminUpdateRequest.java +++ b/src/main/java/in/koreatech/koin/admin/manager/dto/request/AdminUpdateRequest.java @@ -6,7 +6,6 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonNaming; -import in.koreatech.koin.admin.manager.enums.TeamType; import in.koreatech.koin.admin.manager.enums.TrackType; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; @@ -21,11 +20,6 @@ public record AdminUpdateRequest( @Schema(description = "트랙 타입", example = "BACKEND", requiredMode = REQUIRED) @NotNull(message = "트랙 타입은 필수 입력 사항입니다.") @JsonProperty(value = "track_name") - TrackType trackType, - - @Schema(description = "팀 타입", example = "USER", requiredMode = REQUIRED) - @NotNull(message = "팀 타입은 필수 입력 사항입니다.") - @JsonProperty(value = "team_name") - TeamType teamType + TrackType trackType ) { } diff --git a/src/main/java/in/koreatech/koin/admin/manager/dto/response/CreateAdminRequest.java b/src/main/java/in/koreatech/koin/admin/manager/dto/response/CreateAdminRequest.java index 8eabb0849..7d9bb3c6f 100644 --- a/src/main/java/in/koreatech/koin/admin/manager/dto/response/CreateAdminRequest.java +++ b/src/main/java/in/koreatech/koin/admin/manager/dto/response/CreateAdminRequest.java @@ -1,6 +1,7 @@ package in.koreatech.koin.admin.manager.dto.response; import static com.fasterxml.jackson.databind.PropertyNamingStrategies.SnakeCaseStrategy; +import static in.koreatech.koin.admin.manager.enums.TeamType.KOIN; import static in.koreatech.koin.domain.user.model.UserType.ADMIN; import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; @@ -9,7 +10,6 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonNaming; -import in.koreatech.koin.admin.manager.enums.TeamType; import in.koreatech.koin.admin.manager.enums.TrackType; import in.koreatech.koin.admin.manager.model.Admin; import in.koreatech.koin.domain.user.model.User; @@ -36,12 +36,7 @@ public record CreateAdminRequest( @Schema(description = "트랙 타입", example = "BACKEND", requiredMode = REQUIRED) @NotNull(message = "트랙 타입을 입력해주세요.") @JsonProperty(value = "track_name") - TrackType trackType, - - @Schema(description = "팀 타입", example = "USER", requiredMode = REQUIRED) - @NotNull(message = "팀 타입을 입력해주세요.") - @JsonProperty(value = "team_name") - TeamType teamType + TrackType trackType ) { public Admin toAdmin(PasswordEncoder passwordEncoder) { @@ -58,7 +53,7 @@ public Admin toAdmin(PasswordEncoder passwordEncoder) { .email(email) .loginId(loginId) .trackType(trackType) - .teamType(teamType) + .teamType(KOIN) .user(user) .build(); } diff --git a/src/main/java/in/koreatech/koin/admin/manager/model/Admin.java b/src/main/java/in/koreatech/koin/admin/manager/model/Admin.java index d1f82f517..d4fd09045 100644 --- a/src/main/java/in/koreatech/koin/admin/manager/model/Admin.java +++ b/src/main/java/in/koreatech/koin/admin/manager/model/Admin.java @@ -82,8 +82,7 @@ private Admin( this.user = user; } - public void updateTeamTrack(TeamType teamName, TrackType trackName) { - this.teamType = teamName; + public void updateTrack(TrackType trackName) { this.trackType = trackName; } diff --git a/src/main/java/in/koreatech/koin/admin/manager/service/AdminService.java b/src/main/java/in/koreatech/koin/admin/manager/service/AdminService.java index 1a4292e3e..49515d806 100644 --- a/src/main/java/in/koreatech/koin/admin/manager/service/AdminService.java +++ b/src/main/java/in/koreatech/koin/admin/manager/service/AdminService.java @@ -123,7 +123,7 @@ public void updateAdmin(AdminUpdateRequest request, Integer id) { User user = admin.getUser(); user.updateName(request.name()); - admin.updateTeamTrack(request.teamType(), request.trackType()); + admin.updateTrack(request.trackType()); } @Transactional From 56f0bb731ab50067233c34ece7cbb515c5ae34a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=A0=EA=B4=80=EA=B7=9C?= Date: Tue, 20 Jan 2026 21:25:55 +0900 Subject: [PATCH 07/14] =?UTF-8?q?fix:=20canCreateAdmin=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manager/dto/request/AdminPermissionUpdateRequest.java | 4 ---- .../java/in/koreatech/koin/admin/manager/model/Admin.java | 3 +-- .../koreatech/koin/admin/manager/service/AdminService.java | 6 +++--- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/src/main/java/in/koreatech/koin/admin/manager/dto/request/AdminPermissionUpdateRequest.java b/src/main/java/in/koreatech/koin/admin/manager/dto/request/AdminPermissionUpdateRequest.java index 6ec54d752..ea752694e 100644 --- a/src/main/java/in/koreatech/koin/admin/manager/dto/request/AdminPermissionUpdateRequest.java +++ b/src/main/java/in/koreatech/koin/admin/manager/dto/request/AdminPermissionUpdateRequest.java @@ -10,10 +10,6 @@ @JsonNaming(value = SnakeCaseStrategy.class) public record AdminPermissionUpdateRequest( - @Schema(description = "어드민 생성 권한", example = "false", requiredMode = REQUIRED) - @NotNull(message = "어드민 생성 권한은 필수 입력 사항입니다") - Boolean canCreateAdmin, - @Schema(description = "슈퍼 어드민 권한", example = "false", requiredMode = REQUIRED) @NotNull(message = "슈퍼 어드민 권한은 필수 입력 사항입니다") Boolean superAdmin diff --git a/src/main/java/in/koreatech/koin/admin/manager/model/Admin.java b/src/main/java/in/koreatech/koin/admin/manager/model/Admin.java index d4fd09045..c5da8fba3 100644 --- a/src/main/java/in/koreatech/koin/admin/manager/model/Admin.java +++ b/src/main/java/in/koreatech/koin/admin/manager/model/Admin.java @@ -87,8 +87,7 @@ public void updateTrack(TrackType trackName) { } /* 어드민 권한이 추가 되면, 해당 메소드에도 추가해야 합니다. */ - public void updatePermission(boolean canCreateAdmin, boolean superAdmin) { - this.canCreateAdmin = canCreateAdmin; + public void updatePermission(boolean superAdmin) { this.superAdmin = superAdmin; } } diff --git a/src/main/java/in/koreatech/koin/admin/manager/service/AdminService.java b/src/main/java/in/koreatech/koin/admin/manager/service/AdminService.java index 49515d806..51c6412ca 100644 --- a/src/main/java/in/koreatech/koin/admin/manager/service/AdminService.java +++ b/src/main/java/in/koreatech/koin/admin/manager/service/AdminService.java @@ -46,7 +46,7 @@ public class AdminService { @Transactional public AdminResponse createAdmin(CreateAdminRequest request, Integer adminId) { Admin admin = adminRepository.getById(adminId); - if (!admin.isCanCreateAdmin() || !admin.isSuperAdmin()) { + if (!admin.isSuperAdmin()) { throw new AuthorizationException("어드민 계정 생성 권한이 없습니다."); } @@ -109,7 +109,7 @@ public AdminsResponse getAdmins(AdminsCondition adminsCondition) { @Transactional public void adminAuthenticate(AdminAuthenticationStatusUpdateRequest request, Integer id, Integer adminId) { Admin admin = adminRepository.getById(adminId); - if (!admin.isCanCreateAdmin() || !admin.isSuperAdmin()) { + if (!admin.isSuperAdmin()) { throw new AuthorizationException("어드민 승인 권한이 없습니다."); } @@ -133,6 +133,6 @@ public void updateAdminPermission(AdminPermissionUpdateRequest request, Integer throw new AuthorizationException("슈퍼 어드민 권한이 없습니다."); } - adminRepository.getById(id).updatePermission(request.canCreateAdmin(), request.superAdmin()); + adminRepository.getById(id).updatePermission(request.superAdmin()); } } From 0ed40a6ce3ee95c422f2f04eb7989157558e200c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=A0=EA=B4=80=EA=B7=9C?= Date: Tue, 20 Jan 2026 21:26:58 +0900 Subject: [PATCH 08/14] =?UTF-8?q?fix:=20AdminResponse=20=EC=9D=91=EB=8B=B5?= =?UTF-8?q?=EA=B0=92=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../koin/admin/manager/dto/response/AdminResponse.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/main/java/in/koreatech/koin/admin/manager/dto/response/AdminResponse.java b/src/main/java/in/koreatech/koin/admin/manager/dto/response/AdminResponse.java index 66883086a..0aceb649c 100644 --- a/src/main/java/in/koreatech/koin/admin/manager/dto/response/AdminResponse.java +++ b/src/main/java/in/koreatech/koin/admin/manager/dto/response/AdminResponse.java @@ -23,12 +23,6 @@ public record AdminResponse( @Schema(description = "트랙 이름", example = "Backend", requiredMode = REQUIRED) String trackName, - @Schema(description = "팀 이름", example = "User", requiredMode = REQUIRED) - String teamName, - - @Schema(description = "어드민 생성 권한", example = "false", requiredMode = REQUIRED) - Boolean canCreateAdmin, - @Schema(description = "슈퍼 어드민 권한", example = "false", requiredMode = REQUIRED) Boolean superAdmin ) { @@ -40,8 +34,6 @@ public static AdminResponse from(Admin admin) { admin.getEmail(), user.getName(), admin.getTrackType().getValue(), - admin.getTeamType().getValue(), - admin.isCanCreateAdmin(), admin.isSuperAdmin() ); } From ff34633a36a1215f62f0da0440027783ebda7eed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=A0=EA=B4=80=EA=B7=9C?= Date: Tue, 20 Jan 2026 21:27:39 +0900 Subject: [PATCH 09/14] =?UTF-8?q?fix:=20AdminsResponse=20=EC=9D=91?= =?UTF-8?q?=EB=8B=B5=EA=B0=92=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../koin/admin/manager/dto/response/AdminsResponse.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/main/java/in/koreatech/koin/admin/manager/dto/response/AdminsResponse.java b/src/main/java/in/koreatech/koin/admin/manager/dto/response/AdminsResponse.java index ca43dc011..b64464f5e 100644 --- a/src/main/java/in/koreatech/koin/admin/manager/dto/response/AdminsResponse.java +++ b/src/main/java/in/koreatech/koin/admin/manager/dto/response/AdminsResponse.java @@ -45,12 +45,6 @@ public record InnerAdminsResponse( @Schema(description = "트랙 이름", example = "Backend", requiredMode = REQUIRED) String trackName, - @Schema(description = "팀 이름", example = "User", requiredMode = REQUIRED) - String teamName, - - @Schema(description = "어드민 생성 권한", example = "false", requiredMode = REQUIRED) - Boolean canCreateAdmin, - @Schema(description = "슈퍼 어드민 권한", example = "false", requiredMode = REQUIRED) Boolean superAdmin ) { @@ -62,8 +56,6 @@ public static InnerAdminsResponse from(Admin admin) { admin.getEmail(), user.getName(), admin.getTrackType().getValue(), - admin.getTeamType().getValue(), - admin.isCanCreateAdmin(), admin.isSuperAdmin() ); } From b021e5cd4ecc1009ba3d7f6dc6ad60f3278215bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=A0=EA=B4=80=EA=B7=9C?= Date: Tue, 20 Jan 2026 21:39:11 +0900 Subject: [PATCH 10/14] =?UTF-8?q?feat:=20=EC=96=B4=EB=93=9C=EB=AF=BC=20?= =?UTF-8?q?=EA=B3=84=EC=A0=95=20=EC=83=9D=EC=84=B1=20=EC=9D=B4=EB=B2=A4?= =?UTF-8?q?=ED=8A=B8=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/manager/service/AdminService.java | 9 ++++++ .../koin/common/event/AdminRegisterEvent.java | 10 ++++++ .../eventlistener/AdminEventListener.java | 32 +++++++++++++++++++ .../slack/model/SlackNotificationFactory.java | 17 ++++++++++ 4 files changed, 68 insertions(+) create mode 100644 src/main/java/in/koreatech/koin/common/event/AdminRegisterEvent.java create mode 100644 src/main/java/in/koreatech/koin/infrastructure/slack/eventlistener/AdminEventListener.java diff --git a/src/main/java/in/koreatech/koin/admin/manager/service/AdminService.java b/src/main/java/in/koreatech/koin/admin/manager/service/AdminService.java index 51c6412ca..51b37bbde 100644 --- a/src/main/java/in/koreatech/koin/admin/manager/service/AdminService.java +++ b/src/main/java/in/koreatech/koin/admin/manager/service/AdminService.java @@ -2,6 +2,7 @@ import java.time.LocalDateTime; +import org.springframework.context.ApplicationEventPublisher; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.security.crypto.password.PasswordEncoder; @@ -24,6 +25,7 @@ import in.koreatech.koin.admin.manager.model.Admin; import in.koreatech.koin.admin.manager.repository.AdminRepository; import in.koreatech.koin.admin.user.repository.AdminUserRepository; +import in.koreatech.koin.common.event.AdminRegisterEvent; import in.koreatech.koin.common.model.Criteria; import in.koreatech.koin.domain.user.model.User; import in.koreatech.koin.domain.user.service.RefreshTokenService; @@ -42,6 +44,7 @@ public class AdminService { private final AdminValidation adminValidation; private final RefreshTokenService refreshTokenService; private final AdminUserRepository adminUserRepository; + private final ApplicationEventPublisher applicationEventPublisher; @Transactional public AdminResponse createAdmin(CreateAdminRequest request, Integer adminId) { @@ -53,6 +56,12 @@ public AdminResponse createAdmin(CreateAdminRequest request, Integer adminId) { adminValidation.validateEmailForAdminCreated(request.email()); Admin savedAdmin = adminRepository.save(request.toAdmin(passwordEncoder)); + applicationEventPublisher.publishEvent(new AdminRegisterEvent( + admin.getLoginId(), + admin.getUser().getName(), + savedAdmin.getLoginId(), + savedAdmin.getUser().getName() + )); return AdminResponse.from(savedAdmin); } diff --git a/src/main/java/in/koreatech/koin/common/event/AdminRegisterEvent.java b/src/main/java/in/koreatech/koin/common/event/AdminRegisterEvent.java new file mode 100644 index 000000000..9549e0761 --- /dev/null +++ b/src/main/java/in/koreatech/koin/common/event/AdminRegisterEvent.java @@ -0,0 +1,10 @@ +package in.koreatech.koin.common.event; + +public record AdminRegisterEvent( + String creatorId, + String creatorName, + String newAdminId, + String newAdminName +) { + +} diff --git a/src/main/java/in/koreatech/koin/infrastructure/slack/eventlistener/AdminEventListener.java b/src/main/java/in/koreatech/koin/infrastructure/slack/eventlistener/AdminEventListener.java new file mode 100644 index 000000000..24f1cbb8d --- /dev/null +++ b/src/main/java/in/koreatech/koin/infrastructure/slack/eventlistener/AdminEventListener.java @@ -0,0 +1,32 @@ +package in.koreatech.koin.infrastructure.slack.eventlistener; + +import org.springframework.context.annotation.Profile; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; +import org.springframework.transaction.event.TransactionalEventListener; + +import in.koreatech.koin.common.event.AdminRegisterEvent; +import in.koreatech.koin.infrastructure.slack.client.SlackClient; +import in.koreatech.koin.infrastructure.slack.model.SlackNotificationFactory; +import lombok.RequiredArgsConstructor; + +@Component +@Profile("!test") +@RequiredArgsConstructor +public class AdminEventListener { + + private final SlackClient slackClient; + private final SlackNotificationFactory slackNotificationFactory; + + @Async + @TransactionalEventListener + public void onAdminRegisterEvent(AdminRegisterEvent event) { + var notification = slackNotificationFactory.generateAdminCreateSendNotification( + event.creatorId(), + event.creatorName(), + event.newAdminId(), + event.newAdminName() + ); + slackClient.sendMessage(notification); + } +} diff --git a/src/main/java/in/koreatech/koin/infrastructure/slack/model/SlackNotificationFactory.java b/src/main/java/in/koreatech/koin/infrastructure/slack/model/SlackNotificationFactory.java index 8c418fc1b..f9de6df06 100644 --- a/src/main/java/in/koreatech/koin/infrastructure/slack/model/SlackNotificationFactory.java +++ b/src/main/java/in/koreatech/koin/infrastructure/slack/model/SlackNotificationFactory.java @@ -249,4 +249,21 @@ public SlackNotification generateClubCreateSendNotification( ) .build(); } + + /** + * 코인 어드민 생성 알림 + */ + public SlackNotification generateAdminCreateSendNotification( + String creatorId, + String creatorName, + String newAdminId, + String newAdminName + ) { + return SlackNotification.builder() + .slackUrl(eventNotificationUrl) + .text(String.format(""" + `%s(%s)님이 %s(%s) 어드민 계정을 생성했습니다.` + """, creatorName, creatorId, newAdminName, newAdminId)) + .build(); + } } From 830c33cccf3a00b1531ef2d66eacafef3d6e4a42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=A0=EA=B4=80=EA=B7=9C?= Date: Tue, 20 Jan 2026 21:53:27 +0900 Subject: [PATCH 11/14] =?UTF-8?q?test:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../acceptance/admin/AdminManagerApiTest.java | 38 ++++++++++--------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/src/test/java/in/koreatech/koin/acceptance/admin/AdminManagerApiTest.java b/src/test/java/in/koreatech/koin/acceptance/admin/AdminManagerApiTest.java index ba9fa0ef2..c437af92a 100644 --- a/src/test/java/in/koreatech/koin/acceptance/admin/AdminManagerApiTest.java +++ b/src/test/java/in/koreatech/koin/acceptance/admin/AdminManagerApiTest.java @@ -163,8 +163,7 @@ void setup() { "email": "koin01234@koreatech.ac.kr", "password": "cd06f8c2b0dd065faf6ef910c7f15934363df71c33740fd245590665286ed268", "name": "신관규", - "track_type": "BACKEND", - "team_type": "USER" + "track_name": "BACKEND" } """) .contentType(MediaType.APPLICATION_JSON) @@ -185,8 +184,7 @@ void setup() { "email": "koin12345@koreatech.ac.kr", "password": "cd06f8c2b0dd065faf6ef910c7f15934363df71c33740fd245590665286ed268", "name": "신관규", - "track_type": "BACKEND", - "team_type": "USER" + "track_name": "BACKEND" } """) .contentType(MediaType.APPLICATION_JSON) @@ -207,8 +205,7 @@ void setup() { "account": "admin123456@koreatech.ac.kr", "password": "cd06f8c2b0dd065faf6ef910c7f15934363df71c33740fd245590665286ed268", "name": "신관규", - "track_type": "BACKEND", - "team_type": "USER" + "track_name": "BACKEND" } """) .contentType(MediaType.APPLICATION_JSON) @@ -234,8 +231,6 @@ void setup() { "email": "koinadmin1@koreatech.ac.kr", "name": "테스트용_코인운영자", "track_name": "Backend", - "team_name": "Business", - "can_create_admin": false, "super_admin": false } """, admin1.getId()))); @@ -265,27 +260,21 @@ void setup() { "id": %d, "email": "juno@koreatech.ac.kr", "name": "테스트용_코인운영자", - "team_name": "User", "track_name": "Backend", - "can_create_admin": true, "super_admin": true }, { "id": %d, "email": "koinadmin1@koreatech.ac.kr", "name": "테스트용_코인운영자", - "team_name": "Business", "track_name": "Backend", - "can_create_admin": false, "super_admin": false }, { "id": %d, "email": "koinadmin2@koreatech.ac.kr", "name": "테스트용_코인운영자", - "team_name": "Campus", "track_name": "Backend", - "can_create_admin": true, "super_admin": false } ] @@ -302,6 +291,12 @@ void setup() { mockMvc.perform( put("/admin/{id}/authed", admin1.getId()) .header("Authorization", "Bearer " + token) + .contentType(MediaType.APPLICATION_JSON) + .content(""" + { + "is_authed": true + } + """) ) .andExpect(status().isOk()); @@ -310,15 +305,24 @@ void setup() { } @Test - void 관리자가_관리자_계정_권한을_승인한다() throws Exception { - Admin admin = userFixture.영희_운영자(); + void 슈퍼_관리자가_관리자_계정_권한을_비활성화한다() throws Exception { + Admin admin = userFixture.코인_운영자(); String token = userFixture.getToken(admin.getUser()); Admin admin1 = userFixture.진구_운영자(); mockMvc.perform( put("/admin/{id}/authed", admin1.getId()) .header("Authorization", "Bearer " + token) + .contentType(MediaType.APPLICATION_JSON) + .content(""" + { + "is_authed": false + } + """) ) - .andExpect(status().isForbidden()); + .andExpect(status().isOk()); + + Admin updateAdmin = adminRepository.getById(admin1.getId()); + assertThat(updateAdmin.getUser().isAuthed()).isFalse(); } } From 09343e659361f891dc63ecee5ce0d8ffcf11c3d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=A0=EA=B4=80=EA=B7=9C?= Date: Tue, 20 Jan 2026 21:54:56 +0900 Subject: [PATCH 12/14] =?UTF-8?q?feat:=20=EC=96=B4=EB=93=9C=EB=AF=BC=20?= =?UTF-8?q?=EC=9D=B8=EC=A6=9D=20=EC=83=81=ED=83=9C=20=EC=9D=B4=EB=B2=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=95=8C=EB=A6=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/manager/service/AdminService.java | 12 +++++++++++- .../AdminAuthenticationStatusChangeEvent.java | 11 +++++++++++ .../eventlistener/AdminEventListener.java | 14 ++++++++++++++ .../slack/model/SlackNotificationFactory.java | 19 +++++++++++++++++++ 4 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 src/main/java/in/koreatech/koin/common/event/AdminAuthenticationStatusChangeEvent.java diff --git a/src/main/java/in/koreatech/koin/admin/manager/service/AdminService.java b/src/main/java/in/koreatech/koin/admin/manager/service/AdminService.java index 51b37bbde..b9fdd7ba5 100644 --- a/src/main/java/in/koreatech/koin/admin/manager/service/AdminService.java +++ b/src/main/java/in/koreatech/koin/admin/manager/service/AdminService.java @@ -25,6 +25,7 @@ import in.koreatech.koin.admin.manager.model.Admin; import in.koreatech.koin.admin.manager.repository.AdminRepository; import in.koreatech.koin.admin.user.repository.AdminUserRepository; +import in.koreatech.koin.common.event.AdminAuthenticationStatusChangeEvent; import in.koreatech.koin.common.event.AdminRegisterEvent; import in.koreatech.koin.common.model.Criteria; import in.koreatech.koin.domain.user.model.User; @@ -122,8 +123,17 @@ public void adminAuthenticate(AdminAuthenticationStatusUpdateRequest request, In throw new AuthorizationException("어드민 승인 권한이 없습니다."); } - User user = adminRepository.getById(id).getUser(); + Admin targetAdmin = adminRepository.getById(id); + User user = targetAdmin.getUser(); user.updateAuthenticationStatus(request.isAuthed()); + + applicationEventPublisher.publishEvent(new AdminAuthenticationStatusChangeEvent( + admin.getLoginId(), + admin.getUser().getName(), + targetAdmin.getLoginId(), + targetAdmin.getUser().getName(), + request.isAuthed() + )); } @Transactional diff --git a/src/main/java/in/koreatech/koin/common/event/AdminAuthenticationStatusChangeEvent.java b/src/main/java/in/koreatech/koin/common/event/AdminAuthenticationStatusChangeEvent.java new file mode 100644 index 000000000..54bdb3811 --- /dev/null +++ b/src/main/java/in/koreatech/koin/common/event/AdminAuthenticationStatusChangeEvent.java @@ -0,0 +1,11 @@ +package in.koreatech.koin.common.event; + +public record AdminAuthenticationStatusChangeEvent( + String changedByAdminId, + String changedByAdminName, + String targetAdminId, + String targetAdminName, + Boolean isAuthed +) { + +} diff --git a/src/main/java/in/koreatech/koin/infrastructure/slack/eventlistener/AdminEventListener.java b/src/main/java/in/koreatech/koin/infrastructure/slack/eventlistener/AdminEventListener.java index 24f1cbb8d..bcfaafc3b 100644 --- a/src/main/java/in/koreatech/koin/infrastructure/slack/eventlistener/AdminEventListener.java +++ b/src/main/java/in/koreatech/koin/infrastructure/slack/eventlistener/AdminEventListener.java @@ -5,6 +5,7 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.event.TransactionalEventListener; +import in.koreatech.koin.common.event.AdminAuthenticationStatusChangeEvent; import in.koreatech.koin.common.event.AdminRegisterEvent; import in.koreatech.koin.infrastructure.slack.client.SlackClient; import in.koreatech.koin.infrastructure.slack.model.SlackNotificationFactory; @@ -29,4 +30,17 @@ public void onAdminRegisterEvent(AdminRegisterEvent event) { ); slackClient.sendMessage(notification); } + + @Async + @TransactionalEventListener + public void onAdminAuthenticationStatusChangeEvent(AdminAuthenticationStatusChangeEvent event) { + var notification = slackNotificationFactory.generateAdminAuthenticationStatusChangeSendNotification( + event.changedByAdminId(), + event.changedByAdminName(), + event.targetAdminId(), + event.targetAdminName(), + event.isAuthed() + ); + slackClient.sendMessage(notification); + } } diff --git a/src/main/java/in/koreatech/koin/infrastructure/slack/model/SlackNotificationFactory.java b/src/main/java/in/koreatech/koin/infrastructure/slack/model/SlackNotificationFactory.java index f9de6df06..9b543c06a 100644 --- a/src/main/java/in/koreatech/koin/infrastructure/slack/model/SlackNotificationFactory.java +++ b/src/main/java/in/koreatech/koin/infrastructure/slack/model/SlackNotificationFactory.java @@ -266,4 +266,23 @@ public SlackNotification generateAdminCreateSendNotification( """, creatorName, creatorId, newAdminName, newAdminId)) .build(); } + + /** + * 코인 어드민 인증 상태 변경 알림 + */ + public SlackNotification generateAdminAuthenticationStatusChangeSendNotification( + String changedByAdminId, + String changedByAdminName, + String targetAdminId, + String targetAdminName, + Boolean isAuthed + ) { + String action = isAuthed ? "활성화" : "비활성화"; + return SlackNotification.builder() + .slackUrl(eventNotificationUrl) + .text(String.format(""" + `%s(%s)님이 %s(%s) 어드민 계정을 %s했습니다.` + """, changedByAdminName, changedByAdminId, targetAdminName, targetAdminId, action)) + .build(); + } } From b257f3716c54f7711623ba4f11b8f4439b73c9e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=A0=EA=B4=80=EA=B7=9C?= Date: Tue, 20 Jan 2026 22:09:52 +0900 Subject: [PATCH 13/14] =?UTF-8?q?chore:=20=EC=A3=BC=EC=84=9D=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../koin/admin/manager/model/Admin.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/main/java/in/koreatech/koin/admin/manager/model/Admin.java b/src/main/java/in/koreatech/koin/admin/manager/model/Admin.java index c5da8fba3..c2922bec9 100644 --- a/src/main/java/in/koreatech/koin/admin/manager/model/Admin.java +++ b/src/main/java/in/koreatech/koin/admin/manager/model/Admin.java @@ -40,19 +40,11 @@ public class Admin { @Column(name = "login_id", nullable = false, unique = true, length = 30) private String loginId; - @NotNull - @Enumerated(EnumType.STRING) - @Column(name = "team_type", nullable = false) - private TeamType teamType; - @NotNull @Enumerated(EnumType.STRING) @Column(name = "track_type", nullable = false) private TrackType trackType; - @Column(name = "can_create_admin", columnDefinition = "TINYINT") - private boolean canCreateAdmin = false; - @Column(name = "super_admin", columnDefinition = "TINYINT") private boolean superAdmin = false; @@ -61,6 +53,16 @@ public class Admin { @JoinColumn(name = "user_id", referencedColumnName = "id") private User user; + // 레거시 필드 + + @NotNull + @Enumerated(EnumType.STRING) + @Column(name = "team_type", nullable = false) + private TeamType teamType; + + @Column(name = "can_create_admin", columnDefinition = "TINYINT") + private boolean canCreateAdmin = false; + @Builder private Admin( Integer id, From 4231a1633da5db22cfad4d301d3f44a65d1d6102 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=A0=EA=B4=80=EA=B7=9C?= Date: Tue, 20 Jan 2026 22:10:21 +0900 Subject: [PATCH 14/14] =?UTF-8?q?fix:=20=EC=BD=94=EC=9D=B8=20=EC=96=B4?= =?UTF-8?q?=EB=93=9C=EB=AF=BC=20=EA=B3=84=EC=A0=95=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EA=B6=8C=ED=95=9C=EA=B0=92=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../koin/admin/manager/dto/response/CreateAdminRequest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/in/koreatech/koin/admin/manager/dto/response/CreateAdminRequest.java b/src/main/java/in/koreatech/koin/admin/manager/dto/response/CreateAdminRequest.java index 7d9bb3c6f..56554919a 100644 --- a/src/main/java/in/koreatech/koin/admin/manager/dto/response/CreateAdminRequest.java +++ b/src/main/java/in/koreatech/koin/admin/manager/dto/response/CreateAdminRequest.java @@ -45,7 +45,7 @@ public Admin toAdmin(PasswordEncoder passwordEncoder) { .loginPw(passwordEncoder.encode(password)) .name(name) .userType(ADMIN) - .isAuthed(false) + .isAuthed(true) .isDeleted(false) .build();