사용자 로그인을 진행할 때 다음과 같은 오류가 나타났다.
org.hibernate.NonUniqueResultException: Query did not return a unique result
오류원인
1. 하나의 결과
를 요청했으나 조회된 데이터가 2개 이상인 경우 발생
2. 사용자 회원가입 시 동일한 email 사용이 제한되어있지 않아 발생
따라서 email을 중복체크하여 동일한 email사용자가 존재하지 않도록 수정했다.
2. isPresent(), isEmpty()의 차이
true
반환true
반환이 경우에는 email값이 존재
할 경우 exception처리를 해야하기 때문에 isPresent()를 이용하여 값 존재 여부를 체크
public MemberResponseDto save(String username, String email, String password) {
// 이메일 체크 코드 추가
if(memberRepository.findByEmail(email).isPresent()){
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "이미 회원가입된 이메일입니다.");
}
Member member = new Member(username, email, encoder.encode(password));
memberRepository.save(member);
return new MemberResponseDto(member.getId(), member.getUsername(), member.getEmail());
}
Pageable, Page 인터페이스
- Pageable : 페이징 요청을 위한 인터페이스(
page
,size
,sort
)- Page : 페이징된 결과를 반환하는 인터페이스(
content
,totalElements
,totalPages
)
코드를 작성하다 문득 의문이 들었다.
왜냐하면 Page를 사용하지 않아도 페이징 처리가 되었기 때문이다.
// 기존코드
//controller
@GetMapping
public ResponseEntity<List<MemberResponseDto>> findAll(Pageable pageable){
List<MemberResponseDto> responseDtoList = memberService.findAll(pageable);
return new ResponseEntity<>(responseDtoList, HttpStatus.OK);
}
// service
public List<MemberResponseDto> findAll(Pageable pageable) {
return memberRepository.findAll(pageable)
.stream()
.map(MemberResponseDto::toDto)
.toList();
}
Page
를 사용하지 않고 위와 같이 List<MemberResponseDto>
로 값을 반환한 경우 전체 데이터 개수(totalElements) 값과 총 페이지 수(totalPages)의 정보를 알 수 없음.// 수정후 코드
//controller
@GetMapping
public ResponseEntity<Page<MemberResponseDto>> findAll(Pageable pageable){
Page<MemberResponseDto> responseDtoPage = memberService.findAll(pageable);
return new ResponseEntity<>(responseDtoPage, HttpStatus.OK);
}
// service
public Page<MemberResponseDto> findAll(Pageable pageable) {
return memberRepository.findAll(pageable)
.map(MemberResponseDto::toDto);
}
Pageable
은 요청 정보를 전달만 하는 역할Page
를 통해 전체 데이터 수, 전체 페이지 수를 알 수 있음💡 따라서 pageable로 정보 요청 + page로 정보 반환까지 해야 완벽한 페이지네이션 처리!
댓글 작성시 memberId가 아닌 todoId를 service에 보내는것을 확인했다.
따라서 todoId -> memberId로 변경하여 코드 수정.
//controller
@PatchMapping("/{id}")
public ResponseEntity<Void> updateComment(@PathVariable Long id, HttpServletRequest request, @RequestBody CommentRequestDto commentRequestDto){
HttpSession session = request.getSession();
Long memberId = (Long) session.getAttribute("token");
//수정 전
//commentService.updateComment(id, commentRequestDto.getContent(), commentRequestDto.getTodoId());
// 수정후(todoId -> memberId로 수정)
commentService.updateComment(id, commentRequestDto.getContent(), commentRequestDto.getTodoId());
return new ResponseEntity<>(HttpStatus.OK);
}