도서관 api 토이 프로젝트를 하고 있습니다. 책을 추가하는 api를 개발하려고 하는데요. 추가가 성공적으로 되었다면, 추가된 record를 리턴하고 싶어요. auto_increment가 된 필드도 같이요. 어떻게 하면 좋을까요?

 


 여기서 핵심은, 책을 추가할 때, bookClass와 bookName을 json으로 넘겨준다는 것입니다. bookId는 넘겨주지 않는데요. 이것은 자동 증가되는 serial이기 때문입니다. 그냥 책 데이터가 추가되면, 자동 증가되는 값입니다.

 

[관련글]

postgresql serial이 무엇인지 간단하게 알아봅시다.

 

 POST /book은 bookName과 bookClass를 받아서, book 테이블에 책 레코드를 추가합니다. 만약에 추가가 성공하면, bookId와 이름, Class를 json으로 떨구게 됩니다. 한 번 추가해 보겠습니다.

 

 

 그랬더니, bookId는 null이 나옵니다. 제가 추가한 책의 Id를 알고 싶어요. 즉, 추가한 후에 bookId 값을 가지고 오고 싶은 것이 제 목적이에요. book 테이블의 구조를 봅시다.

 

 serial 데이터가 1번째 컬럼에 있네요. 저는 이것을 얻어오는 것이 목적이에요.

 

 

 Mapper xml 파일을 보니까, 이 부분이 insert를 하는 부분으로 보여요. 이 부분을 바꿔볼 건데요. 문서에, useGeneratedKeys라는 것이 있어요. 이것은, JDBC의 getGeneratedKeys를 이용한다는 옵션입니다. 그러면 이 메서드는 또 뭔지 볼까요? 문서를 보시면, 자동 생성 키값들을 사용하기 위해서 사용된다는 것을 알 수 있어요. 문서를 다시 보시면, useGeneratedKeys를 설명하는 부분에 갑자기 eg. 가 보입니다. 그러면서 언급하고 있는 것이, auto increment fields in RDBMS인데요. postgresql에서는 serial입니다.

 

 저는 book_id를 PK로 잡았고, book_id가 bigserial이므로, 얘를 기준으로 탐색을 할 거 같아요.

 

 

 다음에 Book 클래스를 보면, bookId가 있는데요. 이것이 book_id를 받습니다. keyProperty는 리턴이 된 키 값들을 어느 필드에 set 할 건지를 나타냅니다. Book model을 보니까, bookId에 들어가야 할 거 같네요. 그러니, keyProperty는 "bookId"로 셋팅해 주시면 됩니다.

 

 

 수정된 insert 문은 위와 같아요. 정리하면 useGeneratedKeys="true"로 설정해서, 자동 생성된 키 값들을 가져올 거라는 것을 명시합니다. 다음에, keyProperty로, 어떤 필드 값으로 받을지를 명시해 줍니다. bookId에 넣을 거니까, "bookId"로 넣어주었습니다. 테이블의 어느 속성들을 받을 것인지 따로 정할 수도 있는데요. 이것은 keyColumn으로 설정해 주시면 됩니다. 1개를 가져오실 때도 왠만하면 명시해 주는 게 좋을 듯 싶네요.

 


 이제, POST 요청으로 책 이름은 "프로그래밍 언어론", bookClass는 5로 해서 보내 보겠습니다. json 포맷으로 보냈습니다.

 

 

 그랬더니, bookId는 18이 리턴되었어요.

 

 

 book 테이블에 있는 데이터를 모두 조회해 보겠습니다.

 

 

 그러면, 16번은 자바 웹을 다루는 기술, 18번은 프로그래밍 언어론으로 잘 들어갔음을 볼 수 있어요. json으로 받아온 것과 똑같은 번호입니다.