SQL로 API 직접 만들어보기

Ahn·2021년 9월 27일
0

backend Take Notes

목록 보기
2/3

fetchBoard API 만들어보기

Board에서 하나의 게시물만 찾는데 number 가 1인 게시물을 찾는것
findOne 은 fetchBoard API 특성상 하나의 게시물만 조회를 해보는거니까 이름이 이런거같음.

그리고 여기선 편하게 result라고만 리턴을 해줬지만

이렇게 일일이 적어줄수도 있음.

그리고 Board 에서 findOne 찾아와라 라고 되어있는데 이 부분은

Board에 DB가 저장되는 부분이라서 Board를 import해와서 api를 쓰는것같음.
그리고 fetchBoard API는 writer , age , title 등의 정보를 가지고 올 수 있다.

resolver 만 저렇게 적어주면 플레이 그라운드에 올라가지 않는다.
리턴되는 값을 typeDefs 에 써줘야하는데

fetchBoard엔 Board라는 값으로 리턴이 되는데, 이 Board 라는 것은
따로 타입이 정해져있는게 아니기 때문에 또 따로 타입을 만들어 줘야한다.
그래서 위에 따로 Board라는 타입을 만들어준것을 볼 수 있음.

플레이 그라운드에서 fetchBoard API가 진짜로 작동한 모습


fetchBoards API 만들어보기

fetchBoards API는 fetchBoard API랑 다르게 findOne 이 아닌 find 를 썼음
이것도 fetchBoards라는 API 특성상 게시물 하나만을 가져오는게 아닌 게시물 전체를 가져오는
API이기 때문에 이름을 find 로 한 것 같다.

앞에서도 그렇고 여기서도 async , await 을 써줬는데 그 이유는, 게시물 전체를 받아오기
기다렸다가 결과를 내보내야하기 때문에 썼음.

그리고 여기서도 resolver 만 작성하면 플레이 그라운드엔 아무것도 안 뜬다.
typeDefs 에 타입을 지정해줘야한다.

fetchBoard API 는 객체형태로 data에 담겨져 있고,
fetchBoards APIfetchBoard API들이 모여있는 배열이다.
[{fetchBoard} , {fetchBoard} .....] 이런식으로 모여있기 때문에,

fetchBoard에 Board라는 객체의 타입을 가져다가
겉에 [] 대괄호만 씌어줘서 타입을 정해주면 된다.

플레이 그라운드에서 fetchBoards API가 잘 작동한다.


updateBoard API 만들어보기

updateupdate({number:3} , {writer:"영희"}) 이렇게 두가지 값이 필요한데
이유는 update할 대상과 어떻게 변경할지 이 두가지의 정보가 필요하기 때문이다.

여기에 있는 코드의 뜻은 number가 3인 게시물의 writer를 "영희"로 바꾼다임.

여기서도 마찬가지로 , resolver만 써주면 플레이 그라운드에 나오질 않는다.
typeDefs 작성하자.

updateBoard API 는 잘 작동 되었을때 성공했다는 메시지를 내뱉는다.
근데 성공했다는 메시지를 내뱉는 리턴값은 따로 없으므로, Retrun 이라는 타입을
따로 만들어서 적용시켜준것이다.

플레이그라운드에서 잘 작동되었고 , 업데이트가 실제로 잘 되었는지 DBeaver로 확인해보자.

number가 3인 게시물의 writer 가 "영희"로 바뀐걸 확인 할 수 있다.


deleteBoard API 만들어보기

이렇게 삭제를 할 수 있지만, 보통 이렇게 하지 않는다고한다.
data가 삭제되고, 언제 삭제되었는지 알기 위해서 따로 deletedAt 라는 걸 만들어준다.

Board.postgres.ts 파일에서 따로 @ColumndeletedAt 라는걸 만드는데,
각각의 속성의 뜻은

  • timestamp : 시간과 관련된거라서
  • default : 기본값은 null로 한다는 뜻
  • nullable : null일수 있으니까 true라고 세팅한것임

deletedAt? : Date 이 부분은 deletedAt 가 존재하면 Date라는 타입을 쓰겠다 라는 뜻

그리고나서 다시 index.ts에서
delete부분을 지우고 update로 변경한다. 그리고 number가 5인 게시물의
deletedAtnew Date()로 변경한다.

그리고 deleteBoard API 는 삭제완료!!! 라는 메시지를 반환하기 때문에
typeDefs 에서 타입을 따로 지정해줘야 한다.

이렇게 해주고 플레이 그라운드에가서 게시물을 지워보고 , DBeaver에서
데이터를 확인해보면

data가 5인 게시물의 deletedAt에 null이아닌 날짜가 찍힌걸 볼 수 있다.
앞으로 DB에서 데이터가 삭제되었는지는 저걸 보고 판단하면 된다.
나머진 삭제가 되지 않았으니 deletedAtnull 이다.

이 점을 이용해서 데이터를 불러올때 {where:{deletedAt: null}} 이렇게
deletedAtnull 인 데이터만 불러와야 한다.


createBoard API 만들어보기

내가 입력한대로 createBoard 되게 하려면 createBoardInput 이라는 리턴타입을 만들어야한다.
createBoardInput 은 객체로 이루어져있고 , writer , title ,age... 의 정보가 담겨있다.

typeDefs 에서 CreateBoardInput 이라는 타입을 만들어준다.(보통 타입 만들때 대문자로 시작한다고 함)
그걸 적용시켜준다.

매개변수 _ 이부분은 백엔드 개발자가 API간에 통신할때 넘겨주는 데이터로 페어런트 라고 부른다
우리는 쓰지 않으니까 _ 로 쓰지 않는 상태로 놔두면 됨

앞서 typeDefs 에서 입력한 createBoardInput을 args 라는 매개변수로 받아서
데이터를 적용시켜주면 된다.

그리고 number에 result.indentifiers[0].number 이 부분은
result를 콘솔로그로 찍어봤을때

이러한 정보가 나오는데 identifiers 의0번째 인덱스의 number 를 뽑아서 활용한것임

number라는 타입을 새로 만들어줘야 적용되니까 이것도 typeDefs 에 추가해주자.

그리고 이렇게 스프레드 연산자를 써서 코드를 줄일 수 있다.

플레이 그라운드에서 잘 작동하고, DBeaver에 데이터가 올라갔나 확인해보자

데이터가 DB에 잘 저장되었다.

profile
Hello~~👋

0개의 댓글