JPA일정관리 프로그램_오류수정

지혜·2025년 2월 11일
0

💡 https://github.com/cjh0412/Schedule_jpa

1. 회원가입 중복 체크하기

1. 발견 배경

사용자 로그인을 진행할 때 다음과 같은 오류가 나타났다.
org.hibernate.NonUniqueResultException: Query did not return a unique result
오류원인
1. 하나의 결과를 요청했으나 조회된 데이터가 2개 이상인 경우 발생
2. 사용자 회원가입 시 동일한 email 사용이 제한되어있지 않아 발생
따라서 email을 중복체크하여 동일한 email사용자가 존재하지 않도록 수정했다.

2. isPresent(), isEmpty()의 차이

  • isPresent() : 값이 존재하는지 여부 체크
    • 값이 있을때 true 반환
  • isEmpty() : 값이 존재하지 않는지 여부 체크
    • 값이 없을때 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());
    }

2. 페이징 처리

Pageable, Page 인터페이스

  • Pageable : 페이징 요청을 위한 인터페이스(page, size, sort)
  • Page : 페이징된 결과를 반환하는 인터페이스(content, totalElements, totalPages)

🤔 Page는 왜 필요할까?

코드를 작성하다 문득 의문이 들었다.
왜냐하면 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가 필요한 이유

  • 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로 정보 반환까지 해야 완벽한 페이지네이션 처리!

3. 댓글 수정

댓글 작성시 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);
    }

0개의 댓글

관련 채용 정보