토이 프로젝트에서 post /book api가 있었습니다. 책 하나를 추가하는 것이였습니다. 그런데, 책을 여러 개 한꺼번에 추가하는 요청도 들어올 수 있을 겁니다. 그런 api를 하나 추가해 보겠습니다. 혹시나, mybatis의 mapper, mapper interface 등에 익숙하시지 않으시다면, mybatis generator로 자동으로 매퍼 interface와 매퍼 xml 파일을 만들어 주는 방법을 익히셔서 셋팅해 두시는 것도 괜찮습니다. 이에 대한 글은 여기에 있어요.

 


 bookService 단에서 addBook이라는 메소드를 추가하겠습니다. 이것은 Book들에 대한 정보들을 받아 오면, 이들을 db에 넣는 역할을 하게 됩니다.

 

 

 그러면, bookMapper에 List를 받는 insertListOfBook이라는 것을 추가해야 합니다. 저는 List 형태로 받아올 건데요. 들어오는 책들의 갯수는 변할 수도 있습니다. 즉, 동적인 sql을 생성해야 한다는 것을 의미해요.

 


 일단, xml에 입력하시기 전에, insert를 여러개 하는 쿼리문을 작성해 봅시다. 먼저, 분류가 5인 두 개의 책을 추가하려고 합니다. 어떻게 작성하면 될까요?

 

 요렇게 작성하시면 됩니다. 3개를 추가하려면 어떻게 하면 될까요?

 

 

 이렇게 작성하시면 되겠죠? 2개의 공통점은 insert into book(book_name, book_class) values 까지는 있다는 점입니다. 그러면 이 부분은 동적으로 생성하지 않아도 되는 부분입니다. dynamic 한 부분은 추가할 원소들을 명시하는 부분입니다. 이것을 List로 넘길 겁니다. 문서에 따르면 iterable한 Object를 넘기면 된다고 되어 있는데요. 리스트는 iterable 하니까 넘겨도 됩니다.

 

 즉, collection은 list를 적어주면 되어요. 다음에, separator인데요. 이 부분은 문서에 명시 되어 있는 foreach dynamic sql을 보시면 쉽게 이해하실 수 있어요. 해당 sql 문은 where in 구문인데요. in 절도 사실 dynamic 하게 올 수 있는 부분 중 하나입니다. 여기에서 구분자 속성을 ","로 주었는데요. in 구문을 생각해 보면 where ~ in("A", "B", "C") 이런 식으로 쓰기 때문입니다.

 

 

 insert 여러 개 하는 걸 보시면, ,을 구분자로 함을 알 수 있어요. 따라서, separator는 ","로 두시면 됩니다. insert tag 속성에 결과값으 가져올 PK 정보들도 추가할 건데요. useGeneratedKeys랑 keyProperty로 설정해 주었습니다. 이 부분이 이해가 안 가시면 이 포스트를 참고해 보시면 좋겠습니다.

 

 

 그러면 foreach문을 채우는 것은 끝났고, 그 다음이 문제인데요. bookName을 하면 안 됩니다. 대신에 item의 bookName 이런 식으로 접근하셔야 하는데요. 그렇게 하기 위해서는, item.bookName, item.bookClass 이런 식으로 써 주셔야 합니다.  즉, list에 있는 내용들에 대해서 foreach로 돌면서, dynamic하게 쿼리를 생성하게 됩니다. 해당 xml은, 추가할 책들 list가 들어왔을 때, 이들을 모두 추가하게 됩니다. mybatis foreach문을 이용해서 insert문을 dynamic하게 생성하는 것. 보니까 그렇게 어렵지 않네요.

 

 그런데, 뜬금없이 bookName과 bookClass가 나왔는데요. 이 부분은 Mapper 위에 정의되어 있는 이 부분과 관련이 깊어 보입니다.

 

 

 property 부분을 보시면 되겠습니다. 사실 generator로 생성하면 알아서 생성해 줍니다.

 


 컨트롤러에서는 BookRegInfo의 List를 받아서 Book List로 변환 후에 service 레이어로 넘기는데요.

 

 

 해당 모델의 스펙은 위와 같아요.

 

 

 그러면, POST /books를 호출할 때 RequestBody를 요런 식으로 설정해 주면 좋을 듯 합니다.

 

 

 결과값이 온 것을 보니까 잘 동작하는 모양이네요.

 

 

 dbeaver로 들어가서 book 테이블에 대해서 전체 조회를 해 보니, 잘 추가되었음을 알 수 있어요.