์ด๋ฐ์ DB ์ฝ๋๋ฅผ ์์ฑํ ๋,
ํ ์ด๋ธ ์ค์ฌ์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ค.
๊ทธ๋ฌ๋ JPA๋ ๊ฐ์ฒด ์ค์ฌ์ด๊ธฐ ๋๋ฌธ์
์ฝ๋๋ฅผ ์์ ํด์ผํ ํ์์ฑ์ ๋๊ผ๋ค.
1. ์ํฉ์ค๋ช
- ์ด๋ฐ ํ๋ก์ ํธ๋ ๊ด๋ฆฌ์ ์์ญ์์ ์ด 3๊ฐ์ ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
- AdminRepository : ๊ด๋ฆฌ์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค.
- PemissionRepository : ๊ถํ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค. ์ง๊ธ ํ๋ก์ ํธ์์ ์ด 5๊ฐ์ง ๊ถํ์ด ์๋ค. ์กฐํ | ์ถ๊ฐ | ์์ | ์ญ์ | ๊ฒ์์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ๊ฐ๊ฐ 1๋ฒ, 2๋ฒ, 3๋ฒ... ์ด๋ฐ์์ผ๋ก ๋ฒํธ๋ฅผ ๋ถ์ฌํ๋ค.
- AdminPermissionRepository : ์ด๋ค ๊ด๋ฆฌ์๊ฐ ์ด๋ค ๊ถํ์ ๊ฐ๊ณ ์๋์ง ์ ์ฅํ๋ค. ์๋ฅผ ๋ค์ด id๊ฐ 1๋ฒ์ธ ๊ด๋ฆฌ์๊ฐ ์กฐํ, ์์ ๊ถํ์ ๊ฐ์ง๊ณ ์์ผ๋ฉด '1-1', '1-3' ๋์ถฉ ์ด๋ฐ์์ผ๋ก ์ ๋ณด๊ฐ ์ ์ฅ๋๋ค.
- ์ฒ์ ๋ก์ง์ ๋ค์๊ณผ ๊ฐ๋ค. ๊ด๋ฆฌ์ ์์ ์ด ์์ฒญ๋๋ฉด ๋ด๋ถ์์ ์๋ ์๋ ๊ด๋ฆฌ์ id๋ฅผ ์ฐพ์ ์ฐ๊ฒฐ๋ ๊ถํ์ ๋ชจ๋ ์ญ์ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์ ์๋กญ๊ฒ ์์ฒญ ๋ฐ์ ๊ถํ์ ์ถ๊ฐ ํ๋ค. => ์ฌ๊ธฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. flush( )๋ฅผ ํตํด ๊ฐ์ ๋ก ์ญ์ ์์ฒญ์ ํด์ผ๋ง ์์ ์ด ์ด๋ค์ง๋ค๋ ๊ฒ์ด๋ค.
- flush( )๋ ์๋ ํ๋ ์์ํฌ๊ฐ ์์์ ํด์ค์ผํ๋ค. ๋ด๊ฐ ์๊ฐํ๋ ๋ก์ง์ ์ญ์ ์์ฒญ์ด ์ผ์ด๋๋ฉด ์์์ flush( )๊ฐ ์ด๋ค์ง ๋ค ์๋ก์ด ์ ๋ณด๋ฅผ insertํ๋๊ฑฐ์๋ค. ๊ทธ๋ฐ๋ฐ ์ง๊ธ ์ฝ๋๋ ์ง์ flush( )๋ฅผ ์์ฑํด์ผ๋ง ์์ ์ด ์๋ฃ๋๋ค. ์ด๊ฑธ ๋ณด๊ณ ์ง๊ธ ์ฝ๋๋ JPA๋ฅผ ์ ๋๋ก ๋ค๋ฃจ์ง ๋ชปํ๊ณ ์๋ค๊ณ ํ๋จํ๋ค.
2. ์์ ์ AdminService ์ฝ๋ ๋ถ์
- ๊ถํ ์ ๋ถ ์ญ์
adminPermissionRepository.deleteByAdminId(id);
adminPermissionRepository.flush();
savePermissions(id, request.getPermissions());
์ด ์ฝ๋๋ AdminPermissionRepository๋ฅผ ์ง์ ์ฃผ์ ๋ฐ์์ ์ฌ์ฉํ๊ณ ์๋ค. ๊ด๋ฆฌ์์ ๊ถํ์ ์ ๋ถ ์ง์ฐ๊ธฐ ์ํด repository๊น์ง ์ง์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. ๊ฒ๋ค๊ฐ ๊ธฐ์กด ๊ถํ์ด๋ ๋๊ฐ์ ์์ ์์ฒญ์ด ๋ค์ด์๋ ์ด ์ฝ๋๋ ๊ธฐ์กด ๊ฑธ ์น์ฐ๊ณ ๋ค์ ๋ฃ๋๋ค. - ์์ ๋ฐฉํฅ → ์ด์ ์ด ๋ถ๋ถ์ ์์ ํด์ผํ๋ค. ํ ์ด๋ธ ์ค์ฌ ๋ฐฉ์์ด ์๋ ๊ฐ์ฒด ์ค์ฌ ๋ฐฉ์์ผ๋ก ๋ฐ๊ฟ์ผํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ถํ์ ๋ชจ๋ ์ญ์ ํ์ง ์๊ณ Admin ์ํฐํฐ ์์ adminPermission ์ปฌ๋ ์ ์ ๊ธฐ์ค์ผ๋ก ์ง์ ๋น๊ตํ์ฌ ์ฒ๋ฆฌํด์ผํ๋ค.
- permissions๊ฐ null์ด ์๋ ๊ฒฝ์ฐ๋ง
if (request.getPermissions() != null) {
assignPermissions(admin, request.getPermissions());
}
List.of("CUSTOMER_READ", "CUSTOMER_READ", " ", null)
permissons๊ฐ null์ด ์๋ ๋๋ง ๊ถํ์ ์ถ๊ฐํ๋ค. ๋๋ฒ์งธ ์ฝ๋์ฒ๋ผ ๋ค์ด์ค๋ฉด ํ์ฌ ์ฝ๋๋ null๋ง ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. ์ฌ์ค null๋ง ์ฒ๋ฆฌํ ์ด์ ๋ ์ด ํ๋ก์ ํธ๊ฐ ์ค์ ์ด์๋ ์๋น์ค๋ ์๋ ๋ฟ๋๋ฌ, ๊ถํ์ ์ฒดํฌ๋ฐ์ค๋ก ํ์ํ๊ธฐ ๋๋ฌธ์ ํฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ ๊ฒ ๊ฐ์์ ๊ทธ๋ ๊ฒ ์์ฑํ๋ค. ๊ทธ๋ฌ๋ ์ด๋ฐ ๋ถ๋ถ๋ ์ด์ค๋ณด์์ฒ๋ผ ๊ผผ๊ผผํ๊ฒ ์์ฑํ๋ ๊ฒ ์ข์ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ค์๋ค. - ์์ ๋ฐฉํฅ → ์๋ก์ด ๋ฉ์๋๋ฅผ ๋ง๋ค์ด์ผํ ๊ฒ ๊ฐ๋ค. null, ๊ณต๋ฐฑ, ์ค๋ณต ๊ถํ ์ฝ๋๋ฅผ ์๋ก์ด ๋ฉ์๋์์ ์ ๋ฆฌํ ๋ค ๋ ๊ผผ๊ผผํ๊ฒ ๋ก์ง์ ์์ฑํด์ผํ ๊ฒ ๊ฐ๋ค.
3. ์์ ํ AdminService ์ฝ๋ ๋ถ์
- ์๋ก์ด ๋ฉ์๋ replacePermission ์์ฑ
["CUSTOMER_READ", "CUSTOMER_ADD"]
๊ด๋ฆฌ์๊ฐ ๊ฐ์ง ๊ถํ ๋ชฉ๋ก์ ํ๋ฉด์์ ์๋ก ๋์ด์จ permissionCodes ๋ชฉ๋ก๊ณผ ๋๊ฐ์ด ๊ต์ฒดํ๋ ์ฝ๋๋ค. ์์ ๊ฐ์ด ๋์ด์ค๋ฉด admin์ ๊ธฐ์กด ๊ถํ ์ค ์ด ๋ชฉ๋ก์ ์๋ ๊ฒ์ ์ญ์ ํ๊ณ , ์๋ ๊ถํ์ ์๋ก ์ถ๊ฐํ๋ค.
// 1.
Set<String> requestedCodes = permissionCodes == null
// 2.
? Set.of()
// 3.
: permissionCodes.stream()
// 4.
.filter(Objects::nonNull)
// 5.
.map(String::trim)
// 6.
.filter(code -> !code.isBlank())
// 7.
.collect(Collectors.toCollection(LinkedHashSet::new));
1. ์์ฒญ์ผ๋ก ๋ค์ด์จ ๊ถํ ์ฝ๋๋ค์ Set์ผ๋ก ์ ๋ฆฌํ๋ค. Set์ ์์์ ์ค๋ณต์ ์ ๊ฑฐํ๋ ํน์ง์ด ์๊ณ contains( )๋ก ํฌํจ ์ฌ๋ถ๋ฅผ ๋น ๋ฅด๊ฒ ํ์ธํ ์ ์๋ค.
2. permissionCodes๊ฐ null์ด๋ฉด ๋น Set์ ๋ง๋ ๋ค. ๊ทธ๋๊น ์์ฒญ ๊ถํ์ด ์๋ฌด๊ฒ๋ ์๋ค๊ณ ์ฒ๋ฆฌํ๋ ๊ฒ์ด๋ค.
3. permissionCodes๊ฐ null์ด ์๋๋ฉด Stream์ผ๋ก ํ๋์ฉ ์ฒ๋ฆฌํ๋ค.
4. null์ธ ๊ถํ ์ฝ๋๋ ์ ๊ฑฐํ๋ค. ["CUSTOMER_READ", null, "CUSTOMER_ADD"]์ผ๋ก ๋ค์ด์๋ค๋ฉด ์ฌ๊ธฐ์ null์ ์ ๊ฑฐํ๋ค.
5. ๊ฐ ๊ถํ์ ์๋ค ๊ณต๋ฐฑ์ ์ ๊ฑฐํ๋ค. " CUSTOMER_READ " -> "CUSTOMER_READ"
6. ๋น ๋ฌธ์์ด์ ์ ๊ฑฐํ๋ค. ["CUSTOMER_READ"," ", "CUSTOMER_ADD"]์ผ๋ก ๋ค์ด์๋ค๋ฉด ์ฌ๊ธฐ์ " "์ ์ ๊ฑฐํ๋ค.
7. ์ต์ข ์ ์ผ๋ก LinkedHashSet์ผ๋ก ๋ชจ์๋ค. ๊ทธ ์ด์ ๋ ์ค๋ณต ์ ๊ฑฐ๋ฅผ ํ๋ฉด์ ์ ๋ ฅ๋ ์์๋ฅผ ์ ์ง์ํค๊ธฐ ์ํจ์ด๋ค.
Q. Set์ด contains( )๋ก ํฌํจ ์ฌ๋ถ๋ฅผ ๋น ๋ฅด๊ฒ ํ์ธํ ์ ์๋ ์ด์ ๋?
A. ํด์ ํ ์ด๋ธ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค. ArrayList๋ ํน์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ธฐ ์ํด ์ฒ์๋ถํฐ ๋๊น์ง ๋ชจ๋ ํ์ธํ๋ค. ๋ง์ฝ N๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์์ ๋, ์ต์ ์ ๊ฒฝ์ฐ N๋ฒ์ ๋ค ์ฐพ์๋ด์ผ ํ๋ฏ๋ก O(N)์ด ๊ฑธ๋ฆฌ๊ฒ ๋๋ค. HashSet์ ์ฃผ์๋ฅผ ๊ณ์ฐํด์ ํ ๋ฒ์ ์ฐพ์๋ธ๋ค. HashSet์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ ๋ด๋ถ์ ์ผ๋ก ํด์ ํจ์๋ฅผ ์ด์ฉํด ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ์ธ๋ฑ์ค๋ฅผ ๋ฏธ๋ฆฌ ๊ณ์ฐํ๋ค.
์๋ฅผ ๋ค์ด, ROLE_ADMIN ์ด๋ผ๋ ๊ถํ ์ฝ๋๊ฐ ๋ค์ด์ค๋ฉด ๋ด๋ถ๋ "ROLE_ADMIN".hashCode( )๋ฅผ ํธ์ถํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ณ ์ ํ ์ซ์(์: 12345)๋ฅผ ๋ฝ์๋ด ํด์ ์ฝ๋๋ฅผ ์์ฑํ๋ค. ์ด ์ซ์๋ฅผ ํด์ ํ ์ด๋ธ์ ํฌ๊ธฐ๋ก ๋๋์ด ์ธ๋ฑ์ค๋ฅผ ์์๋ธ๋ค. ๊ทธ๋์ ์ ์ฅํ ๋ 5๋ฒ์ด๋ฉด, 5๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์ง์ด๋ฃ๋๋ค. ํธ์ถํ ๋๋ ๋ง์ฐฌ๊ฐ์ง๋ค. contains("ROLE_ADMIN")์ ํธ์ถํ๋ฉด, ๋๊ฐ์ด ๊ณ์ฐํด์ ๋ฐ๋ก 5๋ฒ์ผ๋ก ์งํํ ๋ค, ๊ฑฐ๊ธฐ์ ๋ฐ์ดํฐ๊ฐ ์๋์ง ํ์ธํ๋ค.
์ด๋ฐ ๊ณ์ฐ์ผ๋ก ๋ฐ์ดํฐ๊ฐ ์์ฒญ๋๊ฒ ๋ง์๋ ๋ฐฉ ๋ฒํธ๋ฅผ ๊ณ์ฐํ๋ ๋จ ํ ๋ฒ์ ๊ณผ์ ๋ง ๊ฑฐ์น๋ฏ๋ก ํ๊ท ์ ์ผ๋ก O(1)์ด ๊ฑธ๋ฆฐ๋ค.
if (requestedCodes.isEmpty()) {
admin.getAdminPermissions().clear();
return;
}
์ ๋ฆฌ๋ ์์ฒญ ๊ถํ ์ฝ๋๊ฐ ํ๋๋ ์๋ ๊ฒฝ์ฐ admin์ด ๊ฐ์ง๊ณ ์๋ ๊ถํ ๋ชฉ๋ก์ ์ ๋ถ ๋น์ด๋ค. ์ด์ ์ด ๊ด๋ฆฌ์๋ ์๋ฌด ๊ถํ๋ ๊ฐ์ง์ง ์๊ฒ ๋๋ ๊ฒ์ด๋ค. ๋์ด์ ์ฒ๋ฆฌํ ๊ถํ์ด ์์ผ๋ return์ผ๋ก ๋ฉ์๋๋ฅผ ์ข ๋ฃํ๋ค.
List<Permission> permissions = permissionRepository.findByCodeIn(List.copyOf(requestedCodes));
requestCodes์ ์๋ ๊ถํ ์ฝ๋๋ค์ด ์ค์ permission ํ ์ด๋ธ์ ์กด์ฌํ๋์ง ์กฐํํ๋ค. findByCodeIn์ด DB์์ ํด๋น code๋ฅผ ๊ฐ์ง Permission๋ค์ ์ฐพ์์จ๋ค.
List.copyOf๋ ํ๋ผ๋ฏธํฐ ํ์ ์ ๋ง์ถ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค. CodeIn์ ๋ฉ์๋ ์ด๋ฆ์์ ์ ์ ์๋ฏ์ด SQL์ IN์ ์ ์์ฑํ๋ค.(์์: WHERE code IN (?, ?, ...)) JPA์์ IN ์ฟผ๋ฆฌ ๋ฉ์๋๋ฅผ ์ ์ํ ๋, ํ๋ผ๋ฏธํฐ ํ์ ์ List<String>์ผ๋ก ์ ์ธํด ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ํ์ง๋ง ํ์ฌ requestedCode์ ํ์ ์ Set<String>์ด๋ค. ๊ทธ๋์ Set ํ์ ์ List ํ์ ์ผ๋ก ๋ณํํ๊ธฐ ์ํด List.copyOf๋ฅผ ์ฌ์ฉํ๋ค.
์ฌ์ค new ArrayList<>(requestedCodes)๋ก ์จ๋๋๋ค. ๊ทธ๋ฐ๋ฐ List.copyOf๋ฅผ ์ฌ์ฉํ ์ด์ ๋ ์์ ๋ถ๊ฐ๋ฅํ List๋ฅผ ๋ง๋ค๊ธฐ ์ํจ์ด๋ค. ์๋๋ฉด Collection<String>์ผ๋ก ๋ฐ๊ฟ๋ ๋๋ค.
Set<String> foundCodes = permissions.stream()
// Permission ๊ฐ์ฒด์์ code๋ง ๊บผ๋ธ๋ค.
// Permission(code="CUSTOMER_READ") -> "CUSTOMER_READ"
.map(Permission::getCode)
// ๊บผ๋ธ code ๊ฐ๋ค์ Set์ผ๋ก ๋ชจ์๋ค.
.collect(Collectors.toSet());
DB์์ ์ค์ ๋ก ์ฐพ์ ๊ถํ ์ฝ๋๋ฅผ Set์ผ๋ก ๋ชจ์ผ๋ ์ฝ๋์ด๋ค.
List<String> missingCodes = requestedCodes.stream()
// requestCodes ์ค foundCodes์ ์๋ code๋ง ๋จ๊ธด๋ค.
.filter(code -> !foundCodes.contains(code))
// ๊ทธ ๊ฒฐ๊ณผ๋ฅผ List๋ก ๋ฐํํ๋ค.
.toList();
์์ฒญ์ผ๋ก ๋ค์ด์จ ๊ถํ ์ฝ๋ ์ค์์ DB์์ ์ฐพ์ง ๋ชปํ ๊ถํ ์ฝ๋๋ค์ missingCodes์ ๋ด๋๋ค.
if (!missingCodes.isEmpty()) {
throw new IllegalArgumentException("์กด์ฌํ์ง ์๋ ๊ถํ ์ฝ๋์
๋๋ค: " + String.join(", ", missingCodes));
}
DB์ ์กด์ฌํ์ง ์๋ ๊ถํ ์ฝ๋๊ฐ ํ๋๋ผ๋ ์๋ค๋ฉด ์๋ชป๋ ๊ถํ ์ฝ๋๊ฐ ์์ฒญ๋์์ผ๋ฏ๋ก ์์ธ๋ฅผ ๋ฐ์์ํจ๋ค.
admin.getAdminPermissions().removeIf(adminPermission -> {
// 1.
Permission permission = adminPermission.getPermission();
// 2.
return permission == null
// 3.
|| permission.getCode() == null
// 4.
|| !requestedCodes.contains(permission.getCode());
});
ํ์ฌ admin์ด ๊ฐ์ง๊ณ ์๋ ๊ถํ ์ค์์ ์์ฒญ ๊ถํ ๋ชฉ๋ก์ ์๋ ๊ถํ์ ์ ๊ฑฐํ๋ค. removeIf๊ฐ ์ปฌ๋ ์ ์์ ์์๋ฅผ ํ๋์ฉ ๋ณด๋ฉด์, ์กฐ๊ฑด์ด true์ธ ์์๋ฅผ ์ญ์ ํ๋ค. ์๋ ๋ ๊ตฌ์ฒด์ ์ผ๋ก ์ค๋ช ์ ์ ์ด๋ณด๊ฒ ๋ค.
// ๊ตฌ์กฐ๊ฐ ์ด๋ ๊ฒ ์์ผ๋ฉด removeIf๊ฐ AdminPermission์ ํ๋์ฉ ๊บผ๋ด์ ๊ฒ์ฌํ๋ค.
// removeIf๋ ์ง์ ๋ฐ๋ณตํ๋ฉด์ ์ญ์ ๊น์ง ํด์ฃผ๋ ๋ฉ์๋์ด๋ค.
Admin
โโโ adminPermissions
โโโ AdminPermission(admin=admin, permission=CUSTOMER_READ)
โโโ AdminPermission(admin=admin, permission=CUSTOMER_ADD)
โโโ AdminPermission(admin=admin, permission=CUSTOMER_DELETE)
// Permission permission = adminPermission.getPermission();
// AdminPermission์ admin๊ณผ permission์ ์ฐ๊ฒฐํ๋ ์ค๊ฐ ๊ฐ์ฒด์ธ๋ฐ
// ์ฌ๊ธฐ์ ๊ทธ ์์ ๋ค์ด์๋ ์ค์ ๊ถํ Permission์ ๊บผ๋ธ๋ค.
AdminPermission
โโโ admin = adminA
โโโ permission = CUSTOMER_READ
// adminPermission.getPermission()์ ํ๋ฉด CUSTOMER_READ์ ํด๋นํ๋ Permission ๊ฐ์ฒด๊ฐ ๋์จ๋ค.
// ์ฌ๊ธฐ์ true๊ฐ ๋์ค๋ฉด ์ญ์ ๋๋ค.
// ์ ์์ ์ธ ๋ฐ์ดํฐ๋ AdminPermission(admin=admin, permission=CUSTOMER_READ) ์ด๋ฐ ํํ์ธ๋ฐ
// AdminPermission(admin=admin, permission=null) ์ด๋ฐ ๋ฐ์ดํฐ๊ฐ ์ค๋ฉด ์ญ์ ํ๋ค.
return permission == null
// ์ ์์ ์ธ ๋ฐ์ดํฐ๋ Permission(code="CUSTOMER_READ") ์ด๋ฐ ํํ์ธ๋ฐ
// Permission(code=null) ์ด๋ฐ ์ํ๋ฉด ์ญ์ ํ๋ค.
|| permission.getCode() == null
// ์ค์ ๋ก ๊ถํ์ด ๊ต์ฒด๋๋ ์ฝ๋์ด๋ค.
// ํ์ฌ admin์ด ๊ฐ์ง ๊ถํ ์ฝ๋๊ฐ, ์๋ก ์์ฒญ๋ ๊ถํ ๋ชฉ๋ก์ ์์ผ๋ฉด ์ญ์ ํ๋ค.
// ๊ธฐ์กด ๊ถํ: CUSTOMER_READ, CUSTOMER_ADD, CUSTOMER_DELETE
// ์์ ์์ฒญ: requestedCodes: CUSTOMER_READ, CUSTOMER_ADD
// ํ๋์ฉ ๊ฒ์ฌํ๋ฉด CUSTOMER_READ, CUSTOMER_ADD๋ ture๊ฐ ๋๋๋ฐ !๊ฐ ๋ถ์ด์ False๊ฐ ๋๋ค.
// ๊ทธ๋์ ์ญ์ ๊ฐ ์๋๊ณ CUSTOMER_DELETE๋ FAlSE๋ก !๊ฐ ๋ถ์ด true๊ฐ ๋์ด ์ญ์ ๋๋ค.
|| !requestedCodes.contains(permission.getCode());
Set<String> existingCodes = admin.getAdminPermissions().stream()
// 1.
.map(AdminPermission::getPermission)
// 2.
.filter(Objects::nonNull)
// 3.
.map(Permission::getCode)
// 4.
.filter(Objects::nonNull)
// 5.
.collect(Collectors.toSet());
removeIf ์ดํ์๋ admin์๊ฒ ๋จ์ ์๋ ๊ถํ ์ฝ๋๋ค์ ๋ชจ์๋ค. ๋์ค์ ์ค๋ณต ์ถ๊ฐ๋ฅผ ๋ง๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
1. AdminPermission์์ Permission ๊ฐ์ฒด๋ฅผ ๊บผ๋ธ๋ค.
2. Permission์ด null์ธ ๊ฒฝ์ฐ ์ ์ธํ๋ค.
3. Permission ๊ฐ์ฒด์์ code๋ง ๊บผ๋ธ๋ค.
4. code๊ฐ null์ธ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๋ค.
5. ์ต์ข ์ ์ผ๋ก ํ์ฌ admin์ด ์ด๋ฏธ ๊ฐ์ง๊ณ ์๋ ๊ถํ ์ฝ๋๋ค์ Set์ผ๋ก ๋ชจ์๋ค.
for (Permission permission : permissions) {
// 1.
if (existingCodes.contains(permission.getCode())) {
continue;
}
// 2.
AdminPermission adminPermission = new AdminPermission();
// 3.
adminPermission.setAdmin(admin);
// 4.
adminPermission.setPermission(permission);
// 5.
admin.getAdminPermissions().add(adminPermission);
}
}
removeIf๋ก ๊ธฐ์กด ๊ถํ์ ์ญ์ ํ๋ค. ์ด์ ์๋ก์ด ๊ถํ์ ์ง์ด๋ฃ์ด์ผํ๋ค. DB์์ ์กฐํํ ์ค์ Permission ๋ชฉ๋ก์ ํ๋์ฉ ๋ฐ๋ณตํ๋ค.
1. ํ์ฌ admin์ด ์ด ๊ถํ์ ๊ฐ์ง๊ณ ์๋ค๋ฉด ์๋ก ์ถ๊ฐํ ํ์๊ฐ ์์ผ๋ฏ๋ก ๋ค์ permission์ผ๋ก ๋์ด๊ฐ๋ค.
2. admin์๊ฒ ์๋ ๊ถํ์ด๋ผ๋ฉด ์ AdminPermission ๊ฐ์ฒด๋ฅผ ๋ง๋ ๋ค.
3. ์ AdminPermission์ ํ์ฌ admin์ ์ฐ๊ฒฐํ๋ค.
4. ์ AdminPermission์ ์ถ๊ฐํ Pemission์ ์ฐ๊ฒฐํ๋ค.
5. admin์ ๊ถํ ๋ชฉ๋ก์ ์ AdminPemission์ ์ถ๊ฐํ๋ค.
์ฒ์ ์ฝ๋๋ ์์ ์์ฒด๊ฐ ์์ฒญ๋๋ฉด ๊ด๋ฆฌ์์ ๊ถํ์ ๋ชจ๋ ์ญ์ ํ๊ณ ๋ค์ ์ ์ฅํ๋ค. ๊ทธ๋ฐ๋ฐ ์ด์ ๋ ์ฝ๋๋ฅผ ๋ฐ๊ฟ์ ๋ฐ๋ ๊ถํ์ ํ์ธํ๊ณ ๊ทธ ๊ถํ๋ง ์ญ์ ํ๊ฑฐ๋ ์ถ๊ฐํ๋ ๋ฐฉ์์ผ๋ก ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๋ค. AdminPermissionRepository๋ฅผ ์ง์ ์ฌ์ฉํ๋ ์ด์ ์ฝ๋์ ๋ฌ๋ฆฌ ์์กด์ฑ์ด ํ ์ค์ด๋ ์ฝ๋์ด๋ค.