작성
·
213
0
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.
1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
[질문 내용]
여기에 질문 내용을 남겨주세요.
현재 스프링mvc와 jpa를 활용해서 게시판 프로젝트를 만들고있습니다.
로그인 처리는 세션으로 구현했습니다.
한 유저가 로그인을 해서 게시글을 작성했을때,
그 게시글은 작성한 해당 유저만이 수정 및 삭제를 할수있게 구현을 하는 중입니다.
@GetMapping("/{boardId}/edit")
public String editForm(@PathVariable("boardId") Long boardId, Model model, HttpServletRequest request, HttpServletResponse response) throws IOException {
Optional<Board> findBoardOptional = boardRepository.findByIdJoinFetchMember(boardId);
if (findBoardOptional.isEmpty()) {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return null;
}
MemberSessionDto memberSessionDto = getMemberSessionDto(request);
Board findBoard = findBoardOptional.get();
if (!memberSessionDto.getId().equals(findBoard.getMember().getId())) {
response.sendError(HttpServletResponse.SC_FORBIDDEN);
return null;
}
model.addAttribute("board", findBoard);
return "boards/editForm";
}
현재 이런식으로 해당 게시글의 번호(boardId)로 해당 게시글이 있는지 먼저 검증을 한 후, 세션에 담아둔 유저의 정보를 가져와 해당 게시글을 작성한 유저의 id와 세션의 유저 정보의 id를 비교를 해서 다 검증이 끝나면은 로직이 정상 수행이 되게 만들었는데
막상 이렇게 만드니 수정 페이지이동, 수정, 삭제 에서도
검증하는 로직이 계속 중복됩니다.
@PostMapping("/{boardId}/delete")
public String deleteBoard(@PathVariable("boardId") Long boardId, HttpServletRequest request, HttpServletResponse response) throws IOException {
Optional<Board> findBoardOptional = boardRepository.findByIdJoinFetchMember(boardId);
if (findBoardOptional.isEmpty()) {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return null;
}
MemberSessionDto memberSessionDto = getMemberSessionDto(request);
Board findBoard = findBoardOptional.get();
if (!memberSessionDto.getId().equals(findBoard.getMember().getId())) {
response.sendError(HttpServletResponse.SC_FORBIDDEN);
return null;
}
boardRepository.deleteById(boardId);
return "redirect:/boards";
}
이렇게 똑같이 중복이 됩니다.
이렇게 구현을 하는게 맞는건지, 혹은 더 추천하는 방법이 잇는지, 실무에서는 어떻게 검증을 하는지 여쭈어보고싶습니다.
답변 2
0
안녕하세요, 인프런 AI 인턴입니다.
이준희님의 질문에 대해, 스프링 MVC를 활용한 웹 개발에서 권한 검증 로직의 중복 최소화 방안에 대한 유사한 상황을 해결하는 답변을 찾았습니다.
이준희님은 게시판의 수정 및 삭제에 대한 권한을 검증하는 과정에서 중복된 코드가 발생하고 있음을 지적하셨습니다. 권한 검증 로직이 여러 컨트롤러 메서드에 반복적으로 사용되는 것은 유지 보수성을 저하시킵니다. 실무에서는 이러한 중복을 최소화하는 다양한 방법을 사용합니다.
인터셉터 활용: 요청을 처리하기 전이나 후에 특정 로직을 실행할 수 있게 해주는 인터셉터를 사용하여 권한 검증 로직을 중앙화할 수 있습니다. 이 방법은 특정 패턴을 갖는 URL에 대해 일관된 권한 검증 로직을 적용할 때 유용합니다.
AOP(Aspect-Oriented Programming) 활용: AOP를 사용하면 비즈니스 로직 외의 보안, 로깅, 트랜잭션 관리와 같이 애플리케이션 전반에 걸쳐 사용되는 기능을 모듈화하여 관리할 수 있습니다. AOP를 통해 특정 메서드 실행 전후에 권한 검증 로직을 삽입할 수 있습니다.
이 링크에서는 권한 검증 로직을 Validator, Filter, 또는 Interceptor를 활용하는 것에 대한 논의가 있습니다. Interceptor를 활용하는 방식이 나은지에 대한 질문에, 서비스를 참조하거나 Spring Security로 직접 확인해야 할 경우의 처리에 대해 언급되어 있습니다.
위 링크의 답변 내용이 이준희님의 중복된 권한 검증 로직 관련 문제를 해결하는데 도움이 될 수 있을 것으로 생각됩니다. 실무에서는 코드의 중복을 최소화하고 유지 보수성을 높이기 위해 다양한 스프링의 기능을 활용하여 보다 깔끔하게 권한 검증 로직을 구현합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
인터셉터로 해결했습니다! 감사합니다.
하나 궁금한점은 인터셉터가 레포지토리를 참조해도 괜찮나요?