diff --git a/놀이터(예제 코드 작성)/graphql-kotlin/src/main/kotlin/com/banjjoknim/graphqlkotlin/person/GraphQLSchema.kt b/놀이터(예제 코드 작성)/graphql-kotlin/src/main/kotlin/com/banjjoknim/graphqlkotlin/person/GraphQLSchema.kt new file mode 100644 index 0000000..1998c65 --- /dev/null +++ b/놀이터(예제 코드 작성)/graphql-kotlin/src/main/kotlin/com/banjjoknim/graphqlkotlin/person/GraphQLSchema.kt @@ -0,0 +1,12 @@ +package com.banjjoknim.graphqlkotlin.person + +import com.expediagroup.graphql.generator.annotations.GraphQLDescription +import com.expediagroup.graphql.server.Schema +import org.springframework.stereotype.Component + +/** + * In order to expose your schema directives, queries, mutations, and subscriptions in the GraphQL schema create beans that implement the corresponding marker interface and they will be automatically picked up by graphql-kotlin-spring-server auto-configuration library. + */ +@GraphQLDescription("Sample GraphQL Schema") +@Component +class GraphQLSchema : Schema diff --git a/놀이터(예제 코드 작성)/graphql-kotlin/src/main/kotlin/com/banjjoknim/graphqlkotlin/person/Person.kt b/놀이터(예제 코드 작성)/graphql-kotlin/src/main/kotlin/com/banjjoknim/graphqlkotlin/person/Person.kt new file mode 100644 index 0000000..5772d37 --- /dev/null +++ b/놀이터(예제 코드 작성)/graphql-kotlin/src/main/kotlin/com/banjjoknim/graphqlkotlin/person/Person.kt @@ -0,0 +1,5 @@ +package com.banjjoknim.graphqlkotlin.person + +data class Person( + var name: String, +) diff --git a/놀이터(예제 코드 작성)/graphql-kotlin/src/main/kotlin/com/banjjoknim/graphqlkotlin/person/PersonMutation.kt b/놀이터(예제 코드 작성)/graphql-kotlin/src/main/kotlin/com/banjjoknim/graphqlkotlin/person/PersonMutation.kt new file mode 100644 index 0000000..3d8174e --- /dev/null +++ b/놀이터(예제 코드 작성)/graphql-kotlin/src/main/kotlin/com/banjjoknim/graphqlkotlin/person/PersonMutation.kt @@ -0,0 +1,14 @@ +package com.banjjoknim.graphqlkotlin.person + +import com.expediagroup.graphql.server.operations.Mutation +import org.springframework.stereotype.Component + +@Component +class PersonMutation : Mutation { + + fun changeName(person: Person, newName: String): Person { + return person.apply { + name = newName + } + } +} diff --git a/놀이터(예제 코드 작성)/graphql-kotlin/src/main/kotlin/com/banjjoknim/graphqlkotlin/person/PersonQuery.kt b/놀이터(예제 코드 작성)/graphql-kotlin/src/main/kotlin/com/banjjoknim/graphqlkotlin/person/PersonQuery.kt new file mode 100644 index 0000000..ef6cfa0 --- /dev/null +++ b/놀이터(예제 코드 작성)/graphql-kotlin/src/main/kotlin/com/banjjoknim/graphqlkotlin/person/PersonQuery.kt @@ -0,0 +1,37 @@ +package com.banjjoknim.graphqlkotlin.person + +import com.expediagroup.graphql.generator.annotations.GraphQLIgnore +import com.expediagroup.graphql.server.operations.Query +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.stereotype.Component + +@Component +class PersonQuery( + /** + * # Spring Beans + * + * Since the top level objects are Spring components, Spring will automatically autowire dependent beans as normal. + * + * Refer to [Spring Documentation](https://docs.spring.io/spring-framework/docs/current/reference/html/) for details. + */ + private val personRepository: PersonRepository +) : Query { + + fun getPerson(name: String): Person = Person(name) + + /** + * # Spring Beans in Arguments + * + * graphql-kotlin-spring-server provides Spring-aware data fetcher that automatically autowires Spring beans when they are specified as function arguments. + * + * `@Autowired` arguments should be explicitly excluded from the GraphQL schema by also specifying @GraphQLIgnore. + * + * ``` + * NOTE + * If you are using custom data fetcher make sure that you extend SpringDataFetcher instead of the base FunctionDataFetcher to keep this functionallity. + * ``` + */ + fun findPerson(@GraphQLIgnore @Autowired personRepository: PersonRepository, name: String): Person? { + return personRepository.findPerson(name) + } +} diff --git a/놀이터(예제 코드 작성)/graphql-kotlin/src/main/kotlin/com/banjjoknim/graphqlkotlin/person/PersonRepository.kt b/놀이터(예제 코드 작성)/graphql-kotlin/src/main/kotlin/com/banjjoknim/graphqlkotlin/person/PersonRepository.kt new file mode 100644 index 0000000..cbf2c8d --- /dev/null +++ b/놀이터(예제 코드 작성)/graphql-kotlin/src/main/kotlin/com/banjjoknim/graphqlkotlin/person/PersonRepository.kt @@ -0,0 +1,6 @@ +package com.banjjoknim.graphqlkotlin.person + +interface PersonRepository { + + fun findPerson(name: String): Person? +} diff --git a/놀이터(예제 코드 작성)/graphql-kotlin/src/main/kotlin/com/banjjoknim/graphqlkotlin/person/PersonRepositoryImpl.kt b/놀이터(예제 코드 작성)/graphql-kotlin/src/main/kotlin/com/banjjoknim/graphqlkotlin/person/PersonRepositoryImpl.kt new file mode 100644 index 0000000..167227e --- /dev/null +++ b/놀이터(예제 코드 작성)/graphql-kotlin/src/main/kotlin/com/banjjoknim/graphqlkotlin/person/PersonRepositoryImpl.kt @@ -0,0 +1,18 @@ +package com.banjjoknim.graphqlkotlin.person + +import org.springframework.stereotype.Repository + +@Repository +class PersonRepositoryImpl : PersonRepository { + + companion object { + private val people = mapOf( + "banjjoknim" to Person("banjjoknim"), + "colt" to Person("colt") + ) + } + + override fun findPerson(name: String): Person? { + return people[name] + } +} diff --git a/놀이터(예제 코드 작성)/graphql-kotlin/src/main/kotlin/com/banjjoknim/graphqlkotlin/person/PersonSubscription.kt b/놀이터(예제 코드 작성)/graphql-kotlin/src/main/kotlin/com/banjjoknim/graphqlkotlin/person/PersonSubscription.kt new file mode 100644 index 0000000..c2b6a3b --- /dev/null +++ b/놀이터(예제 코드 작성)/graphql-kotlin/src/main/kotlin/com/banjjoknim/graphqlkotlin/person/PersonSubscription.kt @@ -0,0 +1,13 @@ +package com.banjjoknim.graphqlkotlin.person + +import com.expediagroup.graphql.server.operations.Subscription +import org.reactivestreams.Publisher +import org.springframework.stereotype.Component + +@Component +class PersonSubscription : Subscription { + + fun changeName(person: Person, newName: String): Publisher { + return Publisher { println("change name published") } + } +}