GraphiQL

2024. 12. 16. 18:21TIL

 

REST API 문서화를 위한 도구인 SWAGGER를 통해서 회원가입,로그인,이메일 인증 API를 테스트 했다면,

채팅 API의 GraphQL 스키마의 탐색 및 쿼리 테스트 도구를 위해서 GraphiQL을 사용하였다. Apollo Studio는 대규모 프로젝트,팀 협업에 더 적합한 도구이고 초기 설정에 시간이 걸린다는 점 때문에 선택하지 않았다.

의존성 추가

// GraphQL Playground
    implementation("com.graphql-java-kickstart:graphql-spring-boot-starter:11.0.0")
    implementation("com.graphql-java-kickstart:graphiql-spring-boot-starter:11.0.0")

 

application.yml

spring: 하위에 작성

  graphql:
    graphiql:
      enabled: true 
      printer:
        enabled: true

 

schema.graphqls 작성

type Message {
    id: ID,
    content: String
    sender: String
    timestamp: String
}

type Mutation {
    sendMessage(content: String!): Message
}

type Query {
    getMessages: [Message]
}

 

Securityconfig 해당 경로 추가

.authorizeHttpRequests {
    it.requestMatchers(
        "/graphql"
    ).permitAll()

 

컨트롤러 작성

package hjp.hjchat.domain.chat.controller

import graphql.kickstart.tools.GraphQLMutationResolver
import graphql.kickstart.tools.GraphQLQueryResolver
import hjp.hjchat.domain.chat.dto.MessageDto
import hjp.hjchat.domain.chat.entity.Message
import hjp.hjchat.domain.chat.entity.toResponse
import hjp.hjchat.domain.chat.model.MessageRepository
import org.springframework.graphql.data.method.annotation.Argument
import org.springframework.graphql.data.method.annotation.MutationMapping
import org.springframework.graphql.data.method.annotation.QueryMapping
import org.springframework.stereotype.Controller

@Controller
class ChatController(
    private val messageRepository: MessageRepository
) : GraphQLQueryResolver, GraphQLMutationResolver {

    @QueryMapping
    fun getMessages(): List<MessageDto> {
        return messageRepository.findAll().map { it.toResponse() }
    }

    @MutationMapping
    fun sendMessage(@Argument content: String): MessageDto {
        println("Saved message: $content")
        val savedMessage = messageRepository.save(
            Message(content = content)
        )
        return savedMessage.toResponse()
    }
}

 

로컬에서 테스트 (http://localhost:8080/graphiql)