본문 바로가기

전체 글

(134)
GraphQL 데이터 모델링 도구 (@graphql-tools, nexus-prisma) 제가 알고 있는 GraphQL 모델 정의 방법은 2가지가 있습니다. 1. @graphql-tools/merge, @graphql-tools/load-files 제가 사용한 방법입니다. 특정 경로에 있는 모든 graphql 파일과 js 파일별로 통합해서 타입 객체와 Resolvers 객체를 만들 수 있습니다. 노마드 코더님의 인스타그램 클론 강의에선 merge-graphql-schemas 모듈을 사용했는데요. 최근에 GraphQL Tools로 통합되면서 @graphql-tools/merge 모듈과 @graphql-tools/load-files 모듈로 분리이전되었습니다. src/schema.js const path = require("path"); const { makeExecutableSchema } = ..
[인스타그램 클론코딩] GraphQL 데이터 모델링 GraphQL을 아직 잘 모르겠다면? 나의 첫번째 GraphQL서버 만들기 model.graphql 인스타그램 클론코딩에 사용된 GraphQL 모델입니다. 참조1: [인스타그램 클론코딩] Prisma2 데이터 모델링 참조2: GraphQL with Prisma2 설계 구조 Prisma2부터는 id 타입이 Int입니다. 그래서 GraphQL에서도 ID(String) 타입이 아닌 Int 타입을 반환합니다. scalar DateTime type User { id: Int! userName: String! avatar: String email: String! firstName: String lastName: String bio: String posts: [Post!] followers: [User!] follo..
Prisma1과 Prisma2 데이터 모델링 비교 [인스타그램 클론코딩] Prisma2 데이터 모델링 포스트의 Prisma2 데이터 모델과 다음의 Prisma1 데이터 모델을 비교하면, Prisma1이 사용된 백앤드에 Prisma2를 적용하기 쉬울겁니다. Prisma1 Prisma2 데이터 모델과 동일한 구조입니다. type User { id: ID! @id userName: String! @unique avatar: String @default(value: "https://3.bp.blogspot.com/-qtEejOg1NHA/Xobmg2y_QeI/AAAAAAAAIVE/UFKPvpeHjKUqCEFOX8lT4MsKz-PwpEGJgCLcBGAsYHQ/s1600/default_user.png") email: String! @unique firstName: ..
Prisma2 클라이언트 생성 Prisma2 CLI를 사용하여 데이터베이스 테이블 생성 포스트에서 데이터베이스에 테이블을 생성했지만, 코드상에서는 Prisma 클라이언트를 사용해서 데이터베이스에 접속하기 때문에, Prisma 모델 구조를 알고 있는 Prisma 클라이언트도 생성해 주어야 합니다. 참조 Prisma2 데이터 모델링1 - 1:1 Relation Prisma2 데이터 모델링1 - 1:N Relation Prisma2 데이터 모델링1 - Self Relation Prisma 클라이언트 생성 콘솔창에 다음 명령어를 입력하면, Prisma CLI가 Prisma 모델(schema.prisma)로 부터 Prisma 클라이언트를 생성합니다. npx prisma generate 참조: Prisma2 설치 (CLI, 클라이언트) 하지만 ..
Prisma2 CLI를 사용하여 데이터베이스 테이블 생성 인스타그램 클론코딩에 사용된 schema.prisma 파일로 부터 데이터베이스 테이블을 생성해 보겠습니다. 참조: GraphQL with Prisma2 설계 구조 schema.prisma [인스타그램 클론코딩] Prisma2 데이터 모델링 포스트에서는 모델링만 했지만, 사실 schema.prisma 파일에 데이터베이스와 Prisma 클라이언트에 대한 설정도 해 주어야 합니다. // 데이터베이스 설정 datasource db { provider = "mysql" url = env("DATABASE_URL") } // Prisma 클라이언트 설정 generator client { provider = "prisma-client-js" binaryTargets = ["rhel-openssl-1.0.x"] //b..
[인스타그램 클론코딩] Prisma2 데이터 모델링 UserFollows Relation은 Self Relation이고, 나머지는 1:N Relation입니다. 참조: 1:1 Relation schema.prisma Nullable은 사용하지 않았습니다. 대신 default 값으로 빈 문자열(@default(value: ""))지정해 주었습니다. 그리고 배열은 아무것도 없는 경우 []를 반환하므로 ?를 사용할 필요도 없고 사용하지도 못합니다. 저는 Relation을 통해서 저장소들이 연결되는 통로를 만들었다고 생각합니다. 1:N Relation User(1) → Post(N) → User(1) User(1) → Like(N) → User(1) User(1) → Comment(N) → User(1) Post(1) → Like(N) → Post(1) Post..
Prisma2 데이터 모델링3 - Self Relation 테이블 내 두 개의 레코드를 1:1로 매칭시킵니다. 사용예(Usecase) Following 시스템 schema.prisma model User { id Int @default(autoincrement()) @id followers User[] @relation("UserFollows", references: [id]) following User[] @relation("UserFollows", references: [id]) } 역시 Relation이기 때문에 컬럼이 생성되지 않습니다. 참조: Prisma2 데이터 모델링1 - 1:1 Relation 대신 Self Relation은 Relation에 사용된 심볼("UserFollows")에 언더바(_)가 추가된 Relation 테이블이 데이터베이스에 생성..
Prisma2 데이터 모델링2 - 1:N Relation 한 개의 레코드와 다른 테이블의 다수 레코드를 1:N으로 매칭시킵니다. 사용예(Usecase) User.post ↔ Post Post.comments ↔ Commnet 1:1 Relation과 거의 동일합니다. 다음은 User 테이블의 Posts 레코드에 다수의 Post 테이블 레코드를 연결시킨 예제입니다. 단지 다수의 레코드가 연결된 한 개의 레코드가 배열 타입으로 변경됐을 뿐입니다. schema.prisma model User { id Int @default(autoincrement()) @id posts Post[] } model Post { id Int @default(autoincrement()) @id user User @relation(fields: [userId], references: [..