코딩 하는 가든

springboot + graphql 시작하기(2) - graphql 스키마 작성하기 본문

프로젝트/N poem

springboot + graphql 시작하기(2) - graphql 스키마 작성하기

가든리 2020. 5. 21. 01:52

[n poem]springboot + graphql

 이전글 에서 프로젝트의  구조에 대해서 살펴보았다.

다시 복습을 해보자면 프로젝트는 크게 Domain / Service / Resolver 의 세 패키지 단위로 나뉘며 요청이 들어왔을 때 Resolver의 어느 메소드를 호출할 것인지는 미리 정해놓은 Schema에 의해서 결정이 된다. 이번에는 이 Schema를 어떻게 정의하는지에 대해 알아보겠다.

 

우선 스키마는 resources/graphql 디렉토리 안에 *.graphqls 라는 확장자로 파일을 만들어 작성해야 한다.

프로젝트 구조

우리는 크게 오브젝트에 관한 스키마, 쿼리 요청에 대한 스키마, 뮤테이션 요청에 대한 스키마를 작성 할 것이다.

 

아래와 같은 Poem이라는 Entity가 있다고 가정 하자. (아래 엔터티는 실제 N poem 프로젝트 중 poem의 초기 구조)

@Entity
public class Poem{
    // 생성자는 생략
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "word_id", nullable = false, updatable = false)
    private Word word;

    private String content;
    private Double timeSpent;
}

오브젝트의 스키마는 아래와 같이 작성 한다.

type 클래스명 {

    멤버변수명 : 리턴타입

}

 

위 규칙에 따라 작성한 Poem의 스키마는 아래와 같다.

type Poem {
    id: ID!, // ! 키워드는 이 필드가 non-nullable 한 것을 나타낸다.
    word: Word!, // 한 필드는 또다른 타입을 리턴 할 수 있다.
    content: String!,
    timeSpent: Float! // graphql의 타입엔 Double이 없다. 멤버변수가 double형이어도 Float 라고 타입을 작성 해 주도록 하자
}

 

 

 

Query 요청에 대한 스키마는 아래와 같이 작성한다.

type Query {

    호출할 메소드 : 리턴타입

}

type Query {
    poems: [Poem] // resolver의 poems 라는 메소드를 찾아 호출 한다. 리턴 타입은 Poem 타입의 리스트 형태이다.
}

 

Query의 요청은 아래와 같이 보낸다.

query{

    메소드명{

         가져올 데이터

    }

}

 

 위 poems 메소드는 아래와 같이 호출할 수 있다.

 

 

Mutation 요청에 대한 스키마는 아래와 같이 작성한다.

type Mutation {

    호출할 메소드(파라미터명: 파라미터 타입) : 리턴타입 // 파라미터가 객체단위일 경우 스키마를 따로 정의 해줘야 한다.

}

type Mutation {
    // Mutaion resolver의 writePoem 메소드를 호출한다.
    // writePoem메소드의 인자로는 PoemSaveRequestDto 타입을 넘겨준다.
    // writePoem의 결과는 엔터티의 ID를 반환한다.
    writePoem(entitySaveDto: PoemSaveRequestDto!): ID!
    
    // Mutaion resolver의 registerWord 메소드를 호출한다.
    // registerWord 인자로는 WordSaveRequestDto 타입을 넘겨준다.
    // registerWord 결과는 엔터티의 ID를 반환한다.
    registerWord(entitySaveDto: WordSaveRequestDto!): ID!
}

Mutaion의 요청은 아래와 같이 보낸다.

mutation 메소드명(value : 타입){

    메소드명(스키마에 정의한 인자 이름 : value)

}

 

"value": {

    "파라미터 스키마 타입의 필드": "값"

}

 

Graphql에서 Mutation에 파라미터로 객체 (Dto같은...)를 넘길 때에는 그 객체에 대한 스키마도 정의 해 주어야 한다.

input 파라미터타입 {

    필드명: 타입

}

 

위 registerWord에 넘겨준 WordSaveRequestDto는 아래의 스키마에 의해 정의된 타입이다.

input WordSaveRequestDto{
    text: String!
}

 

 

이번에는 간단하게 그래프큐엘의 스키마를 어떻게 작성하는지에 대해 보았고 본격적으로 서비스 로직에 의해 요청을 보내면 응답이 어떻게 오는지는 다음 글에서 비교해 보도록 하겠다.