● graphql이란?

Graphql은 페이스북에서 만든 쿼리 언어입니다.웹 클라이언트가 데이터를 서버로 부터 효율적으로 가져오는 것이 목적입니다.클라이언트 시스템에서 작성하고 호출합니다.

● rest API 와 비교

REST API는 URL, METHOD등을 조합하기 때문에 다양한 Endpoint가 존재 합니다.반면, graphql은 단 하나의 Endpoint가 존재 합니다.또한, graphql API에서는 불러오는 데이터의 종류를 쿼리 조합을 통해서 결정 합니다.예를 들면, REST API에서는 각 Endpoint마다 데이터베이스 SQL 쿼리가 달라지는 반면, graphql API는 graphql 스키마의 타입마다 데이터베이스 SQL 쿼리가 달라집니다.

https://blog.kakaocdn.net/dn/bLHjgX/btq0Xpzm6Et/wfnLZ78guXsBK89WG4MAg1/img.png

● 예제 GIT 주소


● graphql 설정

1. dependencies 설정

    testImplementation group: 'com.h2database', name: 'h2', version: '1.4.200' // 예제 database로 활용

    implementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa', version: '2.4.3'
    implementation group: 'com.graphql-java-kickstart', name: 'graphql-spring-boot-starter', version: '11.0.0'
    implementation group: 'com.graphql-java-kickstart', name: 'graphql-java-tools', version: '11.0.0'

    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'

2. GraphQL servlet 설정

spring boot 설정 추가(application.yml or application.properties)

spring:
  datasource:
    url: jdbc:h2:mem:testdb;DB_CLOSE_ON_EXIT=FALSE
    username: sa
    password:
    driverClassName: org.h2.Driver
    hikari:
      maximum-pool-size: 24
  h2:
    console:
      enabled: true
  jpa:
    generate-ddl: true
    hibernate:
      ddl-auto: update
    properties:
      hibernate:
        dialect: org.hibernate.dialect.H2Dialect
        format_sql: true
    show-sql: true
graphql:
  servlet:
    enabled: true
    mapping: /graphql
    corsEnabled: false
    cors:
      allowed-origins: <http://localhost:8080>
      allowed-methods: GET, HEAD, POST, PATCH
    exception-handlers-enabled: true
    context-setting: PER_REQUEST_WITH_INSTRUMENTATION
    async-mode-enabled: true
  tools:
    schema-location-pattern: "**/*.graphqls"
    introspection-enabled: true

3. 도메인, 레포지토리, 데이터 만들기

Member와 Role의 도메인과 해당 데이터를 채워주는 data를 만듭니다.

@Builder
@Entity
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class Member {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    private String loginId;

    private String password;

    private String name;

    @OneToMany
    @JoinColumn(name = "memberId", referencedColumnName = "id", insertable = false, updatable = false)
    private List<Role> role;
}