본문 바로가기
💻 뚝딱뚝딱/북북클럽

[개발일지 #033] 책(Book) 중복 등록 시 예외 처리 하기

by 뚜루리 2025. 5. 2.
728x90
320x100

🎯 오늘 개발 할 기능

  • 특정 회원의 피드 목록 조회 구현
  • 특정 회원이 좋아요 누른 피드 목록 조회 구현

🛠️ 문제상황

테스트를 하다보니 책을 중복으로 등록하면 당연히 에러가 발생함. 그런데 에러 메시지가 그냥 500에러로 떨어져 명확하지 않은 상태.

 

📌  BookRepository.java 수정

/**
 * Book 데이터 액세스 레포지토리
 */
public interface BookRepository extends JpaRepository<Book, Long> {
    //코드생략//
    boolean existsByIsbn(String isbn);
}

 

 

📌  BookService.java 수정

package ddururi.bookbookclub.domain.book.service;

/**
 * 책 관련 비즈니스 로직 처리
 */
@Service
@RequiredArgsConstructor
@Transactional
public class BookService {

    private final BookRepository bookRepository;

    /**
     * 책 등록
     * @param request 책 등록 요청 데이터
     * @return 등록된 책 정보
     */
    public BookResponse createBook(BookRequest request) {
		//추가
        if (bookRepository.existsByIsbn(request.getIsbn())) {
            throw new DuplicateIsbnException();
        }
        String author = (request.getAuthors() != null && !request.getAuthors().isEmpty())
                ? String.join(", ", request.getAuthors())
                : "알 수 없음";

        Book book = Book.create(
                request.getTitle(),
                author,
                request.getPublisher(),
                request.getIsbn(),
                request.getThumbnailUrl()
        );
        Book savedBook = bookRepository.save(book);
        return new BookResponse(savedBook);
    }
}

 

 

📌  DuplicateIsbnException.java 수정

package ddururi.bookbookclub.domain.book.exception;
/**
 * 중복 ISBN 예외
 * - 책 등록 시 중복 ISBN 검사에 사용
 */
@Getter
public class DuplicateIsbnException extends RuntimeException {
    private final ErrorCode errorCode;

    public DuplicateIsbnException() {
        super(ErrorCode.DUPLICATE_ISBN.getMessage());
        this.errorCode = ErrorCode.DUPLICATE_ISBN;
    }
}

📌  GlobalExceptionHandler.java 수정

    @ExceptionHandler(DuplicateIsbnException.class)
    public ResponseEntity<ApiResponse<Void>> handleDuplicateIsbn(DuplicateIsbnException e) {
        return ResponseEntity.status(HttpStatus.CONFLICT)
                .body(ApiResponse.fail(e.getErrorCode()));
    }

📌  ErrorCode.java 수정

DUPLICATE_ISBN("DUPLICATE_ISBN", "이미 등록된 ISBN입니다.");

 

 

 

[테스트 결과 : 성공]

 

728x90
320x100