05·실습·14분
API로 데이터 다루기
데이터베이스로 들어가는 문은 둘입니다. 하나는 모양을 위한 것, 하나는 행을 위한 것.
마이그레이션은 모양을 바꾼다
await client.db.migrate({
sql: 'CREATE TABLE IF NOT EXISTS profiles (id serial primary key, name text not null)',
})
외부에서 프로젝트 데이터베이스에 DDL이 들어오는 유일한 곳입니다. 문장은 콘솔과 같은 파이프라인을 거칩니다. 단일 스키마 격리, 역할이나 권한 관리 불가, 확장 불가, 플랫폼이 관리하는 users 테이블 보호. 응답에는 실행된 문장과 경고가 나열되고, 실패한 문장은 400을 돌려주며 아무것도 반쯤 적용되지 않습니다.
쿼리는 행을 옮긴다
쿼리는 SQL 문자열이 아니라 구조화된 객체입니다.
const rows = await client.db.profiles.find({ where: { name: { startsWith: 'K' } }, limit: 20 })
const { id } = await client.db.profiles.insert({ name: 'Kim' })
await client.db.profiles.update({ where: { id }, data: { name: 'Kim Minji' } })
find는 호출당 최대 1000행을 돌려주며 limit과 offset으로 페이지를 나눕니다. update와 delete에는 where가 필수입니다. 모든 값은 서버에서 파라미터화되므로 따옴표가 들어간 이름도 그냥 이름일 뿐입니다.
충돌은 멱등성의 도구
고유 제약이나 외래 키 위반은 409를 돌려줍니다. 이것이 "없으면 만들기"의 지원되는 패턴입니다. 삽입하고, 409면 행이 이미 있다고 보거나 다시 읽습니다. 사전 확인의 경쟁 조건이 없습니다.
예산
읽기(find, findOne, count)와 쓰기(insert, update, delete)는 별도의 분당 예산을 쓰고, migrate는 작은 자체 예산이 있습니다. 읽기를 다 쓴 폴링 루프가 있어도 쓰기는 통과합니다.
DontCode에서는
콘솔의 데이터베이스 페이지는 코드가 만든 스키마와 행을 그대로 보여주므로, 스키마 화면에서 마이그레이션이 적용되는 것을 볼 수 있습니다. 행 수준 보안 정책은 마이그레이션으로 직접 작성하며, 게이트웨이는 프로젝트 스키마 안에서 쿼리를 실행하므로 정책은 API 트래픽에도 똑같이 적용됩니다.
더 알아보기
이해도 확인
1.원시 SQL을 게이트웨이에 보낼 수 있는 곳은?
2.삽입이 409를 돌려줬습니다. 무슨 뜻일까요?
3.where 절이 없는 update는 어떻게 될까요?
과제
백엔드 프로젝트코드에서 client.db.migrate(또는 POST /api/v1/db/migrate)로 테이블을 만들거나 열을 추가하는 마이그레이션을 실행하세요. 마이그레이션이 성공적으로 적용되면 확인이 통과됩니다. 콘솔의 데이터베이스 페이지에서 확인해 보세요.