본문 바로가기
💻 뚝딱뚝딱/팀내도서대여시스템(OBRS)

[개발일지#003] 책 등록 / 책 정보수정 / 책 목록조회 구현

by 뚜루리 2024. 4. 2.
728x90
320x100
도메인별로 개발하기 두번째 오늘은 책(Book) 도메인에 관련된 기능을 만들어보자!

 

[개발 목표]

  1. 책 등록 구현
  2. 책 목록 조회
  3. 책 정보 수정 구현

 

Book.java

package seulgi.bookRentalSystem.domain.book;


import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;

@Getter @Setter
@RequiredArgsConstructor
public class Book {

    private String bookId;
    private String bookName;
    private String bookWriter;
    private String authorId;
    private String authorName;
    private String bookRentalId;
    private String bookStateCode;
    private String bookStateCodeName;
    private String createDate;

}
  • 책 객체를 만들었는데 원래는 컬럼이 bookId, authorId, bookStateCode, createDate 정도만 있었는데 책 정보를 보여주는 화면이 대부분 대여정보(Rental)를 조인한 정보들도 보여줘야해서 고민하다가 일단 Book객체에 다 때려넣었는데 좋은 방법이 아니려나? 싶기도 하다. 이 부분 나중에 다시 고민해봐야 할 것 같다. 

 

 

EditForm.java

package seulgi.bookRentalSystem.domain.book;

import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@RequiredArgsConstructor
public class EditForm {

    private String bookName;
    private String bookWriter;
    private String bookStateCode;
}

 

멤버객체와 비슷하게 책 객체도 수정용 객체를 따로 만들어 주었다. 

 

 

BookMapper.java

package seulgi.bookRentalSystem.domain.book;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

@Mapper
public interface BookMapper {
	
    //책 목록 조회 
    List<Book> allBookList();
	
    //책 등록
    void addBook(@Param("book") Book book);
	
    //책 단건 조회
    Book findByBookId(@Param("bookId") String bookId);
	
    //책 정보 수정
    void editBook(@Param("bookId") String bookId, @Param("book") Book book);
	
    //책 ID 생성
    String makingBookId();

}
  • 회원 객체와 크게 다를 것은 없는데 그나마 다른건 책 ID를 생성하는 것.  책ID를 기본키로 만들어 두었는데 사용자는 책 이름과 저자만 입력하고 컨트롤러에서 책 아이디를 임의로 생성하여 넣어주기로 했다. 책 아이디는 'BOOK' + 001, 002, 003 이런 식으로 만들어줄 예정. 
  • 그래서 xml을 통해 쿼리로 책 ID중 시퀀스 최대값을 가져와서 거기에  +1만 더해서 생성할 생각으로 책 아이디를 생성하는 매퍼를 추가로 만들어 주었다.  나는 워낙 쿼리로 하는게 익숙해서 이런 방법을 찾았는데 Java내에서 해결할 방법도 있을까? 고민해봐야 하는 문제일 것 같다. 

 

 

BookService.java

package seulgi.bookRentalSystem.domain.book;

import java.util.List;

public interface Bookservice {
	
    //책 목록 조회
    public List<Book> allBookList();
	
    //책 등록
    void addBook(Book book);
	
    //책 아이디로 책 객체 조회
    public Book findByBookId(String bookId);
	
    //책 정보 수정
    public void editBook(String bookId, EditForm editForm);
	
    //책 아이디 생성
    public String makingBookId();

}

 

 

BookServiceImpl.java

package seulgi.bookRentalSystem.domain.book;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
@RequiredArgsConstructor
public class BookServiceImpl implements  Bookservice{

    private final BookMapper bookMapper;
	
    //책 목록 조회
    @Override
    public List<Book> allBookList() {
        return bookMapper.allBookList();
    }
	
    //책 등록 
    @Override
    public void addBook(Book book) {
        bookMapper.addBook(book);
    }
	
    //책아이디로 책 객체 조회
    @Override
    public Book findByBookId(String bookId) {
        return bookMapper.findByBookId(bookId);
    }
	
    //책 정보 수정
    @Override
    public void editBook(String bookId, EditForm editForm) {
        Book findBook = findByBookId(bookId);
        findBook.setBookName(editForm.getBookName());
        findBook.setBookWriter(editForm.getBookWriter());
        findBook.setBookStateCode(editForm.getBookStateCode());
        bookMapper.editBook(bookId, findBook);
    }
	
    //책 아이디 생성
    @Override
    public String makingBookId() {
        return bookMapper.makingBookId();
    }

}

 

 

bookMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="seulgi.bookRentalSystem.domain.book.BookMapper">

    <select id="makingBookId" resultType="java.lang.String">
        SELECT CONCAT('BOOK', LPAD(MAX(SUBSTR(BOOK_ID, 5))+1, 3, '0')) FROM BOOK
    </select>

    <select id="findByBookId" parameterType="String"
            resultType="seulgi.bookRentalSystem.domain.book.Book">
        SELECT
               BOOK_ID AS bookId
             , BOOK_NAME AS bookName
             , BOOK_WRITER AS bookWriter
             , AUTHOR_ID AS authorId
             , (SELECT MEMBER_NAME
                FROM MEMBER_TB
                WHERE MEMBER_ID = AUTHOR_ID ) AS authorName
             , BOOK_STATE_CODE AS bookStateCode
             , (SELECT STATE_CODE_NAME
                FROM BOOK_STATE_CODE
                WHERE STATE_CODE = BOOK_STATE_CODE) AS bookStateCodeName
             , CREATE_DATE AS createDate
        FROM BOOK
        WHERE BOOK_ID = #{bookId}
        ORDER BY createDate DESC;
    </select>

    <select id="allBookList" resultType="seulgi.bookRentalSystem.domain.book.Book">
        SELECT
               BOOK_ID AS bookId
             , BOOK_NAME AS bookName
             , BOOK_WRITER AS bookWriter
             , AUTHOR_ID AS authorId
             , (SELECT MEMBER_NAME
                FROM MEMBER_TB
                WHERE MEMBER_ID = AUTHOR_ID ) AS authorName
             , BOOK_STATE_CODE AS bookStateCode
             , (SELECT STATE_CODE_NAME
                FROM BOOK_STATE_CODE
                WHERE STATE_CODE = BOOK_STATE_CODE) AS bookStateCodeName
             , CREATE_DATE AS createDate
        FROM BOOK
        ORDER BY createDate DESC;
    </select>

    <insert id="addBook" parameterType="seulgi.bookRentalSystem.domain.book.Book">
        INSERT INTO BOOK
                    ( BOOK_ID
                    , BOOK_NAME
                    , BOOK_WRITER
                    , AUTHOR_ID
                    , BOOK_STATE_CODE
                    , CREATE_DATE
        ) VALUES (   #{book.bookId}
                   , #{book.bookName}
                   , #{book.bookWriter}
                   , #{book.authorId}
                   , #{book.bookStateCode}
                   , now()
                   )
    </insert>

    <update id="editBook" parameterType="java.util.Map">
        UPDATE BOOK
        SET BOOK_NAME = #{book.bookName}
          , BOOK_WRITER = #{book.bookWriter}
          , BOOK_STATE_CODE =#{book.bookStateCode}
        WHERE BOOK_ID = #{bookId}
    </update>

</mapper>

조회는 단순 책 조회로는 원하는 정보를 얻기 어려워서 서브쿼리를 사용하여 조회 하였다. 

 

 


[구현화면]

 

 

728x90
320x100