기술블로그

apollo-client에 사용자 입력값 보내주기 실습 및 스코프체인

이경찬 :) 2023. 1. 31. 15:33

graphql mutation을 실행하려는 페이지 상단에서, apollo-client의 도구들을 불러옵니다.

// graphql 요청에 필요한 도구 불러오기
import { useMutation, gql } from '@apollo/client'

javascript 입력 부분에 playground의 코드를 복사하여 아래와 같이 gql`` 사이에 붙여넣어 변수/상수를 만들어 줍니다.

// graphql 코드 생성
const CREATE_BOARD = gql`
	mutation {
		createBoard(
			writer: "훈이",
			password: "1234",
			title: "안녕하세요 훈이에요",
			contents: "반갑습니다"
		){
			message
		}
	}
`

gql 변수/상수를 활용하여, useMutation을 만들어 줍니다.

// mutation 코드 생성
const [myApp] = useMutation(CREATE_BOARD)

게시물 등록 버튼을 클릭했을 때 실행되는 함수에서 mutation 코드를 실행해 줍니다.

function handleClickPost(){

	createBoard({
			variables: {
					aaa: "훈이",
					bbb: "1234",
					ccc: "안녕하세요 훈이에요",
					ddd: "반갑습니다"
			}
	})
	return (
		<button onClick={handleClickPost}>게시물 등록</button>
	)
}

위 코드는 항상 같은 게시물이 등록된다는 문제점이 있습니다.

CREATE_BOARD 부분이 변경될 필요가 있습니다.

graphql 변경후

const CREATE_BOARD = gql `
	mutation zzzz($aaa: String, $bbb: String, $ccc: String, $ddd: String) {
    	createBoard(
        	writer:$aaa,
            password: $bbb,
            title: $ccc,
            contents: $ddd
          ){
          	message
           }
       }
   `

mutation 변경후

function handleClickPost(){

	createBoard({
    	variables: {
        	aaa: "훈이",
            bbb: "1234",
            ccc: "안녕하세요 훈이에요",
            ddd: "반갑습니다"
          }
       })
    }

즉, graphql에 데이터는 최종적으로 등록하기 버튼을 눌렀을 때, 실행되는 handleClickPost 함수에서 실행되는 mutation 에서 넣어 주어야 합니다.

 

여기서, 들어가는 데이터를 고정된 값에서 state로 변경하면! 최종적인 코드가 완성됩니다!

 

graphql 뮤테이션에 async / await 적용

rest-API 또는 graphql-API 를 사용해서 해야할 일은 요청에 대한 응답으로 받은 객체(JSON)를 변수에 담아서 사용하는 것입니다.

여기서! 응답 결과를 변수에 담아서 사용하려면! 통신이 완료될 때까지 기다려야 합니다!

async / await 를 활용해 보겠습니다.

// mutation에 동기식 처리
async function handleClickPost(){

		const result = await createBoard({
															variables: {
																	aaa: "훈이",
																	bbb: "1234",
																	ccc: "안녕하세요 훈이에요",
																	ddd: "반갑습니다"
															}
													})

		// 결과물 확인하기
		console.log(result)

}

return (
	<button onClick={handleClickPost}>게시물 등록</button>
)

기본 형식은 이렇게 됩니다, 화살표 함수로 사용 할때는 async 의 위치를 () 앞에 입력해야합니다.

// 비동기 통신
function 함수명() {
	// 서버에 요청하는 코드
}


// 동기 통신
async function 함수명
() {
	await // 서버에 요청하는 코드
}
--------------------------------------------------------------------------------
// 화살표 함수의 경우
const 함수명 = async () => {
	await // 서버에 요청하는 코드
}