협업 기반을 잘 다졌더니 2일차동안 정말 큰 문제가 발생 안했다. 팀원분들의 만족도도 높고 중간에 튜터님께 중간 점검을 받으러 갔을 때도 좋은 결과를 얻을 수 있었다.
슬슬 도메인의 인가 처리를 고민하기 시작했다. 처음 접근 방식은 PermissionChecker
유틸을 만들어서 entityOwnerId 와 role을 받아가지고 하는 식을 고민했다. 그렇게 해서 작성했는데 튜터님과 피드백을 통해서 기초적인 권한 체크는 Entity가, 인가에 대한 처리는 Service에서 추가적으로 진행하는 방식을 썼다.
// entity
fun checkPermission(userId: Long, role: String): Boolean {
return this.id == userId || role == "ROLE_ADMIN"
}
// service
private fun checkPermission(user: User, principal: UserPrincipal) {
check(
user.checkPermission(
principal.id,
principal.role
)
) { throw AccessDeniedException("You do not own this user") }
}
Entity는 구체적인 Principal의 객체 정보를 알면 안된다고 생각해서 비슷한 중복 로직이 작성됐다.
이 이유는 고민해보자면 Entity는 Boolean 반환만 목적으로 하고 세부적인 체크의 책임은 Entity에서 한 결과를 가지고 로직에서 세부 처리를 하는 느낌이다.