36강에서는 글(Post)과 댓글(PostComment)의 권한 체크 로직을
컨트롤러에서 제거하고 엔티티로 이동하는 리팩토링을 진행했다.
겉으로 보면 단순히 코드 위치만 바뀐 것 같지만,
실제로는 역할 분리 + 객체지향 설계 원칙을 적용한 중요한 변화다.
강의에서 먼저 짚고 간 개념이 있다.
“너 누구야?”
“너 이거 할 수 있어?”
👉 이번 강의의 핵심은
인가 로직을 어디에 두는 게 맞느냐다.
리팩토링 전 컨트롤러 코드는 이런 형태였다.
Member actor = rq.getActor();
Post post = postService.findById(id).get();
if (!actor.equals(post.getAuthor()))
throw new ServiceException("403-1", "글 삭제 권한이 없습니다.");
문제점은 뭘까?
👉 중복 + 역할 과다
컨트롤러의 역할은 명확하다.
즉,
❌ 규칙 판단
❌ 비즈니스 결정
이런 건 컨트롤러 책임이 아니다.
36강에서는 권한 체크 로직을 엔티티 내부로 이동했다.
public void checkActorCanModify(Member actor) {
if (!author.equals(actor))
throw new ServiceException("403-1", "글 수정 권한이 없습니다.");
}
public void checkActorCanDelete(Member actor) {
if (!author.equals(actor))
throw new ServiceException("403-2", "글 삭제 권한이 없습니다.");
}
public void checkActorCanModify(Member actor) {
if (!author.equals(actor))
throw new ServiceException("403-1", "댓글 수정 권한이 없습니다.");
}
public void checkActorCanDelete(Member actor) {
if (!author.equals(actor))
throw new ServiceException("403-2", "댓글 삭제 권한이 없습니다.");
}
이제 컨트롤러는 묻기만 한다.
Member actor = rq.getActor();
Post post = postService.findById(id).get();
post.checkActorCanDelete(actor);
postService.delete(post);
👉 훨씬 읽기 쉬워지고 역할이 명확해졌다.
이 질문이 핵심이다.
이건 Post, PostComment 자체의 규칙이다.
👉 규칙은 객체가 스스로 알고 있어야 한다.
컨트롤러마다 있던
if (!actor.equals(author)) ...
이제 한 군데에만 존재한다.
만약 정책이 바뀐다면?
“관리자는 모든 글을 삭제할 수 있다”
이제 바꿀 곳은?
강의에서 짚은 기준은 이거다.
👉 인가 로직은 엔티티에 더 가깝다.
전체 흐름을 정리하면 이렇게 된다.
각자 역할이 분리됐다.
36강의 핵심은 이 문장이다.
“비즈니스 규칙은 컨트롤러가 아니라
그 규칙의 주인인 객체가 가져야 한다.”
이 리팩토링은 단순한 코드 이동이 아니라
“어디에 어떤 책임을 둘 것인가”에 대한 연습이다.