GraphQL 주니어 테스트 및 코드품질 기술면접
새 면접Q. GraphQL Resolver 함수를 테스트할 때 어떤 요소들을 검증해야 하나요? 기본적인 테스트 항목 3가지를 설명해주세요.
Resolver의 입력, 출력, 그리고 의존성에 주목해보세요.
GraphQL Resolver를 테스트할 때는 첫째, 올바른 인자를 받았을 때 예상한 데이터를 반환하는지 검증해야 합니다. 둘째, 데이터베이스나 외부 API 같은 의존성이 올바르게 호출되는지 확인해야 합니다. 셋째, 에러 상황에서 적절한 예외 처리가 되는지 테스트해야 합니다. 넷째, Context 객체를 통한 인증 정보가 올바르게 전달되고 처리되는지 검증합니다. 이를 위해 Mock 데이터와 Stub을 활용하여 의존성을 격리하는 것이 중요합니다.
- • 입력 인자에 따른 올바른 반환값 검증
- • 외부 의존성(DB, API) 호출 검증
- • 에러 처리 및 예외 상황 테스트
사용자 조회 Resolver가 올바른 권한 검증 후 데이터를 반환하는지 테스트할 때 사용됩니다.
Resolver 테스트 시 실제 데이터베이스를 사용하는 것과 Mock을 사용하는 것의 장단점은 무엇인가요?
Q. GraphQL API의 통합 테스트를 작성할 때, 단위 테스트와 어떤 점이 다른가요? 통합 테스트에서 중점적으로 검증해야 할 사항을 설명해주세요.
여러 레이어가 함께 동작하는 전체 흐름을 생각해보세요.
GraphQL 통합 테스트는 단위 테스트와 달리 Schema, Resolver, DataSource가 함께 동작하는 전체 흐름을 검증합니다. 실제 GraphQL 쿼리나 뮤테이션을 서버에 전송하고 응답을 확인하는 방식으로 진행됩니다. 중점 검증 사항으로는 첫째, Schema Validation이 올바르게 작동하는지, 둘째, 여러 Resolver가 연계되어 중첩된 쿼리를 처리하는지, 셋째, 인증/인가 미들웨어가 정상 동작하는지 확인합니다. 넷째, 실제 데이터베이스나 테스트 DB를 사용하여 데이터 흐름 전체를 검증합니다. 테스트용 GraphQL 서버 인스턴스를 생성하여 실제 환경과 유사하게 테스트하는 것이 핵심입니다.
- • Schema부터 DataSource까지 전체 레이어 통합 검증
- • 실제 GraphQL 쿼리/뮤테이션 실행 테스트
- • 인증/인가 미들웨어 포함 전체 플로우 확인
게시글 생성 후 댓글 추가, 조회까지의 전체 플로우가 정상 동작하는지 검증할 때 사용됩니다.
통합 테스트에서 테스트 데이터베이스를 어떻게 관리하고 초기화하는 것이 좋을까요?
Q. 여러 Resolver에서 중복되는 인증 로직과 권한 확인 코드가 반복되고 있습니다. 이를 개선하기 위한 리팩토링 방법을 제시해주세요.
GraphQL의 미들웨어나 데코레이터 패턴을 고려해보세요.
중복되는 인증 로직은 Custom Directive나 Middleware 패턴으로 리팩토링할 수 있습니다. 첫 번째 방법은 @auth, @hasRole 같은 Schema Directive를 만들어 필드나 타입 레벨에서 선언적으로 적용하는 것입니다. 두 번째는 Resolver Chain이나 Higher-Order Function을 사용해 인증 로직을 Wrapper로 감싸는 방법입니다. 세 번째는 Context 객체에 인증된 사용자 정보를 담고, 공통 유틸리티 함수로 권한 검증을 추출하는 방법입니다. 이를 통해 코드 중복을 제거하고, 인증 로직 변경 시 한 곳만 수정하면 되며, 테스트도 용이해집니다.
- • Schema Directive를 활용한 선언적 인증 처리
- • Middleware나 HOF를 통한 공통 로직 추출
- • Context 객체와 유틸리티 함수 활용
모든 뮤테이션에서 로그인 확인과 권한 체크를 일관되게 적용해야 할 때 사용됩니다.
Custom Directive 방식과 Middleware 방식 중 어느 것을 선택할지 판단하는 기준은 무엇인가요?
Q. TDD 방식으로 새로운 GraphQL 뮤테이션을 개발한다면 어떤 순서로 진행하시겠습니까? 테스트 작성부터 구현까지의 단계를 설명해주세요.
Red-Green-Refactor 사이클을 GraphQL 개발에 적용해보세요.
TDD로 GraphQL 뮤테이션을 개발할 때는 먼저 실패하는 테스트를 작성합니다(Red). 예상되는 뮤테이션 쿼리와 입력값, 기대하는 응답 형태를 테스트 코드로 먼저 정의합니다. 두 번째로 Schema에 뮤테이션 타입과 입력 타입을 정의하고, 최소한의 Resolver를 구현해 테스트를 통과시킵니다(Green). 세 번째로 검증 로직, 에러 처리, 엣지 케이스에 대한 테스트를 추가하고 구현을 보완합니다. 네 번째로 코드를 리팩토링하여 중복을 제거하고 가독성을 높입니다(Refactor). 마지막으로 통합 테스트를 추가하여 전체 플로우가 동작하는지 확인합니다.
- • 실패하는 테스트 먼저 작성(Red 단계)
- • 최소 구현으로 테스트 통과(Green 단계)
- • 리팩토링으로 코드 품질 개선(Refactor 단계)
새로운 결제 기능을 추가할 때 요구사항을 테스트로 먼저 명확히 하고 안전하게 구현할 때 사용됩니다.
TDD를 적용했을 때와 그렇지 않았을 때, 개발 속도와 코드 품질 측면에서 어떤 차이가 있나요?
Q. 동료가 작성한 GraphQL Resolver 코드를 리뷰할 때 어떤 측면을 중점적으로 확인하시겠습니까? 코드 품질 관점에서 체크리스트 4가지를 제시해주세요.
성능, 보안, 에러 처리, 테스트 가능성 등을 고려해보세요.
GraphQL Resolver 코드 리뷰 시 첫째, N+1 쿼리 문제가 발생하지 않는지 DataLoader 사용 여부를 확인합니다. 둘째, 인증과 권한 검증이 적절히 구현되어 있는지 보안 측면을 점검합니다. 셋째, 에러 처리가 명확하고 사용자에게 적절한 에러 메시지를 반환하는지 확인합니다. 넷째, 비즈니스 로직이 Resolver에 과도하게 들어있지 않고 적절히 분리되어 있는지 확인합니다. 다섯째, 단위 테스트가 작성되어 있고 의존성이 주입 가능한 구조인지 검토합니다. 마지막으로 타입 정의와 실제 구현이 일치하는지 확인합니다.
- • N+1 문제 및 DataLoader 사용 확인
- • 인증/권한 검증 및 에러 처리 점검
- • 비즈니스 로직 분리 및 테스트 가능성 검토
PR 리뷰 시 성능 저하나 보안 취약점을 사전에 발견하여 프로덕션 배포 전 개선할 때 사용됩니다.
Resolver에 비즈니스 로직이 너무 많다고 판단되면 어떻게 리팩토링을 제안하시겠습니까?
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!