안녕하세요. 이번 시간에는 postgresql serial permission 오류가 떴을 때, 어떻게 해결해야 하는지 알아보겠습니다. 저는 서버에 psql을 설치했고, 로컬에 dbeaver로 접속할 수 있는 환경을 구축해 놓은 상태입니다.

 


 저는 도서관 api 프로젝트에서 책을 빌리고 반납하고, 어떤 책을 빌렸는지에 대한 api를 추가하는 작업을 하고 test 하는 중이였습니다. 이 중에서 POST /borrow는 책을 빌리는 api입니다. bookId와 userId를 넣으면, 2번 유저가 id가 2인 책을 빌리게 됩니다.

 

 요청을 보내 보겠습니다.

 

 

 그랬더니 500이 떨궈지는데요. 서버 내에서 문제가 발생했음을 의미합니다.

 

 

 로그를 보니까 permission denied가 되어 있는데요. 권한 때문에 무엇인가가 안 되었다는 의미입니다. api 서버에서는 ghlib로 접근을 하니까, 서버에서 ghlib로 postgresql에 접속해 보겠습니다.

 

 -U는 유저 이름을, -d는 접속할 데이터베이스를 의미합니다. library 데이터베이스 내에 borrow 테이블과 book 테이블이 있으니, 해당 데이터베이스로 접속하겠습니다.

 

 

 그리고 borrow에 2번 유저가 2번 책을 빌려갔다는 정보를 추가합니다. 그랬더니, permission denied가 뜹니다.

 


 문제를 알았으니 로컬 dbeaver에서 권한을 줘 보도록 하겠습니다. 로컬에서 psql로 접속할 때 사용한 id는 gh입니다.

 

 library 밑에 있는 public을 클릭해 보시면 여러 가지 정보들이 뜨게 됩니다.

 

 

 이 중에 Sequences를 보면, 시퀀스들이 뜸을 알 수 있어요. 이 중에서 borrow_borrow_id_seq의 권한이 없어서 퍼미션 오류가 떴다고 했으니, borrow_borrow_id_seq를 클릭해 보겠습니다.

 

 

 그러면, 권한 탭이 보이는데요. 유저가 gh와 ghlib가 있어요. ghlib를 클릭해 보겠습니다.

 

 

 그러면 ghlib가 가진 permission이 뜰 건데요. select, update, usage 3개에 모두 체크 표시를 하고 save를 눌러 봅시다.

 

 

 그러면 이렇게 SQL preview가 뜨게 됩니다. 적용 버튼을 누르면 ghlib에도 Sequence borrow_borrow_id_seq에 대한 권한이 주어지게 됩니다.

 


 제대로 적용되었는지 확인해 봅시다.

 

 POST /borrow 요청을 날려봅시다. 이것은 id가 2인 유저가 id가 2인 책을 빌린다는 의미입니다.

 

 

 응답 값을 보니까, borrow가 된 결과물이 제대로 나왔음을 알 수 있어요. 다음에, 2번 유저가 빌린 책들을 검색해 보겠습니다. GET /borrow/2 api를 호출해 보시면 아래와 같은 결과가 나옵니다.

 

 

 bookId가 2이고 userId가 2인 record가 잘 출력됨을 알 수 있어요.