안녕하세요! graphQL 공부중인 고등학생 이영은 이라고 합니다! 이런 커뮤니티에서 많은...
# 질문
u
안녕하세요! graphQL 공부중인 고등학생 이영은 이라고 합니다! 이런 커뮤니티에서 많은 분들과 함께할 수 있다는 사실에 너무 감사드립니다 삽질도 해보고 구글에 검색도 많이 해봤는데 아직 해답을 찾지 못하고 있습니다ㅠ Android에서 Apollo+RxJava를 함께 사용해서 GraphQL 작업을 하고 있습니다. RestAPI를 사용할 떈 Status code+Message를 통해 대략적인 에러의 자세한 정보를 확인 할 수 있었는데요, GraphQL특성상 status code나 message로 오류를 처리하는게 불가능(올바르지 않음)한데, 서버가 보내주는 상세한 오류내용을 클라이언트에서 처리를 할수있는 방법이 있을까요? 아래 내용은 서버가 보내주는 Error정보입니다.(PostMan으로 요청보낸 결과입니다.) 혹, 이 문제에 대해서 조언을 구할 수 있을지.. 조심스레 질문드려봅니다..!
t
apollo-android를 사용하시는건가요??
u
@Tony Won 네 그렇습니다! :D
t
apollo-android에서 해당 에러를 throw 해주지 않는건가요??
u
Throw한 Error에는 http Exception 관련 내용들이 가득하네요.
t
흠... React Apollo 웹 클라이언트는 보통 loading, error, data 같은 값들을 같이 주는데요. Android도 비슷할거같아요
u
흠… React는 loading처리도 지원하는군요 ㅠ
공식 문서들도 많이 읽어봤는데… 오류처리부분이 없는것같기도 해요.. 제가 못찾는걸수도 있지만..ㅠ
onFailure 핸들러가 있어요~
u
호오.. 리액티브 프로그래밍 하려다보니 그랬네요.. 한번 확인해보겠습니다 !
같은 에러를 Throw해주네요..
h
음 그냥 현상 그대로 400을 받은 것 같네요. graphql 미들웨어 앞단에 다른 녀석들 걸릴게 없는지 확인해보세요
u
@Hyeseong Kim 서버에서는 성공(Status:200) 또는 오류(Status:400)으로 처리하고, 자세한 오류내용은 위 PostMan처럼 errors에 넣어서 보내줍니다ㅠ Token만료에 대한 처리를 하려고 하니.. 쉽지가 않네요.
t
?? GraphQL은 실패도 200으로 처리해야해요
서버를 어떤거로 짜셨나요??
u
@Tony Won 지속적인 도움을 주셔서 대단히 감사드립니당ㅠ 서버는 제 친구가 작성했는데 Node.js로 짰다고 합니다..!
t
넵 ㅋㅋㅋ GraphQL HTTP 서버는 성공이든 실패든 200을 줘야하구요. 서버에서 400이 날아오니 Apollo 클라이언트에서는 GraphQL 오류가 아니라 뭔지 모를 서버 오류로 판단하고 메시지를 출력하는거같아요 ㅎㅎ
u
@Tony Won 그럼 오류발생시 포스트맨 오른쪽 상단 Status에도 StatusCoderk 200으로 떠야하는건가요??
t
넵!
아마 apollo-server-express를 사용하시면서 서버 내에 res.status(400)을 하시는거같은데, 그부분만 삭제해보세요 ㅎㅎ
u
@Tony Won 허허허… 친구한테 바로 전화해봐야겠습니다 ..ㅋㅋ 혹, Apollo나, GraphQL에서 자체적으로 status코드를 400으로 보내주는..? 경우는 없는지요 ??
t
네 절대로 없어요~
❤️ 1
u
@Tony Won 하하하 너무감사드립니다ㅋㅋㅋ 오늘로 4일째인 삽질이… 서버쪽 문제였군요. 너무감사드립니다ㅠㅠㅠ
t
자체적으로 Error Handling을 하고있어서, GraphQL 구현체 내부에서 throw Error하게되면 무조건 GraphQL이 Catch해서 200으로 떨어집니다. 이런거때문에 에러핸들링하는게 조금 달라요 ㅋㅋ 저도 Sentry 잡느라 고생중입니다
u
@Tony Won 아.. 그렇군요ㅠㅠ 너무감사드립니다. 아, 혹시 Github V4 Api(GraphQL API)에서는 토큰 문제시, Status를 401로 보내주는데.. 토큰관련 오류처리는 github처럼 status로 오류를 처리하는게 옳은걸까요?
t
인증 관련 로직이 미들웨어에 들어있냐 GraphQL 프레임워크 내부에 들어있냐의 차이일거같아요. 지금 발생하신 오류는 GraphQL 프레임워크 내부의 Context를 만들때 발생한 에러라 200을 내는게 맞다고 생각하구요. 만약에 미들웨어에 들어있는 로직이라면, statusCode를 사용해도 될거같아요 ㅎㅎ 그런 의미에서 둘 다 가능하니, Apollo Android에서 처리하는게 곤란하면 다 200으로 떨어뜨리시죠~
엔지니어링에 100% 옳은건 없다고 생각해요 ㅎㅎ 더 나은 방법이 있을텐데, 상황마다 다르니까 그때그때 여기에 여쭤보시면서 직접 결정하시면 됩니다!
그나저나 고등학생인데, 대단하세요~~
u
@Tony Won 오호… 그렇군요. 사실 질문 적을 때 옳다 ? 라는 표현을 써도 될지 잠깐 생각했었는데 적절한 단어가 생각이 딱히 떠오르지 않았네요~ 이런저런 좋은 말씀들 얻을 수 있는 좋은 커뮤니티를 찾아서 기쁩니다~ㅋㅋ 나중에 기회가 된다면 오프라인 밋업에서 뵐수 있었으면 좋겠네요!! 아직 갈길이 멀었다고 생각합니다 😄 대단하게 봐주신다니 감사할 따름이네요~ 오늘 오후도 화이팅하시길 바래요~~