Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

This application has no explicit mapping for /error, so you are seeing this as a fallback. 본문

Project/블로그 게시판 만들기

This application has no explicit mapping for /error, so you are seeing this as a fallback.

Seung__ 2021. 10. 16. 15:28

1. 현상


  • 로그인 후 글을 수정하려고 시도하면 에러가 발생한다.
  • This application has no explicit mapping for /error, so you are seeing this as a fallback.

 

2. 원인, 결과


  • 이유는 간단했다. url을 변경하면서 안바꿔준 부분이 있었다...
  • url을 수정후 해당 에러가 해결되었다.

 

3. 추가 에러 발생, 현상


  • 그런데 해결 후 submit을 누르면 NullPointerException이 발했다... 
  • DBUG를 해보니 아래 로직 중 loginMember의 id와 post작성자의 id를 비교하는 로직에서 예외가 발생.
  • private boolean hasNoAuthority(MemberDto loginMemberDto, PostDto postDto) { if (loginMemberDto == null || loginMemberDto.getAuthority().equals(Authority.guest) || loginMemberDto.getId() != postDto.getMember().getId()) { return true; } return false; }​

4. 원인


  • 문제의 원인은 간단했다..postDto에 Member가 없다.
    • 왜냐? 저기있는 PostDto는 수정 Form에서 넘어오는 객체로, 변경된 제목 & 내용만 있다..
    • 내가 지은 이름때문에 내가 헷갈렸다..controller에서도 dto로 받아서 헷갈렸다..
    • 기존에 작성한 메서드이다. ModelAttribute로 postForm에서 넘어오는 객체를 받는다.
    • 그리고 이름을 postDto라 했따 ㅋㅋㅋ 그러니 다른 postDto랑 헷갈리게된 것...

 

5. 해결


  • Controller
  • 변경 전
    @PostMapping("/edit/{postId}")
    public String editPost(@PathVariable("postId") Long id, @ModelAttribute("post") PostDto postDto
                            ,HttpServletRequest request,Model model, RedirectAttributes redirectAttributes){

        MemberDto loginMemberDto = getLoginMember(request);

        if (hasNoAuthority(loginMemberDto, postDto)) return "redirect:/posts";
  • 변경 후
    @PostMapping("/edit/{postId}")
    public String editPost(@PathVariable("postId") Long id, @ModelAttribute("post") PostDto postForm
                            ,HttpServletRequest request,Model model, RedirectAttributes redirectAttributes){
         log.info("editPost PostMethod 실행");
        MemberDto loginMemberDto = getLoginMember(request);

        if (hasNoAuthority(loginMemberDto, id)) return "redirect:/posts";

        Post post = editPostUsingDto(id, postForm);


        model.addAttribute("member", loginMemberDto);
        model.addAttribute("post", post.postToDto());
        redirectAttributes.addAttribute("postID", postForm.getId());
        return "redirect:/posts/{postId}";
    }
  • 추가로 검증 로직을 수정해 줬다.
  • 해당 로직은 좀더 안정성이 있어야 하기 때문에 객체를 받기 보다는 id를 받는 로직으로 수정함.
    private boolean hasNoAuthority(MemberDto loginMemberDto, Long postId) {

        log.info("권한 검증");
        Post post = postService.findPostById(postId);

        if (loginMemberDto == null || loginMemberDto.getAuthority().equals(Authority.guest)
        || loginMemberDto.getId() != post.getMember().getId()) {
            return true;
        }
        return false;
    }

 

 

6. 결과


  • 모든 테스트 통과

  • Application실행 수 브라우져에서 테스트 해봐도 사용에 문제가 없다.

 

8. 정리


  • 이름 대충짓지 말자..
  • 공통으로 사용하는 코드는 좀 더 범용적, 안정적으로 작성하자...

 

9. GitHub: 211016 fix bug


 

GitHub - bsh6463/blog

Contribute to bsh6463/blog development by creating an account on GitHub.

github.com

 

'Project > 블로그 게시판 만들기' 카테고리의 다른 글

MockMVC  (0) 2021.10.18
SessionManager Test 추가  (0) 2021.10.17
Optional  (0) 2021.10.16
Test 추가, gerResultList()  (0) 2021.10.16
SpringInterceptor  (0) 2021.10.15
Comments