728x90
320x100
도메인별로 개발하기 두번째 오늘은 책(Book) 도메인에 관련된 기능을 만들어보자!
[개발 목표]
- 책 등록 구현
- 책 목록 조회
- 책 정보 수정 구현
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
'💻 뚝딱뚝딱 > 팀내도서대여시스템(OBRS)' 카테고리의 다른 글
[개발일지#005] 데이터베이스 수정작업 그리고 그에 따른 XML 수정 (0) | 2024.04.06 |
---|---|
[개발일지#004] 타임리프 레이아웃 적용 및 네비게이션 바 생성/디자인 및 구현 (0) | 2024.04.05 |
[개발일지#002] 회원 가입 / 회원조회(단건) / 회원정보수정 구현 (1) | 2024.04.01 |
[개발일지#001] 데이터베이스를 생성하고 스프링부트에 Mybatis 설정하기 (회원목록 만들기) (0) | 2024.03.28 |
[개발일지#000] 팀내도서대여시스템 제작계기 & 사용기술스택 & 최소요구사항 (0) | 2024.03.27 |