본문 바로가기

Vue/bookStore

4. bookStore - Book CRUD

간단히 CRUD 기능을 구현했다

아래 코드는 BookService 부분의 코드이다. (Controller는 getHub에서 확인 가능하다)

 

@RequiredArgsConstructor
@Service
@Slf4j
public class BookJpaService {

    final BookRepository bookRepository;
    final MemberRepository memberRepository;

    //리스트 가져오기
    public List<Book> getBookList() {
        return bookRepository.findBookByIsDel("N");
    }

    //지정한 책만 가져오기
    public Book getBookId(long bid) {
        Optional<Book> bookData = bookRepository.findBookByBidAndIsDel(bid, "N");
        return bookData.orElseThrow(() -> new RuntimeException("no data"));
    }

    //책 등록
    public Book postBook(BookDTO bookDTO) {
        long newBookBidValue = this.getNewBookBidValue(bookRepository);
        long memberId = getMemberIdByEmail(memberRepository);

        Book postData = Book.builder()
                .bid(newBookBidValue)
                .mid(memberId)
                .author(bookDTO.getAuthor())
                .subject(bookDTO.getSubject())
                .page(bookDTO.getPage())
                .price(bookDTO.getPrice())
                .published_date(bookDTO.getPublished_date())
                .detail_tag(bookDTO.getDetail_tag())
                .tag(bookDTO.getTag())
                .keyword(bookDTO.getKeyword())
                .isDel("N")
                .build();
        return bookRepository.save(postData);
    }

    //책 id를 정하는 로직
    private long getNewBookBidValue(BookRepository bookRepository) {
        long result;
        Book boardOfMaxId = bookRepository.findTopByOrderByBidDesc();
        if (boardOfMaxId == null) {
            result = 1;
            log.debug("no board data, maxId is 1");
        } else {
            result = boardOfMaxId.getBid() + 1;
            log.debug("maxIdFromBoard=" + boardOfMaxId.getBid());
        }
        log.debug("newBoardIdValue=" + result);
        return result;
    }

    //SecurityContextHolder에 저장된 사용자Email을 통해 사용자 Mid를 가져오는 로직
    private Long getMemberIdByEmail(MemberRepository memberRepository){
        String memberEmail = SecurityContextHolder.getContext().getAuthentication().getName();
        return memberRepository.getMemberIdByEmail(memberEmail);

    }

}

 

1. 책 등록 : PostBookgetMemberIdByEmail

 

이전과 다른점이 있다면 책을 등록할 때 프론트엔드에서 사용자 정보(Member Id)를 보내서 등록했는데

이번엔 토큰에서 가져온 정보를 저장한 ContextHolder에서 사용자 Email을 꺼내와서 Member Id를 찾았다.

따라서 책을 등록할 때 입력해야할 정보는 

작가, 책 제목, 페이지, 가격, 출판일, 태그와 디테일 태그, 키워드 이다.

 

 

 

 

2. 책 삭제 : updateIsDelBookById (0207)

 

    //책 삭제 ( isDel "N" -> "Y" )
    public Book updateIsDelBookById(long bid) {
        Optional<Book> bookData = bookRepository.findBookByBidAndIsDel(bid, "N");
        Book data = bookData.orElseThrow(() -> new RuntimeException("no data"));
        //북 오너 정보와 매치 필요
        long midByLoginInfo = getMemberIdByEmail(memberRepository);

        if (data.getMid() == midByLoginInfo) {
            data.updateIsDel("Y");
            return bookRepository.save(data);
        } else {
            return null;
        }
    }

1. 받은 bid 그리고 isDel = "N" 에 해당하는 내용이 있는지 Null인지 확인 후 

 

2. bookData에 있는 member id와 로그인된 정보에 있는 member id가 같은지 비교한다.

   (getMemberIdByEmail 코드는 위에 있다.)

 

3. 정보가 같으면 updateIsDel (setter이지만 의미가 있는 메소드 이름) 를 통해 isDel을 Y로 수정한다

 

패스워드가 일치하는지 아닌지 확인하는 부분은 Member 패키지에서 수행 할 예정이다.

패스워드가 일치한다 -> 책 삭제 bookController 실행

 

 

3. ApiResponse<T>를 사용하여 메시지와 데이터를 같이 출력한다.

 

 

'Vue > bookStore' 카테고리의 다른 글

6. postBook - 도서등록 2  (0) 2022.02.25
5. bookStore 도서 등록  (0) 2022.02.19
3. BookStore jwtToken 인증 추가  (0) 2022.02.06
book Entity - Setter ? Builder?  (0) 2022.02.02
2. bookStore (기본 세팅)  (0) 2022.01.31