[Graphql] 나름대로 정리 본문

[PL]/DB

[Graphql] 나름대로 정리

객과 함께. 2021. 10. 8. 18:00

웹 앱 API 개발을 위한  GraphQL ( O'REILLY )
-------------------------------------------------------------------------------
간략 정리 내용임.

1. Graphql  Query
 - query - Select    
 - mutation - Insert, Update, Delete
 - subscription - query와 동일 [socket 연결로 전달되는 데이터 변경 사항을 실시간감지 가능.]
 - http method - GET, POST, PUT, Delete
 
2. 엣지와 연결 
 - 정수(Int), 실수(Float), 문자열(String), 불(Boolean), 식별자(ID)
 - 정수와 살수 타입은 JSON 숫자 타입 데이터를 반환.
 - 문자열과 식별자 타입은 JSON 문자열 데이터 반환
 - ID타입이 반드시 유일한 문자열을 반환하도록 되어 있음.

3. 리스트 Null적용규칙
[Int] - 리스트 안에 담긴 정수 값은 null이 될수 있다. 
[Int!] - 리스 안에 담긴 정수 값은 Null이 될수 없다. 
[Int]! - 리스트 안의 정수 값은 null이 될수 있으나, 리스트 자체는 null이 될 수 없다. 
[Int!]! - 리스트 안의 정수 값은 null이 될 수 없고, 리스트 자체도 null이 될 수 없다. 

4. 일대일 연결
시스템상의 필드가 서로 단반향 관계가 이뤄 진격우 일대일 연결이 가능합니다.

type User{
    githubLogin: ID!      --------------- 추가
    name: String
    avatar: String
}

type Photo {
    id: ID!
name: String!
url: String!
description: String
create: DateTime!
category: PhotoCategory!
postedBy: User!    ------------------  추가
}

5. 일대다 연결
GraphQL 서비스는 최대한 방향서어이 없도록 유지하는 편이 쿼리를 자유롭게 만드느데 유리하다.

type User {
    githubLogin: ID!
    name: String
    avatar: String
    postedPhotos: [Photo!]! -------------- 추가
}

User 타입에 postedPhotos필드를 추가하여 사용자에서 Photo로 되돌아가는 경로를 만들었습니다. postedPhotos필드는 사용자가 게시한 Photos타입의 리스트 반환된다. 

 

어떤 객체의 필드에서 다른 객체 리스트를 반환하는 필드를 보유하고 있을대 나타나는 관계.

● 루트 Query 타입에 커스텀 타입 추가
type Query {
    totalPhotos: Int!
    allPhotos: [Photo!]!
    totalUsers: Int!
    allUsers: [User!]!
}

Query 에 타입 정의를 추가 하면 사용할 쿼리를 API에 정의.

schema {
  query : Query
}

후에 Query 타입을 schema에 필드로 추가하면 GraphQK API에서 쿼리를 사용.

6. 다대다 연결

노드 리스트를 다른 노드 리스트와 연결 지어야하는 경우 양쪽 모두 리스트 타입 필드를 추가해서 다대다 관계를 정의.

type User {
  ...
  inPhotos: [Photo!]!
}

type Photo {
  ...
  taggedUsers: [User!]!
}

● 통과타입
 - 다대다 연결에서 관계 자체에 대한 정보를 담을 수도 있음.
 - 사용자 사이의 관계를 만들기 위해 User 타입 하위에 다른 사용자를 모아 둔 리스트를 추가.

type User {
  friends: [User!]!
}

여기서 친구 관계에 대한 정보를 담기 위햇 friends를 커스텀 통과 타입을 정의.

type User {
  friends: [Friendship!]!
}

type Friendship {
  friends: [User!]!
  how_long: Int!
  where_we_met: Location
}

Fiendship 타입을 통해 User 간의 관계를 알 수 있는 통과 타입이 정의.


7. Union Type
GraphQL 유니언 타입은 여러 타입 가운데 하나를 반환.

type StudyGroup {
  name: String!
  subject: String!
  students: Int!
}

 type Workout {
   name: String!
   reps: Int!
}

union AgendaItem = Workout | StudyGroup

type Query {
  agenda: [AgendaItem!]!
}

agenda 필드를 Workout과 StudyGrop 타입을 묶어서 Query로 추가.

union AgendaItem = Workout | StudyGroup | Class | Meal | Meeting
union 타입은 중간에 파이프를 넣어서 원하는 만큼 추가.

 객체에 따라 필드가 완전히 달라져야 한다면 유니언 타입을 사용.

8. Interface
인터페이스는 한 필드 안에 타입을 여러 개 넣을 때 사용. 
인터페이스를 사용하면 인터페이스 안에 정의된 필드가 무조건 들어가야 하도록 정의.

interface ScheduleItem {
  name: String!
  start: Int
  end: Int
}

type StudyGroup implements ScheduleItem {
  name: String!
  start: Int
  end: Int
  subject: String!
  students: Int!
}

type Workout implements ScheduleItem {
  name: String!
  start: Int
  end: Int
  reps: Int!
}

type Query {
  agenda: [ScheduleItem!]!
}

SchduleItem이라는 인터페이스를 만들고 이 추상 타입을 기반을 확장하여 다른 타입을 만듬.  
인터페이스를 확장하여 만든 타입은 인터페이스 안에 정의된 필드가 무조건 들어가야 함.

 특정 필드가 반드시 들어가야 한다면 인턴페이스를 사용.

 

9. 정렬(sort)
enum SortDirectin{
    ASCENDING
   DESCENDING
}

enum SortablePhotoField {
    name
   description
   category
   created
}

Query {
    allPhotos(sort: SortDirectin= DESCENDING, sortBy:SortablePhotoField = created): [Photo!]!
}

반환데이터의 양을 줄이려면 데이터 페이징 용도로 쓸 필터를 추가.
sortBy 인자통해서 반환값에 접근 할수 있음.

10. 뮤테이션(Mutation)
- 뮤테이션은 반드시 스키마 안에 정의해 두어야 함.
 - 쿼리를 정의할 때처럼 커스텀 타입으로 정의한 다음에 스키마에 추가.
 - 애플리케이션 상태를 바꿀 액션이나 이벤트가 있을 때만 뮤테이션을 작성.
 - 뮤테이션은 스키마의 루트 mutation 타입에 추가하여서 클라이언트에서 사용 할 수 있음.

type Mutation {
  postPhoto(
    name: String!
    desciption: String
    category: PhotoCategory = PORTRAIT
  ): Photo!
}

schema {
 query: Query
 mutation: Mutation
}

postPhoto 뮤테이션은 name은 필수 값 description과 category는 필수 값이 아닙니다. category의 default 값은  PORTRAIT입니다.

11. 서브스크립션
type Subscription {
   newPhoto(category:"ACTION"): Photo!
   newUser: User!
 }

 schema {
   query: Query
   mutation: Mutation
   subscription: Subscription
 }

Subscription 타입 객체를 만들 때 필터를 걸어서 특정 카테고리("ACTION") 카테고리의 값의 내용만 걸러 볼 수 있도록 설정한 뒤 스키만에 서브스크립션을 등록하면 해당하는 타입(Photo,  User)이 생성 될 때마다 알람을 받을 수 있습니다. 

'[PL] > DB' 카테고리의 다른 글

[펌] CUBRID DBCP 설정 방법  (0) 2014.10.20
[ 펌 ]SEQUENCE   (0) 2014.10.17
DB Connection (JDBC)  (0) 2014.05.02
[ cubrid ] 자바저장 함수 암호화 구현예제  (0) 2014.01.03
번호 자동 증가   (0) 2013.11.21