From 86d76b6d385763167405126fb870579be0605709 Mon Sep 17 00:00:00 2001
From: geonhos
Date: Wed, 8 May 2024 14:23:34 +0900
Subject: [PATCH 1/6] =?UTF-8?q?=EA=B4=80=EB=A6=AC=EC=9E=90=20=EA=B4=80?=
=?UTF-8?q?=EB=A6=AC=20,=20=EA=B6=8C=ED=99=98=20=EA=B4=80=EB=A6=AC=20?=
=?UTF-8?q?=EB=B9=88=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EB=B0=8F=20Entity,?=
=?UTF-8?q?=20Data=20=EC=B6=94=EA=B0=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
poc/admin/build.gradle | 2 +-
.../poc/admin/domain/admin/Administrator.java | 11 +++--
.../admin/domain/admin/AdministratorRole.java | 24 +++++++++++
.../bpgroup/poc/admin/domain/admin/Menu.java | 14 +++++++
.../bpgroup/poc/admin/domain/admin/Role.java | 26 ++++++++++++
.../poc/admin/domain/admin/RoleMenu.java | 22 ++++++++++
.../admin/domain/admin/RoleRepository.java | 6 +++
.../poc/admin/security/SecurityConfig.java | 17 ++++----
.../web/advice/PathInfoControllerAdvice.java | 35 ++++++++++++++++
.../AdministratorManagementController.java | 16 ++++++++
.../web/main/admin/role/RoleController.java | 15 +++++++
poc/admin/src/main/resources/data.sql | 17 +++++++-
.../resources/templates/layout/common.html | 36 +++++++++++++++++
.../templates/{main => layout}/gnb.html | 0
.../main/resources/templates/layout/lnb.html | 23 +++++++++++
.../templates/main/admin/management/list.html | 14 +++++++
.../templates/main/admin/management/root.html | 15 +++++++
.../templates/main/admin/role/list.html | 14 +++++++
.../templates/main/admin/role/root.html | 15 +++++++
.../main/resources/templates/main/lnb.html | 24 -----------
.../main/resources/templates/main/main.html | 40 +++++--------------
21 files changed, 319 insertions(+), 67 deletions(-)
create mode 100644 poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/AdministratorRole.java
create mode 100644 poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/Menu.java
create mode 100644 poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/Role.java
create mode 100644 poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/RoleMenu.java
create mode 100644 poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/RoleRepository.java
create mode 100644 poc/admin/src/main/java/com/bpgroup/poc/admin/web/advice/PathInfoControllerAdvice.java
create mode 100644 poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/management/AdministratorManagementController.java
create mode 100644 poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/role/RoleController.java
create mode 100644 poc/admin/src/main/resources/templates/layout/common.html
rename poc/admin/src/main/resources/templates/{main => layout}/gnb.html (100%)
create mode 100644 poc/admin/src/main/resources/templates/layout/lnb.html
create mode 100644 poc/admin/src/main/resources/templates/main/admin/management/list.html
create mode 100644 poc/admin/src/main/resources/templates/main/admin/management/root.html
create mode 100644 poc/admin/src/main/resources/templates/main/admin/role/list.html
create mode 100644 poc/admin/src/main/resources/templates/main/admin/role/root.html
delete mode 100644 poc/admin/src/main/resources/templates/main/lnb.html
diff --git a/poc/admin/build.gradle b/poc/admin/build.gradle
index fd1e58f..ffa503d 100644
--- a/poc/admin/build.gradle
+++ b/poc/admin/build.gradle
@@ -21,7 +21,7 @@ dependencies {
// thymeleaf
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
- implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6'
+ implementation 'nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect:3.3.0'
// jpa
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/Administrator.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/Administrator.java
index bf0f65e..d82129c 100644
--- a/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/Administrator.java
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/Administrator.java
@@ -13,16 +13,19 @@ public class Administrator extends BaseEntity {
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
- @Column(name = "login_id")
+ @Column(name = "login_id", length = 100, nullable = false)
private String loginId;
- @Column(name = "password")
+ @Column(name = "password", length = 255, nullable = false)
private String password;
- @Column(name = "email")
+ @Column(name = "email", length = 100, nullable = false)
private String email;
- @Column(name = "name")
+ @Column(name = "name", length = 100, nullable = false)
private String name;
+ @OneToOne(mappedBy = "administrator", fetch = FetchType.LAZY)
+ private AdministratorRole administratorRole;
+
}
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/AdministratorRole.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/AdministratorRole.java
new file mode 100644
index 0000000..bb26a09
--- /dev/null
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/AdministratorRole.java
@@ -0,0 +1,24 @@
+package com.bpgroup.poc.admin.domain.admin;
+
+import com.bpgroup.poc.admin.domain.BaseEntity;
+import jakarta.persistence.*;
+import lombok.Getter;
+
+@Getter
+@Entity
+@Table(name = "administrator_role")
+public class AdministratorRole extends BaseEntity {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
+ @JoinColumn(name = "administrator_id", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
+ private Administrator administrator;
+
+ @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
+ @JoinColumn(name = "role_id", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
+ private Role role;
+
+}
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/Menu.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/Menu.java
new file mode 100644
index 0000000..35b35af
--- /dev/null
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/Menu.java
@@ -0,0 +1,14 @@
+package com.bpgroup.poc.admin.domain.admin;
+
+import lombok.RequiredArgsConstructor;
+
+@RequiredArgsConstructor
+public enum Menu {
+ ADMINISTRATOR_MANAGEMENT("/admin/management", "관리자 관리"),
+ ROLE_MANAGEMENT("/admin/role", "권한 관리"),
+ MENU_MANAGEMENT("/admin/menu", "메뉴 관리")
+ ;
+
+ private final String uri;
+ private final String name;
+}
\ No newline at end of file
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/Role.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/Role.java
new file mode 100644
index 0000000..02a6a23
--- /dev/null
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/Role.java
@@ -0,0 +1,26 @@
+package com.bpgroup.poc.admin.domain.admin;
+
+import com.bpgroup.poc.admin.domain.BaseEntity;
+import jakarta.persistence.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Entity
+@Table(name = "role")
+public class Role extends BaseEntity {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ @Column(name = "name", length = 100, nullable = false)
+ private String name;
+
+ @Column(name = "description")
+ private String description;
+
+ @OneToMany(mappedBy = "role", fetch = FetchType.LAZY)
+ private List roleMenus = new ArrayList<>();
+
+}
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/RoleMenu.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/RoleMenu.java
new file mode 100644
index 0000000..df8a1d4
--- /dev/null
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/RoleMenu.java
@@ -0,0 +1,22 @@
+package com.bpgroup.poc.admin.domain.admin;
+
+import com.bpgroup.poc.admin.domain.BaseEntity;
+import jakarta.persistence.*;
+
+@Table
+@Entity(name = "role_menu")
+public class RoleMenu extends BaseEntity {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
+ @JoinColumn(name = "role_id", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
+ private Role role;
+
+ @Enumerated(EnumType.STRING)
+ @Column(name = "menu", length = 100, nullable = false)
+ private Menu menu;
+
+}
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/RoleRepository.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/RoleRepository.java
new file mode 100644
index 0000000..449da60
--- /dev/null
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/RoleRepository.java
@@ -0,0 +1,6 @@
+package com.bpgroup.poc.admin.domain.admin;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface RoleRepository extends JpaRepository {
+}
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/security/SecurityConfig.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/security/SecurityConfig.java
index 24c7d3e..9261d37 100644
--- a/poc/admin/src/main/java/com/bpgroup/poc/admin/security/SecurityConfig.java
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/security/SecurityConfig.java
@@ -2,6 +2,7 @@ package com.bpgroup.poc.admin.security;
import com.bpgroup.poc.admin.common.FormatHelper;
import com.bpgroup.poc.admin.security.authentication.AuthenticationFailException;
+import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
@@ -15,6 +16,7 @@ import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
import java.util.Objects;
@Configuration
+@RequiredArgsConstructor
public class SecurityConfig {
private static final String LOGIN_PATH = "/login";
@@ -27,19 +29,20 @@ public class SecurityConfig {
CsrfTokenRequestAttributeHandler csrfTokenRequestAttributeHandler = new CsrfTokenRequestAttributeHandler();
csrfTokenRequestAttributeHandler.setCsrfRequestAttributeName("_csrf");
- http.csrf(t -> {
- t.csrfTokenRequestHandler(csrfTokenRequestAttributeHandler)
+ http.csrf(c -> {
+ c.csrfTokenRequestHandler(csrfTokenRequestAttributeHandler)
.ignoringRequestMatchers("/common/modal/**")
.ignoringRequestMatchers(LOGIN_PATH, LOGOUT_PATH, ERROR_PATH) // CSRF 무시 URL 설정
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()); // CSRF 토큰을 쿠키에 저장 및 사용 가능
}).addFilterAfter(new CsrfCookieFilter(), BasicAuthenticationFilter.class); // 로그인이 완료된 후 CSRF Filter 를 실행
// 인증 설정
- http.authorizeHttpRequests(c -> c
- .requestMatchers("/css/**", "/images/**", "/js/**").permitAll()
- .requestMatchers("/common/modal/**").permitAll()
- .requestMatchers(LOGIN_PATH, LOGOUT_PATH, ERROR_PATH).permitAll()
- .anyRequest().authenticated());
+ http.authorizeHttpRequests(c -> {
+ c.requestMatchers("/css/**", "/images/**", "/js/**").permitAll()
+ .requestMatchers("/common/modal/**").permitAll()
+ .requestMatchers(LOGIN_PATH, LOGOUT_PATH, ERROR_PATH).permitAll()
+ .anyRequest().authenticated();
+ });
http.formLogin(c -> c
.loginPage(LOGIN_PATH)
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/web/advice/PathInfoControllerAdvice.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/web/advice/PathInfoControllerAdvice.java
new file mode 100644
index 0000000..044d070
--- /dev/null
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/web/advice/PathInfoControllerAdvice.java
@@ -0,0 +1,35 @@
+package com.bpgroup.poc.admin.web.advice;
+
+import jakarta.servlet.http.HttpServletRequest;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ModelAttribute;
+
+@ControllerAdvice
+@RequiredArgsConstructor
+public class PathInfoControllerAdvice {
+
+ @ModelAttribute("pathInfo")
+ public PathInfo pathInfo(HttpServletRequest request) {
+ return new PathInfo(request);
+ }
+
+ @Getter
+ public static class PathInfo {
+
+ private final String currentPath;
+
+ public PathInfo(HttpServletRequest request) {
+ this.currentPath = request.getServletPath();
+ }
+
+ public boolean isActive(String path) {
+ return currentPath.startsWith(path);
+ }
+
+ public String activeClass(String path) {
+ return isActive(path) ? "active" : "";
+ }
+ }
+}
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/management/AdministratorManagementController.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/management/AdministratorManagementController.java
new file mode 100644
index 0000000..ebddf87
--- /dev/null
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/management/AdministratorManagementController.java
@@ -0,0 +1,16 @@
+package com.bpgroup.poc.admin.web.main.admin.management;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+@Controller
+@RequestMapping("/admin/management")
+public class AdministratorManagementController {
+
+ @GetMapping
+ public String administratorManagementPage() {
+ return "main/admin/management/list";
+ }
+
+}
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/role/RoleController.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/role/RoleController.java
new file mode 100644
index 0000000..4ab3b8e
--- /dev/null
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/role/RoleController.java
@@ -0,0 +1,15 @@
+package com.bpgroup.poc.admin.web.main.admin.role;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+@Controller
+@RequestMapping("/admin/role")
+public class RoleController {
+
+ @GetMapping
+ public String rolePage() {
+ return "main/admin/role/list";
+ }
+}
diff --git a/poc/admin/src/main/resources/data.sql b/poc/admin/src/main/resources/data.sql
index 1544061..259b787 100644
--- a/poc/admin/src/main/resources/data.sql
+++ b/poc/admin/src/main/resources/data.sql
@@ -1,2 +1,17 @@
INSERT INTO `administrator` (`login_id`, `password`, `email`, `name`, `create_date`, `update_date`)
-VALUES ('admin', '$2a$10$g6UOrQ/OS8o5r5CJk7C5juVFaItQ62U3EIn8zLPzkFplM3wVLvKZ2', 'admin@admin.com', '홍길동', CURDATE(), CURDATE());
\ No newline at end of file
+VALUES ('admin', '$2a$10$g6UOrQ/OS8o5r5CJk7C5juVFaItQ62U3EIn8zLPzkFplM3wVLvKZ2', 'admin@admin.com', '홍길동', CURDATE(), CURDATE());
+
+INSERT INTO `role` (`name`, `description`, `create_date`, `update_date`)
+VALUES ('SUPER_ADMIN', '최고 관리자', CURDATE(), CURDATE()),
+ ('ADMIN', '관리자', CURDATE(), CURDATE()),
+ ('CLIENT', '고객', CURDATE(), CURDATE());
+
+INSERT INTO `administrator_role` (`administrator_id`, `role_id`, `create_date`, `update_date`)
+VALUES ('1', '1', CURDATE(), CURDATE());
+
+INSERT INTO `role_menu` (`role_id`, `menu`, `create_date`, `update_date`)
+VALUES ('1', 'ADMINISTRATOR_MANAGEMENT', CURDATE(), CURDATE()),
+ ('1', 'ROLE_MANAGEMENT', CURDATE(), CURDATE()),
+ ('1', 'MENU_MANAGEMENT', CURDATE(), CURDATE());
+
+
diff --git a/poc/admin/src/main/resources/templates/layout/common.html b/poc/admin/src/main/resources/templates/layout/common.html
new file mode 100644
index 0000000..64dd0c5
--- /dev/null
+++ b/poc/admin/src/main/resources/templates/layout/common.html
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+ 관리자 시스템
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/poc/admin/src/main/resources/templates/main/gnb.html b/poc/admin/src/main/resources/templates/layout/gnb.html
similarity index 100%
rename from poc/admin/src/main/resources/templates/main/gnb.html
rename to poc/admin/src/main/resources/templates/layout/gnb.html
diff --git a/poc/admin/src/main/resources/templates/layout/lnb.html b/poc/admin/src/main/resources/templates/layout/lnb.html
new file mode 100644
index 0000000..bf7f63e
--- /dev/null
+++ b/poc/admin/src/main/resources/templates/layout/lnb.html
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
diff --git a/poc/admin/src/main/resources/templates/main/admin/management/list.html b/poc/admin/src/main/resources/templates/main/admin/management/list.html
new file mode 100644
index 0000000..bb3d4ab
--- /dev/null
+++ b/poc/admin/src/main/resources/templates/main/admin/management/list.html
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/poc/admin/src/main/resources/templates/main/admin/management/root.html b/poc/admin/src/main/resources/templates/main/admin/management/root.html
new file mode 100644
index 0000000..761f575
--- /dev/null
+++ b/poc/admin/src/main/resources/templates/main/admin/management/root.html
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/poc/admin/src/main/resources/templates/main/admin/role/list.html b/poc/admin/src/main/resources/templates/main/admin/role/list.html
new file mode 100644
index 0000000..d4ebe8f
--- /dev/null
+++ b/poc/admin/src/main/resources/templates/main/admin/role/list.html
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/poc/admin/src/main/resources/templates/main/admin/role/root.html b/poc/admin/src/main/resources/templates/main/admin/role/root.html
new file mode 100644
index 0000000..761f575
--- /dev/null
+++ b/poc/admin/src/main/resources/templates/main/admin/role/root.html
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/poc/admin/src/main/resources/templates/main/lnb.html b/poc/admin/src/main/resources/templates/main/lnb.html
deleted file mode 100644
index 9e3015f..0000000
--- a/poc/admin/src/main/resources/templates/main/lnb.html
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
-
-
-
diff --git a/poc/admin/src/main/resources/templates/main/main.html b/poc/admin/src/main/resources/templates/main/main.html
index 2be9a79..0e4b13b 100644
--- a/poc/admin/src/main/resources/templates/main/main.html
+++ b/poc/admin/src/main/resources/templates/main/main.html
@@ -1,37 +1,17 @@
-
-
-
-
- 관리자 시스템
-
-
-
-
-
-
-
-
-
-
-
-
-
+ xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+ layout:decorate="~{layout/common.html}">
-
-
-
-
+
+
+
+
+
+
From 249cc080e53384bab770ff89978245e655e919f9 Mon Sep 17 00:00:00 2001
From: geonhos
Date: Wed, 8 May 2024 14:34:35 +0900
Subject: [PATCH 2/6] =?UTF-8?q?logback=20=EC=B6=94=EA=B0=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/main/resources/application-local.yml | 3 +++
.../src/main/resources/logback-local.xml | 24 +++++++++++++++++++
2 files changed, 27 insertions(+)
create mode 100644 poc/admin/src/main/resources/logback-local.xml
diff --git a/poc/admin/src/main/resources/application-local.yml b/poc/admin/src/main/resources/application-local.yml
index d8ed351..a33e61d 100644
--- a/poc/admin/src/main/resources/application-local.yml
+++ b/poc/admin/src/main/resources/application-local.yml
@@ -17,3 +17,6 @@ spring:
hibernate:
ddl-auto: create-drop
defer-datasource-initialization: true
+
+logging:
+ config: classpath:logback-local.xml
diff --git a/poc/admin/src/main/resources/logback-local.xml b/poc/admin/src/main/resources/logback-local.xml
new file mode 100644
index 0000000..571a8ef
--- /dev/null
+++ b/poc/admin/src/main/resources/logback-local.xml
@@ -0,0 +1,24 @@
+
+
+
+
+ %5p|%d{yyyy-MM-dd HH:mm:ss.SSS}|%X{loginId}|%32X{sessionId}|%32X{transactionId}|%logger:%line|%msg%n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
From c4e33cf22faf1f997913d1ec60f231911bb69ca5 Mon Sep 17 00:00:00 2001
From: geonhos
Date: Thu, 9 May 2024 10:10:12 +0900
Subject: [PATCH 3/6] =?UTF-8?q?=EB=A9=94=EB=89=B4=20=EB=8F=99=EC=A0=81=20?=
=?UTF-8?q?=EB=85=B8=EC=B6=9C=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
poc/admin/build.gradle | 1 +
poc/admin/database/docker-compose.yml | 2 +-
.../poc/admin/app/login/LoginResult.java | 41 +++++++++++-
.../poc/admin/app/login/LoginService.java | 26 +++++++-
.../bpgroup/poc/admin/domain/admin/Menu.java | 35 +++++++---
.../poc/admin/domain/admin/MenuGroup.java | 25 +++++++
.../admin/domain/admin/MenuRepository.java | 6 ++
.../bpgroup/poc/admin/domain/admin/Role.java | 8 ++-
.../poc/admin/domain/admin/RoleMenu.java | 10 +--
.../authentication/AuthenticationDetail.java | 66 +++++++++++++++++++
.../poc/admin/values/AdministratorMenu.java | 4 ++
.../poc/admin/web/login/LoginController.java | 4 +-
.../src/main/resources/application-local.yml | 2 +-
poc/admin/src/main/resources/application.yml | 2 +-
poc/admin/src/main/resources/data.sql | 49 ++++++++++++--
.../main/resources/templates/layout/lnb.html | 28 ++++----
16 files changed, 267 insertions(+), 42 deletions(-)
create mode 100644 poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/MenuGroup.java
create mode 100644 poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/MenuRepository.java
create mode 100644 poc/admin/src/main/java/com/bpgroup/poc/admin/values/AdministratorMenu.java
diff --git a/poc/admin/build.gradle b/poc/admin/build.gradle
index ffa503d..90325d8 100644
--- a/poc/admin/build.gradle
+++ b/poc/admin/build.gradle
@@ -21,6 +21,7 @@ dependencies {
// thymeleaf
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
+ implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6'
implementation 'nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect:3.3.0'
// jpa
diff --git a/poc/admin/database/docker-compose.yml b/poc/admin/database/docker-compose.yml
index 3cf2142..f0a0c7f 100644
--- a/poc/admin/database/docker-compose.yml
+++ b/poc/admin/database/docker-compose.yml
@@ -12,7 +12,7 @@ services:
environment:
- TZ=Asia/Seoul
- MARIADB_ROOT_PASSWORD=root
- - MARIADB_DATABASE=login
+ - MARIADB_DATABASE=admin-system
- MARIADB_USER=admin
- MARIADB_PASSWORD=1234
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/app/login/LoginResult.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/app/login/LoginResult.java
index a4ed910..5195fbd 100644
--- a/poc/admin/src/main/java/com/bpgroup/poc/admin/app/login/LoginResult.java
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/app/login/LoginResult.java
@@ -1,22 +1,59 @@
package com.bpgroup.poc.admin.app.login;
+import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.ToString;
+import java.util.HashSet;
+import java.util.Set;
+
@Getter
-@ToString
public class LoginResult {
private Long id;
private String loginId;
private String name;
private String email;
- public static LoginResult of(Long id, String loginId, String name, String email) {
+ private Set menus = new HashSet<>();
+
+ public static LoginResult of(Long id, String loginId, String name, String email, Set menus) {
LoginResult loginResult = new LoginResult();
loginResult.id = id;
loginResult.loginId = loginId;
loginResult.name = name;
loginResult.email = email;
+ loginResult.menus = menus;
return loginResult;
}
+
+ @Getter
+ @ToString
+ @EqualsAndHashCode
+ public static class MenuInfo {
+ private String menuGroupUri;
+ private String menuGroupName;
+ private Integer menuGroupSortOrder;
+ private String menuUri;
+ private String menuName;
+ private Integer menuSortOrder;
+
+ public static MenuInfo of(
+ String menuGroupUri,
+ String menuGroupName,
+ Integer menuGroupSortOrder,
+ String menuUri,
+ String menuName,
+ Integer menuSortOrder
+ ) {
+ MenuInfo menuInfo = new MenuInfo();
+ menuInfo.menuGroupUri = menuGroupUri;
+ menuInfo.menuGroupName = menuGroupName;
+ menuInfo.menuGroupSortOrder = menuGroupSortOrder;
+ menuInfo.menuUri = menuUri;
+ menuInfo.menuName = menuName;
+ menuInfo.menuSortOrder = menuSortOrder;
+ return menuInfo;
+ }
+ }
+
}
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/app/login/LoginService.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/app/login/LoginService.java
index ae69d8d..5f07459 100644
--- a/poc/admin/src/main/java/com/bpgroup/poc/admin/app/login/LoginService.java
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/app/login/LoginService.java
@@ -7,11 +7,16 @@ import com.bpgroup.poc.admin.domain.admin.AdministratorRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import java.util.Comparator;
+import java.util.LinkedHashSet;
import java.util.Optional;
+import java.util.stream.Collectors;
@Service
@RequiredArgsConstructor
+@Transactional
public class LoginService {
private final AdministratorRepository loginRepository;
@@ -32,8 +37,27 @@ public class LoginService {
administrator.get().getId(),
administrator.get().getLoginId(),
administrator.get().getName(),
- administrator.get().getLoginId()
+ administrator.get().getLoginId(),
+ getMenus(administrator.get())
);
}
+ private static LinkedHashSet getMenus(Administrator administrator) {
+ return administrator.getAdministratorRole().getRole().getRoleMenus().stream()
+ .map(roleMenu -> LoginResult.MenuInfo.of(
+ roleMenu.getMenu().getMenuGroup().getUri(),
+ roleMenu.getMenu().getMenuGroup().getName(),
+ roleMenu.getMenu().getMenuGroup().getSortOrder(),
+ roleMenu.getMenu().getUri(),
+ roleMenu.getMenu().getName(),
+ roleMenu.getMenu().getSortOrder()
+ ))
+ .sorted(
+ Comparator
+ .comparingInt(LoginResult.MenuInfo::getMenuGroupSortOrder)
+ .thenComparingInt(LoginResult.MenuInfo::getMenuSortOrder)
+ )
+ .collect(Collectors.toCollection(LinkedHashSet::new));
+ }
+
}
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/Menu.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/Menu.java
index 35b35af..054d477 100644
--- a/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/Menu.java
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/Menu.java
@@ -1,14 +1,29 @@
package com.bpgroup.poc.admin.domain.admin;
-import lombok.RequiredArgsConstructor;
+import com.bpgroup.poc.admin.domain.BaseEntity;
+import jakarta.persistence.*;
+import lombok.Getter;
-@RequiredArgsConstructor
-public enum Menu {
- ADMINISTRATOR_MANAGEMENT("/admin/management", "관리자 관리"),
- ROLE_MANAGEMENT("/admin/role", "권한 관리"),
- MENU_MANAGEMENT("/admin/menu", "메뉴 관리")
- ;
+@Getter
+@Entity
+@Table(name = "menu")
+public class Menu extends BaseEntity {
- private final String uri;
- private final String name;
-}
\ No newline at end of file
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ @Column(name = "uri", length = 100, nullable = false)
+ private String uri;
+
+ @Column(name = "name", length = 100, nullable = false)
+ private String name;
+
+ @Column(name = "sort_order", nullable = false)
+ private Integer sortOrder;
+
+ @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
+ @JoinColumn(name = "menu_group_id", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
+ private MenuGroup menuGroup;
+
+}
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/MenuGroup.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/MenuGroup.java
new file mode 100644
index 0000000..cfba4f3
--- /dev/null
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/MenuGroup.java
@@ -0,0 +1,25 @@
+package com.bpgroup.poc.admin.domain.admin;
+
+import com.bpgroup.poc.admin.domain.BaseEntity;
+import jakarta.persistence.*;
+import lombok.Getter;
+
+@Getter
+@Entity
+@Table(name = "menu_group")
+public class MenuGroup extends BaseEntity {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ @Column(name = "uri", length = 100, nullable = false)
+ private String uri;
+
+ @Column(name = "name", length = 100, nullable = false)
+ private String name;
+
+ @Column(name = "sort_order", nullable = false)
+ private Integer sortOrder;
+
+}
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/MenuRepository.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/MenuRepository.java
new file mode 100644
index 0000000..9ce7974
--- /dev/null
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/MenuRepository.java
@@ -0,0 +1,6 @@
+package com.bpgroup.poc.admin.domain.admin;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface MenuRepository extends JpaRepository
-
+
\ No newline at end of file
From e3c4fa132f58067d57c53b34b2569035676cbf00 Mon Sep 17 00:00:00 2001
From: geonhos
Date: Thu, 9 May 2024 14:32:49 +0900
Subject: [PATCH 4/6] =?UTF-8?q?admin=20entity=20package=20=EA=B2=BD?=
=?UTF-8?q?=EB=A1=9C=20=EC=9D=B4=EB=8F=99?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../domain/admin/{ => entity}/Administrator.java | 13 ++++++++++++-
.../admin/{ => entity}/AdministratorRepository.java | 2 +-
.../admin/{ => entity}/AdministratorRole.java | 2 +-
.../poc/admin/domain/admin/{ => entity}/Menu.java | 2 +-
.../admin/domain/admin/{ => entity}/MenuGroup.java | 2 +-
.../domain/admin/{ => entity}/MenuRepository.java | 2 +-
.../poc/admin/domain/admin/{ => entity}/Role.java | 2 +-
.../admin/domain/admin/{ => entity}/RoleMenu.java | 2 +-
.../domain/admin/{ => entity}/RoleRepository.java | 2 +-
9 files changed, 20 insertions(+), 9 deletions(-)
rename poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/{ => entity}/Administrator.java (63%)
rename poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/{ => entity}/AdministratorRepository.java (82%)
rename poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/{ => entity}/AdministratorRole.java (93%)
rename poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/{ => entity}/Menu.java (93%)
rename poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/{ => entity}/MenuGroup.java (91%)
rename poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/{ => entity}/MenuRepository.java (72%)
rename poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/{ => entity}/Role.java (91%)
rename poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/{ => entity}/RoleMenu.java (92%)
rename poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/{ => entity}/RoleRepository.java (72%)
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/Administrator.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/entity/Administrator.java
similarity index 63%
rename from poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/Administrator.java
rename to poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/entity/Administrator.java
index d82129c..e28bb3d 100644
--- a/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/Administrator.java
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/entity/Administrator.java
@@ -1,7 +1,8 @@
-package com.bpgroup.poc.admin.domain.admin;
+package com.bpgroup.poc.admin.domain.admin.entity;
import com.bpgroup.poc.admin.domain.BaseEntity;
import jakarta.persistence.*;
+import lombok.Builder;
import lombok.Getter;
@Getter
@@ -28,4 +29,14 @@ public class Administrator extends BaseEntity {
@OneToOne(mappedBy = "administrator", fetch = FetchType.LAZY)
private AdministratorRole administratorRole;
+ @Builder
+ public static Administrator of(String loginId, String password, String email, String name) {
+ Administrator administrator = new Administrator();
+ administrator.loginId = loginId;
+ administrator.password = password;
+ administrator.email = email;
+ administrator.name = name;
+ return administrator;
+ }
+
}
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/AdministratorRepository.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/entity/AdministratorRepository.java
similarity index 82%
rename from poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/AdministratorRepository.java
rename to poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/entity/AdministratorRepository.java
index ec88f1e..b81a4ad 100644
--- a/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/AdministratorRepository.java
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/entity/AdministratorRepository.java
@@ -1,4 +1,4 @@
-package com.bpgroup.poc.admin.domain.admin;
+package com.bpgroup.poc.admin.domain.admin.entity;
import org.springframework.data.jpa.repository.JpaRepository;
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/AdministratorRole.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/entity/AdministratorRole.java
similarity index 93%
rename from poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/AdministratorRole.java
rename to poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/entity/AdministratorRole.java
index bb26a09..29540a5 100644
--- a/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/AdministratorRole.java
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/entity/AdministratorRole.java
@@ -1,4 +1,4 @@
-package com.bpgroup.poc.admin.domain.admin;
+package com.bpgroup.poc.admin.domain.admin.entity;
import com.bpgroup.poc.admin.domain.BaseEntity;
import jakarta.persistence.*;
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/Menu.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/entity/Menu.java
similarity index 93%
rename from poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/Menu.java
rename to poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/entity/Menu.java
index 054d477..9ccb75c 100644
--- a/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/Menu.java
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/entity/Menu.java
@@ -1,4 +1,4 @@
-package com.bpgroup.poc.admin.domain.admin;
+package com.bpgroup.poc.admin.domain.admin.entity;
import com.bpgroup.poc.admin.domain.BaseEntity;
import jakarta.persistence.*;
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/MenuGroup.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/entity/MenuGroup.java
similarity index 91%
rename from poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/MenuGroup.java
rename to poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/entity/MenuGroup.java
index cfba4f3..7241ae2 100644
--- a/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/MenuGroup.java
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/entity/MenuGroup.java
@@ -1,4 +1,4 @@
-package com.bpgroup.poc.admin.domain.admin;
+package com.bpgroup.poc.admin.domain.admin.entity;
import com.bpgroup.poc.admin.domain.BaseEntity;
import jakarta.persistence.*;
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/MenuRepository.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/entity/MenuRepository.java
similarity index 72%
rename from poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/MenuRepository.java
rename to poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/entity/MenuRepository.java
index 9ce7974..c3d12dd 100644
--- a/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/MenuRepository.java
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/entity/MenuRepository.java
@@ -1,4 +1,4 @@
-package com.bpgroup.poc.admin.domain.admin;
+package com.bpgroup.poc.admin.domain.admin.entity;
import org.springframework.data.jpa.repository.JpaRepository;
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/Role.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/entity/Role.java
similarity index 91%
rename from poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/Role.java
rename to poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/entity/Role.java
index 3d9e3df..b6f4254 100644
--- a/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/Role.java
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/entity/Role.java
@@ -1,4 +1,4 @@
-package com.bpgroup.poc.admin.domain.admin;
+package com.bpgroup.poc.admin.domain.admin.entity;
import com.bpgroup.poc.admin.domain.BaseEntity;
import jakarta.persistence.*;
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/RoleMenu.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/entity/RoleMenu.java
similarity index 92%
rename from poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/RoleMenu.java
rename to poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/entity/RoleMenu.java
index 4ebf40b..0779612 100644
--- a/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/RoleMenu.java
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/entity/RoleMenu.java
@@ -1,4 +1,4 @@
-package com.bpgroup.poc.admin.domain.admin;
+package com.bpgroup.poc.admin.domain.admin.entity;
import com.bpgroup.poc.admin.domain.BaseEntity;
import jakarta.persistence.*;
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/RoleRepository.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/entity/RoleRepository.java
similarity index 72%
rename from poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/RoleRepository.java
rename to poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/entity/RoleRepository.java
index 449da60..3747729 100644
--- a/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/RoleRepository.java
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/entity/RoleRepository.java
@@ -1,4 +1,4 @@
-package com.bpgroup.poc.admin.domain.admin;
+package com.bpgroup.poc.admin.domain.admin.entity;
import org.springframework.data.jpa.repository.JpaRepository;
From 2edb4c831f9247c228da1f2339c70819933e7b8b Mon Sep 17 00:00:00 2001
From: geonhos
Date: Fri, 10 May 2024 09:48:21 +0900
Subject: [PATCH 5/6] =?UTF-8?q?=EA=B4=80=EB=A6=AC=EC=9E=90=20=EA=B4=80?=
=?UTF-8?q?=EB=A6=AC=20CRUD=20Sample=20=EC=B6=94=EA=B0=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
poc/admin/build.gradle | 10 +-
.../poc/admin/app/login/LoginService.java | 43 ++---
.../exception/DoNotHaveAnyMenuException.java | 7 +
.../poc/admin/config/QuerydslConfig.java | 19 +++
.../poc/admin/domain/DomainException.java | 7 +
.../domain/admin/entity/Administrator.java | 6 +
.../service/AdministratorCreateCommand.java | 42 +++++
.../admin/service/AdministratorService.java | 51 ++++++
.../service/AdministratorUpdateCommand.java | 42 +++++
.../DuplicationAdministratorException.java | 7 +
.../NotFoundAdministratorException.java | 9 +
.../poc/admin/security/SecurityConfig.java | 11 +-
.../AuthenticationFailReason.java | 4 +
.../poc/admin/web/common/CommonResponse.java | 8 +
.../poc/admin/web/login/LoginController.java | 3 +-
...dministratorManagementQueryRepository.java | 40 +++++
...AdministratorManagementRestController.java | 83 +++++++++
.../AdministratorManagementWebService.java | 61 +++++++
.../reqres/AdministratorCreate.java | 51 ++++++
.../reqres/AdministratorDelete.java | 14 ++
.../management/reqres/AdministratorFind.java | 17 ++
.../reqres/AdministratorUpdate.java | 27 +++
poc/admin/src/main/resources/data.sql | 28 +--
.../templates/fragment/csrf/csrf.html | 28 ++-
.../templates/main/admin/management/list.html | 161 ++++++++++++++++++
25 files changed, 720 insertions(+), 59 deletions(-)
create mode 100644 poc/admin/src/main/java/com/bpgroup/poc/admin/app/login/exception/DoNotHaveAnyMenuException.java
create mode 100644 poc/admin/src/main/java/com/bpgroup/poc/admin/config/QuerydslConfig.java
create mode 100644 poc/admin/src/main/java/com/bpgroup/poc/admin/domain/DomainException.java
create mode 100644 poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/service/AdministratorCreateCommand.java
create mode 100644 poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/service/AdministratorService.java
create mode 100644 poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/service/AdministratorUpdateCommand.java
create mode 100644 poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/service/DuplicationAdministratorException.java
create mode 100644 poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/service/NotFoundAdministratorException.java
create mode 100644 poc/admin/src/main/java/com/bpgroup/poc/admin/web/common/CommonResponse.java
create mode 100644 poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/management/AdministratorManagementQueryRepository.java
create mode 100644 poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/management/AdministratorManagementRestController.java
create mode 100644 poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/management/AdministratorManagementWebService.java
create mode 100644 poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/management/reqres/AdministratorCreate.java
create mode 100644 poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/management/reqres/AdministratorDelete.java
create mode 100644 poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/management/reqres/AdministratorFind.java
create mode 100644 poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/management/reqres/AdministratorUpdate.java
diff --git a/poc/admin/build.gradle b/poc/admin/build.gradle
index 90325d8..b5451fc 100644
--- a/poc/admin/build.gradle
+++ b/poc/admin/build.gradle
@@ -16,7 +16,10 @@ repositories {
}
dependencies {
+ // spring
implementation 'org.springframework.boot:spring-boot-starter-web'
+ implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
+ implementation 'org.springframework.boot:spring-boot-starter-validation'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
// thymeleaf
@@ -24,8 +27,11 @@ dependencies {
implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6'
implementation 'nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect:3.3.0'
- // jpa
- implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
+ //querydsl
+ implementation "com.querydsl:querydsl-jpa:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
+ annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
+ annotationProcessor "jakarta.persistence:jakarta.persistence-api"
+ annotationProcessor "jakarta.annotation:jakarta.annotation-api"
// security
implementation 'org.springframework.boot:spring-boot-starter-security'
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/app/login/LoginService.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/app/login/LoginService.java
index 5f07459..35535b0 100644
--- a/poc/admin/src/main/java/com/bpgroup/poc/admin/app/login/LoginService.java
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/app/login/LoginService.java
@@ -1,9 +1,10 @@
package com.bpgroup.poc.admin.app.login;
import com.bpgroup.poc.admin.app.login.exception.AdministratorNotFoundException;
+import com.bpgroup.poc.admin.app.login.exception.DoNotHaveAnyMenuException;
import com.bpgroup.poc.admin.app.login.exception.InvalidPasswordException;
-import com.bpgroup.poc.admin.domain.admin.Administrator;
-import com.bpgroup.poc.admin.domain.admin.AdministratorRepository;
+import com.bpgroup.poc.admin.domain.admin.entity.Administrator;
+import com.bpgroup.poc.admin.domain.admin.entity.AdministratorRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
@@ -22,7 +23,7 @@ public class LoginService {
private final AdministratorRepository loginRepository;
private final PasswordEncoder passwordEncoder;
- public LoginResult login(String loginId, String pwd) throws AdministratorNotFoundException, InvalidPasswordException {
+ public LoginResult login(String loginId, String pwd) throws AdministratorNotFoundException, InvalidPasswordException, DoNotHaveAnyMenuException {
Optional administrator = loginRepository.findByLoginId(loginId);
if (administrator.isEmpty()) {
@@ -42,22 +43,26 @@ public class LoginService {
);
}
- private static LinkedHashSet getMenus(Administrator administrator) {
- return administrator.getAdministratorRole().getRole().getRoleMenus().stream()
- .map(roleMenu -> LoginResult.MenuInfo.of(
- roleMenu.getMenu().getMenuGroup().getUri(),
- roleMenu.getMenu().getMenuGroup().getName(),
- roleMenu.getMenu().getMenuGroup().getSortOrder(),
- roleMenu.getMenu().getUri(),
- roleMenu.getMenu().getName(),
- roleMenu.getMenu().getSortOrder()
- ))
- .sorted(
- Comparator
- .comparingInt(LoginResult.MenuInfo::getMenuGroupSortOrder)
- .thenComparingInt(LoginResult.MenuInfo::getMenuSortOrder)
- )
- .collect(Collectors.toCollection(LinkedHashSet::new));
+ private static LinkedHashSet getMenus(Administrator administrator) throws DoNotHaveAnyMenuException {
+ try {
+ return administrator.getAdministratorRole().getRole().getRoleMenus().stream()
+ .map(roleMenu -> LoginResult.MenuInfo.of(
+ roleMenu.getMenu().getMenuGroup().getUri(),
+ roleMenu.getMenu().getMenuGroup().getName(),
+ roleMenu.getMenu().getMenuGroup().getSortOrder(),
+ roleMenu.getMenu().getUri(),
+ roleMenu.getMenu().getName(),
+ roleMenu.getMenu().getSortOrder()
+ ))
+ .sorted(
+ Comparator
+ .comparingInt(LoginResult.MenuInfo::getMenuGroupSortOrder)
+ .thenComparingInt(LoginResult.MenuInfo::getMenuSortOrder)
+ )
+ .collect(Collectors.toCollection(LinkedHashSet::new));
+ } catch (NullPointerException e) {
+ throw new DoNotHaveAnyMenuException();
+ }
}
}
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/app/login/exception/DoNotHaveAnyMenuException.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/app/login/exception/DoNotHaveAnyMenuException.java
new file mode 100644
index 0000000..82690a5
--- /dev/null
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/app/login/exception/DoNotHaveAnyMenuException.java
@@ -0,0 +1,7 @@
+package com.bpgroup.poc.admin.app.login.exception;
+
+public class DoNotHaveAnyMenuException extends Exception {
+ public DoNotHaveAnyMenuException() {
+ super();
+ }
+}
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/config/QuerydslConfig.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/config/QuerydslConfig.java
new file mode 100644
index 0000000..3c3f956
--- /dev/null
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/config/QuerydslConfig.java
@@ -0,0 +1,19 @@
+package com.bpgroup.poc.admin.config;
+
+import com.querydsl.jpa.impl.JPAQueryFactory;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.PersistenceContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class QuerydslConfig {
+
+ @PersistenceContext
+ private EntityManager entityManager;
+
+ @Bean
+ public JPAQueryFactory jpaQueryFactory() {
+ return new JPAQueryFactory(entityManager);
+ }
+}
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/DomainException.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/DomainException.java
new file mode 100644
index 0000000..d7f046c
--- /dev/null
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/DomainException.java
@@ -0,0 +1,7 @@
+package com.bpgroup.poc.admin.domain;
+
+public class DomainException extends RuntimeException {
+ public DomainException() {
+ super();
+ }
+}
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/entity/Administrator.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/entity/Administrator.java
index e28bb3d..f7fc3aa 100644
--- a/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/entity/Administrator.java
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/entity/Administrator.java
@@ -39,4 +39,10 @@ public class Administrator extends BaseEntity {
return administrator;
}
+ public void update(Administrator administrator) {
+ this.password = administrator.password;
+ this.email = administrator.email;
+ this.name = administrator.name;
+ }
+
}
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/service/AdministratorCreateCommand.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/service/AdministratorCreateCommand.java
new file mode 100644
index 0000000..39d3f74
--- /dev/null
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/service/AdministratorCreateCommand.java
@@ -0,0 +1,42 @@
+package com.bpgroup.poc.admin.domain.admin.service;
+
+import com.bpgroup.poc.admin.domain.admin.entity.Administrator;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Getter;
+import lombok.ToString;
+
+@Getter
+@ToString
+public class AdministratorCreateCommand {
+
+ @NotBlank
+ private String loginId;
+
+ @NotBlank
+ private String password;
+
+ @NotBlank
+ private String email;
+
+ @NotBlank
+ private String name;
+
+ public static AdministratorCreateCommand of(String loginId, String password, String email, String name) {
+ AdministratorCreateCommand command = new AdministratorCreateCommand();
+ command.loginId = loginId;
+ command.password = password;
+ command.email = email;
+ command.name = name;
+ return command;
+ }
+
+ public Administrator toEntity() {
+ return Administrator.builder()
+ .loginId(loginId)
+ .password(password)
+ .email(email)
+ .name(name)
+ .build();
+ }
+
+}
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/service/AdministratorService.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/service/AdministratorService.java
new file mode 100644
index 0000000..008cbb6
--- /dev/null
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/service/AdministratorService.java
@@ -0,0 +1,51 @@
+package com.bpgroup.poc.admin.domain.admin.service;
+
+import com.bpgroup.poc.admin.domain.admin.entity.Administrator;
+import com.bpgroup.poc.admin.domain.admin.entity.AdministratorRepository;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
+
+import java.util.Optional;
+
+@Service
+@RequiredArgsConstructor
+@Validated
+@Transactional
+public class AdministratorService {
+
+ private final AdministratorRepository administratorRepository;
+
+ public Long create(
+ @NotNull @Valid AdministratorCreateCommand command
+ ) {
+ // 대소문자 구별이 필요한 경우 인증 부분과 유효성 검사 부분 모두 변경이 필요하다.
+ Optional administrator = administratorRepository.findByLoginId(command.getLoginId());
+ if (administrator.isPresent()) {
+ throw new DuplicationAdministratorException(command.getLoginId());
+ }
+
+ Administrator createAdministrator = administratorRepository.save(command.toEntity());
+ return createAdministrator.getId();
+ }
+
+ public void update(
+ @NotNull @Valid AdministratorUpdateCommand command
+ ) {
+ Optional administrator = administratorRepository.findById(command.getId());
+ if (administrator.isEmpty()) {
+ throw new NotFoundAdministratorException();
+ }
+
+ administrator.get().update(command.toEntity());
+ }
+
+ public void delete(
+ @NotNull Long id
+ ) {
+ administratorRepository.deleteById(id);
+ }
+}
\ No newline at end of file
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/service/AdministratorUpdateCommand.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/service/AdministratorUpdateCommand.java
new file mode 100644
index 0000000..062c04a
--- /dev/null
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/service/AdministratorUpdateCommand.java
@@ -0,0 +1,42 @@
+package com.bpgroup.poc.admin.domain.admin.service;
+
+import com.bpgroup.poc.admin.domain.admin.entity.Administrator;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Getter;
+import lombok.ToString;
+
+@Getter
+@ToString
+public class AdministratorUpdateCommand {
+
+ @NotNull
+ private Long id;
+
+ @NotBlank
+ private String password;
+
+ @NotBlank
+ private String email;
+
+ @NotBlank
+ private String name;
+
+ public static AdministratorUpdateCommand of(Long id, String password, String email, String name) {
+ AdministratorUpdateCommand command = new AdministratorUpdateCommand();
+ command.id = id;
+ command.password = password;
+ command.email = email;
+ command.name = name;
+ return command;
+ }
+
+ public Administrator toEntity() {
+ return Administrator.builder()
+ .password(password)
+ .email(email)
+ .name(name)
+ .build();
+ }
+
+}
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/service/DuplicationAdministratorException.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/service/DuplicationAdministratorException.java
new file mode 100644
index 0000000..096ff82
--- /dev/null
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/service/DuplicationAdministratorException.java
@@ -0,0 +1,7 @@
+package com.bpgroup.poc.admin.domain.admin.service;
+
+public class DuplicationAdministratorException extends RuntimeException {
+ public DuplicationAdministratorException(String loginId) {
+ super("이미 존재하는 아이디 입니다. : " + loginId);
+ }
+}
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/service/NotFoundAdministratorException.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/service/NotFoundAdministratorException.java
new file mode 100644
index 0000000..103abc3
--- /dev/null
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/domain/admin/service/NotFoundAdministratorException.java
@@ -0,0 +1,9 @@
+package com.bpgroup.poc.admin.domain.admin.service;
+
+import com.bpgroup.poc.admin.domain.DomainException;
+
+public class NotFoundAdministratorException extends DomainException {
+ public NotFoundAdministratorException() {
+ super();
+ }
+}
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/security/SecurityConfig.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/security/SecurityConfig.java
index 9261d37..04a2ead 100644
--- a/poc/admin/src/main/java/com/bpgroup/poc/admin/security/SecurityConfig.java
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/security/SecurityConfig.java
@@ -37,12 +37,11 @@ public class SecurityConfig {
}).addFilterAfter(new CsrfCookieFilter(), BasicAuthenticationFilter.class); // 로그인이 완료된 후 CSRF Filter 를 실행
// 인증 설정
- http.authorizeHttpRequests(c -> {
- c.requestMatchers("/css/**", "/images/**", "/js/**").permitAll()
- .requestMatchers("/common/modal/**").permitAll()
- .requestMatchers(LOGIN_PATH, LOGOUT_PATH, ERROR_PATH).permitAll()
- .anyRequest().authenticated();
- });
+ http.authorizeHttpRequests(c -> c
+ .requestMatchers("/css/**", "/images/**", "/js/**").permitAll()
+ .requestMatchers("/common/modal/**").permitAll()
+ .requestMatchers(LOGIN_PATH, LOGOUT_PATH, ERROR_PATH).permitAll()
+ .anyRequest().authenticated());
http.formLogin(c -> c
.loginPage(LOGIN_PATH)
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/security/authentication/AuthenticationFailReason.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/security/authentication/AuthenticationFailReason.java
index 26cfb1c..3240105 100644
--- a/poc/admin/src/main/java/com/bpgroup/poc/admin/security/authentication/AuthenticationFailReason.java
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/security/authentication/AuthenticationFailReason.java
@@ -1,6 +1,7 @@
package com.bpgroup.poc.admin.security.authentication;
import com.bpgroup.poc.admin.app.login.exception.AdministratorNotFoundException;
+import com.bpgroup.poc.admin.app.login.exception.DoNotHaveAnyMenuException;
import com.bpgroup.poc.admin.app.login.exception.InvalidPasswordException;
import lombok.extern.slf4j.Slf4j;
@@ -8,11 +9,14 @@ import lombok.extern.slf4j.Slf4j;
public enum AuthenticationFailReason {
WRONG_LOGIN_ID,
WRONG_PASSWORD,
+ HAVE_NO_MENU,
INTERNAL_ERROR;
public static AuthenticationFailReason from(Exception e) {
if (e instanceof AdministratorNotFoundException || e instanceof InvalidPasswordException) {
return WRONG_LOGIN_ID;
+ } else if (e instanceof DoNotHaveAnyMenuException) {
+ return HAVE_NO_MENU;
} else {
return INTERNAL_ERROR;
}
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/web/common/CommonResponse.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/web/common/CommonResponse.java
new file mode 100644
index 0000000..ca06769
--- /dev/null
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/web/common/CommonResponse.java
@@ -0,0 +1,8 @@
+package com.bpgroup.poc.admin.web.common;
+
+public class CommonResponse {
+
+ protected String resultCode;
+ protected String resultMessage;
+
+}
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/web/login/LoginController.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/web/login/LoginController.java
index 79e5d0a..e7761e5 100644
--- a/poc/admin/src/main/java/com/bpgroup/poc/admin/web/login/LoginController.java
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/web/login/LoginController.java
@@ -26,7 +26,8 @@ public class LoginController {
private String getMessage(AuthenticationFailReason error) {
return switch (error) {
case WRONG_LOGIN_ID, WRONG_PASSWORD -> "아이디 또는 비밀번호가 일치하지 않습니다.";
- case INTERNAL_ERROR -> "서버에 오류가 발생했습니다.";
+ case HAVE_NO_MENU -> "등록된 메뉴가 없습니다.\n 메뉴 등록 후 이용해주세요.";
+ default -> "서버에 오류가 발생했습니다.";
};
}
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/management/AdministratorManagementQueryRepository.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/management/AdministratorManagementQueryRepository.java
new file mode 100644
index 0000000..2e223a8
--- /dev/null
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/management/AdministratorManagementQueryRepository.java
@@ -0,0 +1,40 @@
+package com.bpgroup.poc.admin.web.main.admin.management;
+
+import com.bpgroup.poc.admin.web.main.admin.management.reqres.AdministratorFind;
+import com.querydsl.core.types.Projections;
+import com.querydsl.jpa.impl.JPAQueryFactory;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+import static com.bpgroup.poc.admin.domain.admin.entity.QAdministrator.administrator;
+
+@Repository
+@RequiredArgsConstructor
+public class AdministratorManagementQueryRepository {
+
+ private final JPAQueryFactory queryFactory;
+
+ public List findAll() {
+ return queryFactory.select(Projections.fields(AdministratorFind.Response.class,
+ administrator.id,
+ administrator.loginId,
+ administrator.email,
+ administrator.name))
+ .from(administrator)
+ .fetch();
+ }
+
+ public AdministratorFind.Response findByLoginId(String loginId) {
+ return queryFactory.select(Projections.fields(AdministratorFind.Response.class,
+ administrator.id,
+ administrator.loginId,
+ administrator.email,
+ administrator.name))
+ .from(administrator)
+ .where(administrator.loginId.eq(loginId))
+ .fetchOne();
+
+ }
+}
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/management/AdministratorManagementRestController.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/management/AdministratorManagementRestController.java
new file mode 100644
index 0000000..3d35078
--- /dev/null
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/management/AdministratorManagementRestController.java
@@ -0,0 +1,83 @@
+package com.bpgroup.poc.admin.web.main.admin.management;
+
+import com.bpgroup.poc.admin.web.main.admin.management.reqres.AdministratorCreate;
+import com.bpgroup.poc.admin.web.main.admin.management.reqres.AdministratorDelete;
+import com.bpgroup.poc.admin.web.main.admin.management.reqres.AdministratorFind;
+import com.bpgroup.poc.admin.web.main.admin.management.reqres.AdministratorUpdate;
+import jakarta.validation.constraints.NotBlank;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/admin/management")
+public class AdministratorManagementRestController {
+
+ private final AdministratorManagementWebService administratorManagementWebService;
+
+ /**
+ * 전체 조회
+ * @return 응답
+ */
+ @GetMapping("/list")
+ public ResponseEntity> getAdministrators() {
+ List response = administratorManagementWebService.findAll();
+ return ResponseEntity.ok(response);
+ }
+
+ /**
+ * 조회
+ * @param loginId 관리자 ID
+ * @return 응답
+ */
+ @GetMapping("/{loginId}")
+ public ResponseEntity> getAdministrator(@PathVariable @NotBlank String loginId) {
+ AdministratorFind.Response response = administratorManagementWebService.find(loginId);
+ return ResponseEntity.ok(response);
+ }
+
+ /**
+ * 관리자 등록
+ * @param request 요청
+ * @param bindingResult Validation 결과
+ * @return 응답
+ */
+ @PostMapping("/create")
+ public ResponseEntity> createAdministrator(
+ @RequestBody @Validated AdministratorCreate.Request request,
+ BindingResult bindingResult
+ ) {
+ AdministratorCreate.Response response = administratorManagementWebService.create(request);
+ return ResponseEntity.ok(response);
+ }
+
+ @PostMapping("/update")
+ public ResponseEntity> updateAdministrator(
+ @RequestBody @Validated AdministratorUpdate.Request request,
+ BindingResult bindingResult
+ ) {
+ administratorManagementWebService.update(request);
+ return ResponseEntity.ok().build();
+ }
+
+ /**
+ * 관리자 삭제
+ * @param request 요청
+ * @param bindingResult Validation 결과
+ * @return 응답
+ */
+ @PostMapping("/delete")
+ public ResponseEntity> deleteAdministrator(
+ @RequestBody @Validated AdministratorDelete.Request request,
+ BindingResult bindingResult
+ ) {
+ administratorManagementWebService.delete(request);
+ return ResponseEntity.ok().build();
+ }
+
+}
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/management/AdministratorManagementWebService.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/management/AdministratorManagementWebService.java
new file mode 100644
index 0000000..03c6d50
--- /dev/null
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/management/AdministratorManagementWebService.java
@@ -0,0 +1,61 @@
+package com.bpgroup.poc.admin.web.main.admin.management;
+
+import com.bpgroup.poc.admin.domain.admin.service.AdministratorCreateCommand;
+import com.bpgroup.poc.admin.domain.admin.service.AdministratorService;
+import com.bpgroup.poc.admin.domain.admin.service.AdministratorUpdateCommand;
+import com.bpgroup.poc.admin.web.main.admin.management.reqres.AdministratorCreate;
+import com.bpgroup.poc.admin.web.main.admin.management.reqres.AdministratorDelete;
+import com.bpgroup.poc.admin.web.main.admin.management.reqres.AdministratorFind;
+import com.bpgroup.poc.admin.web.main.admin.management.reqres.AdministratorUpdate;
+import jakarta.validation.constraints.NotBlank;
+import lombok.RequiredArgsConstructor;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor
+@Transactional
+public class AdministratorManagementWebService {
+
+ private final PasswordEncoder passwordEncoder;
+
+ private final AdministratorService administratorService;
+ private final AdministratorManagementQueryRepository administratorManagementQueryRepository;
+
+ public AdministratorCreate.Response create(AdministratorCreate.Request request) {
+ Long id = administratorService.create(AdministratorCreateCommand.of(
+ request.getLoginId(),
+ passwordEncoder.encode(request.getPassword()),
+ request.getEmail(),
+ request.getName()
+ ));
+
+ return AdministratorCreate.Response.builder()
+ .id(id)
+ .build();
+ }
+
+ public AdministratorFind.Response find(@NotBlank String loginId) {
+ return administratorManagementQueryRepository.findByLoginId(loginId);
+ }
+
+ public void delete(AdministratorDelete.Request request) {
+ administratorService.delete(request.getId());
+ }
+
+ public void update(AdministratorUpdate.Request request) {
+ administratorService.update(AdministratorUpdateCommand.of(
+ request.getId(),
+ passwordEncoder.encode(request.getPassword()),
+ request.getEmail(),
+ request.getName()
+ ));
+ }
+
+ public List findAll() {
+ return administratorManagementQueryRepository.findAll();
+ }
+}
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/management/reqres/AdministratorCreate.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/management/reqres/AdministratorCreate.java
new file mode 100644
index 0000000..11c455d
--- /dev/null
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/management/reqres/AdministratorCreate.java
@@ -0,0 +1,51 @@
+package com.bpgroup.poc.admin.web.main.admin.management.reqres;
+
+import com.bpgroup.poc.admin.web.common.CommonResponse;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Builder;
+import lombok.Data;
+import lombok.Getter;
+import lombok.ToString;
+
+public class AdministratorCreate {
+
+ @Data
+ public static class Request {
+ @NotBlank
+ private String loginId;
+
+ @NotBlank
+ private String password;
+
+ @NotBlank
+ private String email;
+
+ @NotBlank
+ private String name;
+ }
+
+ @Getter
+ @ToString
+ public static class Response extends CommonResponse {
+
+ private Long id;
+
+ @Builder
+ public static Response success(Long id) {
+ Response response = new Response();
+ response.resultCode = "0000";
+ response.resultMessage = "Success";
+ response.id = id;
+ return response;
+ }
+
+ @Builder
+ public static Response fail() {
+ Response response = new Response();
+ response.resultCode = "9999";
+ response.resultMessage = "Fail";
+ return response;
+ }
+ }
+
+}
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/management/reqres/AdministratorDelete.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/management/reqres/AdministratorDelete.java
new file mode 100644
index 0000000..624f988
--- /dev/null
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/management/reqres/AdministratorDelete.java
@@ -0,0 +1,14 @@
+package com.bpgroup.poc.admin.web.main.admin.management.reqres;
+
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+public class AdministratorDelete {
+
+ @Data
+ public static class Request {
+ @NotNull
+ private Long id;
+ }
+
+}
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/management/reqres/AdministratorFind.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/management/reqres/AdministratorFind.java
new file mode 100644
index 0000000..4168c0e
--- /dev/null
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/management/reqres/AdministratorFind.java
@@ -0,0 +1,17 @@
+package com.bpgroup.poc.admin.web.main.admin.management.reqres;
+
+import lombok.Getter;
+import lombok.ToString;
+
+public class AdministratorFind {
+
+ @Getter
+ @ToString
+ public static class Response {
+ private Long id;
+ private String loginId;
+ private String email;
+ private String name;
+ }
+
+}
diff --git a/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/management/reqres/AdministratorUpdate.java b/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/management/reqres/AdministratorUpdate.java
new file mode 100644
index 0000000..1b5495c
--- /dev/null
+++ b/poc/admin/src/main/java/com/bpgroup/poc/admin/web/main/admin/management/reqres/AdministratorUpdate.java
@@ -0,0 +1,27 @@
+package com.bpgroup.poc.admin.web.main.admin.management.reqres;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+public class AdministratorUpdate {
+
+ @Data
+ public static class Request {
+ @NotNull
+ private Long id;
+
+ @NotBlank
+ private String username;
+
+ @NotBlank
+ private String password;
+
+ @NotBlank
+ private String email;
+
+ @NotBlank
+ private String name;
+ }
+
+}
diff --git a/poc/admin/src/main/resources/data.sql b/poc/admin/src/main/resources/data.sql
index b587923..4c20415 100644
--- a/poc/admin/src/main/resources/data.sql
+++ b/poc/admin/src/main/resources/data.sql
@@ -17,39 +17,17 @@ VALUES ('/admin', '관리자 관리', 2, CURDATE(), CURDATE()),
INSERT INTO `menu` (`uri`, `name`, `sort_order`, `menu_group_id`, `create_date`, `update_date`)
VALUES ('/admin/management', '관리자 관리', 1, 1, CURDATE(), CURDATE()),
- ('/admin/role', '권한 관리', 2, 1, CURDATE(), CURDATE()),
- ('/admin/temp01', '관리자 임시 1', 4, 1, CURDATE(), CURDATE()),
- ('/admin/temp02', '관리자 임시 2', 3, 1, CURDATE(), CURDATE())
+ ('/admin/role', '권한 관리', 2, 1, CURDATE(), CURDATE())
;
INSERT INTO `menu` (`uri`, `name`, `sort_order`, `menu_group_id`, `create_date`, `update_date`)
-VALUES ('/temp/temp01', '임시 01', 4, 3, CURDATE(), CURDATE()),
- ('/temp/temp02', '임시 02', 2, 3, CURDATE(), CURDATE()),
- ('/temp/temp03', '임시 03', 1, 3, CURDATE(), CURDATE()),
- ('/temp/temp04', '임시 04', 3, 3, CURDATE(), CURDATE())
-;
-
-
-INSERT INTO `menu` (`uri`, `name`, `sort_order`, `menu_group_id`, `create_date`, `update_date`)
-VALUES ('/settings/code', '코드 관리', 1, 2, CURDATE(), CURDATE()),
- ('/settings/component', '컴포넌트', 1, 2, CURDATE(), CURDATE()),
- ('/settings/temp01', '세팅 임시 1', 4, 2, CURDATE(), CURDATE()),
- ('/settings/temp02', '세팅 임시 2', 3, 2, CURDATE(), CURDATE())
+VALUES ('/settings/code', '코드 관리', 1, 2, CURDATE(), CURDATE())
;
INSERT INTO `role_menu` (`role_id`, `menu_id`, `create_date`, `update_date`)
VALUES ('1', '1', CURDATE(), CURDATE()),
('1', '2', CURDATE(), CURDATE()),
- ('1', '3', CURDATE(), CURDATE()),
- ('1', '4', CURDATE(), CURDATE()),
- ('1', '5', CURDATE(), CURDATE()),
- ('1', '6', CURDATE(), CURDATE()),
- ('1', '7', CURDATE(), CURDATE()),
- ('1', '8', CURDATE(), CURDATE()),
- ('1', '9', CURDATE(), CURDATE()),
- ('1', '10', CURDATE(), CURDATE()),
- ('1', '11', CURDATE(), CURDATE()),
- ('1', '12', CURDATE(), CURDATE())
+ ('1', '3', CURDATE(), CURDATE())
;
diff --git a/poc/admin/src/main/resources/templates/fragment/csrf/csrf.html b/poc/admin/src/main/resources/templates/fragment/csrf/csrf.html
index 3cf213e..511db91 100644
--- a/poc/admin/src/main/resources/templates/fragment/csrf/csrf.html
+++ b/poc/admin/src/main/resources/templates/fragment/csrf/csrf.html
@@ -5,15 +5,31 @@
+