introduce
1. GraphQL ์๊ฐ
GraphQL์ ํ์ด์ค๋ถ์์ ๊ฐ๋ฐ๋์ด 2015๋ ์ ์คํ ์์ค๋ก ๊ณต๊ฐ๋ API ์ฟผ๋ฆฌ ์ธ์ด์ ๋๋ค. REST API์์๋ ํด๋ผ์ด์ธํธ๊ฐ ์ฌ๋ฌ ์๋ํฌ์ธํธ๋ฅผ ํธ์ถํด์ผ ํ๊ฑฐ๋, ํ์ ์ด์์ผ๋ก ๋ง์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋ ์ค๋ฒํ์นญ(over-fetching) ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. GraphQL์ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ฉฐ, ํด๋ผ์ด์ธํธ๊ฐ ํ์ํ ๋ฐ์ดํฐ๋ง ์ ํํ ์์ฒญํ ์ ์๊ฒ ํด์ค๋๋ค.
GraphQL์ ์ฃผ์ ํน์ง
GraphQL์ ๊ฐ์ ์ ๋ค์๊ณผ ๊ฐ์ ํต์ฌ์ ์ธ ํน์ง์์ ๋น๋กฏ๋ฉ๋๋ค:
๋จ์ผ ์๋ํฌ์ธํธ: REST API๋ ์์๋ณ๋ก ์๋ํฌ์ธํธ๋ฅผ ๋ง๋ค์ด์ผ ํ์ง๋ง, GraphQL์
/graphql
๊ฐ์ ๋จ์ผ ์๋ํฌ์ธํธ๋ฅผ ํตํด ๋ชจ๋ ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค. ์ด๋ ํด๋ผ์ด์ธํธ๊ฐ ์ฌ๋ฌ ์๋ํฌ์ธํธ๋ฅผ ๊ด๋ฆฌํ ํ์๊ฐ ์์ด API ๊ด๋ฆฌ๊ฐ ๊ฐํธํด์ง๋๋ค.๊ฐ๋ ฅํ ํ์ ์์คํ : GraphQL์ ์คํค๋ง๋ฅผ ํตํด ๋ฐ์ดํฐ์ ๊ตฌ์กฐ๋ฅผ ๋ช ํํ ์ ์ํฉ๋๋ค. ์ด ์คํค๋ง๋ ์ฟผ๋ฆฌ(Query), ๋ฎคํ ์ด์ (Mutation), ๊ตฌ๋ (Subscription) ๋ฑ์ ํ์ ์ ํฌํจํ๋ฉฐ, ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ์ํต์ด ๋ ์์ ํ๊ณ ์์ธก ๊ฐ๋ฅํด์ง๋๋ค.
์์ฒด ๋ฌธ์ํ: GraphQL ์คํค๋ง๋ API์ ๋ฌธ์ ์ญํ ์ ํ๋ฏ๋ก, ๋ณ๋์ ๋ฌธ์ ์์ ์์ด๋ API์ ๊ธฐ๋ฅ์ ์ฝ๊ฒ ์ดํดํ ์ ์์ต๋๋ค. ์ด๋ ๊ฐ๋ฐ ํ ๊ฐ์ ํ์ ์ ์ํํ๊ฒ ํ๊ณ , API ๋ณ๊ฒฝ ์ฌํญ์ ์ฆ์ ๋ฐ์ํ ์ ์๊ฒ ํด์ค๋๋ค.
ํด๋ผ์ด์ธํธ ์ฃผ๋ ๊ฐ๋ฐ: GraphQL์ ํด๋ผ์ด์ธํธ๊ฐ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ํํ ์์ฒญํ ์ ์๊ฒ ํด์ค๋๋ค. ์ฆ, ์ค๋ฒํ์นญ์ด๋ ์ธ๋ํ์นญ(under-fetching) ๋ฌธ์ ๋ฅผ ํผํ ์ ์์ต๋๋ค.
์ด๋ฌํ ํน์ง ๋๋ถ์ GraphQL์ ๋ชจ๋ฐ์ผ ์ฑ, ์น ํ๋ก ํธ์๋, ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ ๋ฑ ๋ค์ํ ํ๊ฒฝ์์ ์ ์ ๋ ๋ง์ด ์ฌ์ฉ๋๊ณ ์์ต๋๋ค.
2. GraphQL ์๋ ์๋ฆฌ
GraphQL์ด ์ด๋ป๊ฒ ๋์ํ๋์ง ์ดํดํ๋ ๊ฒ์ GraphQL์ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ฐ ํ์์ ์ ๋๋ค. GraphQL์ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ํ์ ์ ํจ์จ์ ์ผ๋ก ๋ง๋๋ ๋ช ๊ฐ์ง ํต์ฌ ๋จ๊ณ๋ฅผ ๊ฑฐ์นฉ๋๋ค.
2.1. ์คํค๋ง ์ ์
GraphQL์ ๋ชจ๋ ๊ฒ์ ์คํค๋ง์์ ์์๋ฉ๋๋ค. ์คํค๋ง๋ API์์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฐ์ดํฐ์ ๊ตฌ์กฐ๋ฅผ ์ ์ํ๋ ์ญํ ์ ํฉ๋๋ค. ์คํค๋ง๋ ๋ค์๊ณผ ๊ฐ์ ์์๋ก ๊ตฌ์ฑ๋ฉ๋๋ค:
ํ์ (Type): ๋ฐ์ดํฐ์ ์ข ๋ฅ๋ฅผ ์ ์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด,
User
ํ์ ์ ์ฌ์ฉ์์ ์ด๋ฆ, ์ด๋ฉ์ผ ๋ฑ์ ํ๋๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค.์ฟผ๋ฆฌ(Query): ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๋ ๋ฐฉ๋ฒ์ ์ ์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด,
users
์ฟผ๋ฆฌ๋ ๋ชจ๋ ์ฌ์ฉ์์ ๋ชฉ๋ก์ ๊ฐ์ ธ์ค๋ ์ญํ ์ ํฉ๋๋ค.๋ฎคํ ์ด์ (Mutation): ๋ฐ์ดํฐ๋ฅผ ์์ฑ, ์์ , ์ญ์ ํ๋ ๋ฐฉ๋ฒ์ ์ ์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด,
createUser
๋ฎคํ ์ด์ ์ ์๋ก์ด ์ฌ์ฉ์๋ฅผ ์์ฑํฉ๋๋ค.๊ตฌ๋ (Subscription): ์ค์๊ฐ ๋ฐ์ดํฐ๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ํธ์ํ๋ ๋ฐฉ๋ฒ์ ์ ์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฑํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ ๋ฉ์์ง๊ฐ ๋์ฐฉํ ๋ ํด๋ผ์ด์ธํธ์๊ฒ ์๋ฆผ์ ๋ณด๋ผ ์ ์์ต๋๋ค.
์คํค๋ง๋ GraphQL SDL(Schema Definition Language)์ด๋ผ๋ ์ธ์ด๋ก ์์ฑ๋๋ฉฐ, ์ด๋ฅผ ํตํด ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ์๋ก ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์๋์ง ๋ช ํํ ์ ์ ์์ต๋๋ค.
2.2. ์ฟผ๋ฆฌ ์์ฒญ
ํด๋ผ์ด์ธํธ๋ ์์ ์ด ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ๊ตฌ์ฒด์ ์ผ๋ก ์์ฒญํ๋ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํด ์๋ฒ๋ก ๋ณด๋ ๋๋ค. ์ฟผ๋ฆฌ๋ GraphQL์ ํต์ฌ ๊ธฐ๋ฅ ์ค ํ๋๋ก, ํด๋ผ์ด์ธํธ๊ฐ ํ์ํ ๋ฐ์ดํฐ์ ๊ตฌ์กฐ๋ฅผ ์ ํํ ์ง์ ํ ์ ์๊ฒ ํด์ค๋๋ค. ์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ์๊ฐํด ๋ณผ ์ ์์ต๋๋ค:
์ด ์ฟผ๋ฆฌ๋ "ID๊ฐ 1์ธ ์ฌ์ฉ์์ ์ด๋ฆ๊ณผ ์ด๋ฉ์ผ๋ง ๊ฐ์ ธ์"๋ผ๋ ๋ป์ ๋๋ค. REST API์์๋ ์ฌ์ฉ์์ ๋ชจ๋ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ์๋ํฌ์ธํธ๋ฅผ ํธ์ถํ ๋ค ํ์ํ ํ๋๋ง ๊ณจ๋ผ๋ด์ผ ํ์ง๋ง, GraphQL์์๋ ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ง์ถฐ ์ ํํ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํฉ๋๋ค.
2.3. ๋ฆฌ์กธ๋ฒ ํจ์ ์คํ
์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ์ผ๋ฉด, ์ด๋ฅผ ๋ถ์ํด ํด๋น ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด ๋ฆฌ์กธ๋ฒ(resolver) ํจ์๋ฅผ ์คํํฉ๋๋ค. ๋ฆฌ์กธ๋ฒ๋ ์คํค๋ง์ ์ ์๋ ๊ฐ ํ๋์ ๋ํด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ก์ง์ ๋ด๋นํฉ๋๋ค. ์๋ฅผ ๋ค์ด, user
์ฟผ๋ฆฌ์ ๋ฆฌ์กธ๋ฒ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํด๋น ID์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์กฐํํ๊ณ , name
๊ณผ email
ํ๋๋ฅผ ์ถ์ถํด ๋ฐํํฉ๋๋ค.
2.4. ์๋ต ๋ฐํ
๋ง์ง๋ง์ผ๋ก, ์๋ฒ๋ ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ ๊ตฌ์กฐ์ ๋ง์ถฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํฉ๋๋ค. ์๋ต์ JSON ํ์์ผ๋ก ์ ๊ณต๋๋ฉฐ, ์ฟผ๋ฆฌ์์ ์์ฒญํ ํ๋๋ง ํฌํจ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์์ ์ฟผ๋ฆฌ์ ๋ํ ์๋ต์ ๋ค์๊ณผ ๊ฐ์ ์ ์์ต๋๋ค:
์ด์ฒ๋ผ GraphQL์ ํด๋ผ์ด์ธํธ๊ฐ ํ์๋ก ํ๋ ๋ฐ์ดํฐ๋ง ์ ํํ ๋ฐํํ๋ฏ๋ก, ๋คํธ์ํฌ ๋์ญํญ์ ์ ์ฝํ๊ณ ํด๋ผ์ด์ธํธ์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ก์ง์ ๊ฐ์ํํ ์ ์์ต๋๋ค.
3. ์ฝํ๋ฆฐ์ ์ฌ์ฉํ GraphQL ์ํ ์ค์น๋ฒ
์ด์ ์ด๋ก ์์ ๋ฒ์ด๋, ์ค์ ๋ก ์ฝํ๋ฆฐ๊ณผ Spring Boot๋ฅผ ํ์ฉํด ๊ฐ๋จํ GraphQL ์๋ฒ๋ฅผ ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค. ์ฝํ๋ฆฐ์ ๊ฐ๊ฒฐํ๊ณ ์์ ํ ๋ฌธ๋ฒ์ ์ ๊ณตํ๋ JVM ๊ธฐ๋ฐ ์ธ์ด๋ก, GraphQL ์๋ฒ ๊ฐ๋ฐ์ ๋งค์ฐ ์ ํฉํฉ๋๋ค. ์๋๋ ๋จ๊ณ๋ณ ์ค์น๋ฒ์ ๋๋ค.
3.1. ์ฌ์ ์ค๋น
GraphQL ์๋ฒ๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ ์ ๋ช ๊ฐ์ง ๋๊ตฌ๊ฐ ํ์ํฉ๋๋ค:
JDK 11 ์ด์: Java Development Kit์ด ์ค์น๋์ด ์์ด์ผ ํฉ๋๋ค.
IDE: IntelliJ IDEA๋ฅผ ์ถ์ฒํ์ง๋ง, Eclipse๋ VS Code ๋ฑ ๋ค๋ฅธ IDE๋ฅผ ์ฌ์ฉํด๋ ๋ฌด๋ฐฉํฉ๋๋ค.
๋น๋ ๋๊ตฌ: Gradle์ด๋ Maven ์ค ํ๋๋ฅผ ์ค์นํฉ๋๋ค. ์ด ์์ ์์๋ Gradle์ ์ฌ์ฉํ๊ฒ ์ต๋๋ค.
3.2. ํ๋ก์ ํธ ์์ฑ
3.3. GraphQL ์์กด์ฑ ์ถ๊ฐ
build.gradle.kts
ํ์ผ์ GraphQL ๊ด๋ จ ์์กด์ฑ์ ์ถ๊ฐํฉ๋๋ค.
์์กด์ฑ์ ์ถ๊ฐํ ํ, Gradle์ ํตํด ํ๋ก์ ํธ๋ฅผ ๋ฆฌํ๋ ์ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ค์ด๋ก๋ํฉ๋๋ค.
3.4. ์คํค๋ง ์ ์
src/main/resources
ํด๋์ schema.graphqls
ํ์ผ์ ์์ฑํ๊ณ , ๋ค์ ๋ด์ฉ์ ์์ฑํฉ๋๋ค:
์ด ์คํค๋ง๋ "hello"๋ผ๋ ์ฟผ๋ฆฌ๋ฅผ ์์ฒญํ๋ฉด ๋ฌธ์์ด์ ๋ฐํํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
3.5. ๋ฆฌ์กธ๋ฒ ๊ตฌํ
src/main/kotlin/com/example/graphql_demo
ํด๋์ QueryResolver.kt
ํ์ผ์ ์์ฑํ๊ณ , ๋ค์ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค:
์ด ์ฝ๋๋ hello
์ฟผ๋ฆฌ์ ๋์ํ๋ ๋ฆฌ์กธ๋ฒ๋ฅผ ์ ์ํฉ๋๋ค.
3.6. ์ ํ๋ฆฌ์ผ์ด์
์คํ
src/main/kotlin/com/example/graphql_demo/Application.kt
ํ์ผ์ ์ด๊ณ , ์๋ฒ๋ฅผ ์คํํฉ๋๋ค. IDE์์ "Run" ๋ฒํผ์ ํด๋ฆญํ๊ฑฐ๋, ํฐ๋ฏธ๋์์ ./gradlew bootRun
๋ช
๋ น์ด๋ฅผ ์คํํ์ธ์.
3.7. ์ฟผ๋ฆฌ ํ
์คํธ
๋ธ๋ผ์ฐ์ ์์ http://localhost:8080/graphiql
์ ์ ์ํด ๋ค์ ์ฟผ๋ฆฌ๋ฅผ ํ
์คํธํฉ๋๋ค:
์๋ต์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
Last updated