Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 인프런
- Spring Boot
- pointcut
- 자바
- AOP
- Thymeleaf
- 그리디
- SpringBoot
- Servlet
- 스프링 핵심 원리
- jpa
- spring
- Exception
- transaction
- springdatajpa
- 알고리즘
- 스프링
- Greedy
- java
- Proxy
- 스프링 핵심 기능
- 백준
- 김영한
- db
- Android
- JPQL
- http
- kotlin
- JDBC
- QueryDSL
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:281. 현상
- 로그인 후 글을 수정하려고 시도하면 에러가 발생한다.
- 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
'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