Programing/GraphQL

Spring + GraphQL Type/Input Type 활용 및 정리

세기루민 2023. 4. 10. 10:12
728x90

안녕하세요. 세기무민입니다. 

이번 포스팅에서는 Input Type에 대해 간략하게 정리해보려고 합니다. 

실제 업무 중 사용한 내용을 기반하여 소스 코드는 예시, 실행 결과는 텍스트로 대체하겠습니다.


GraphQL Type 

  • Type은 필드로 구성되며 각각의 필드는 특정 종류의 데이터를 반환하는 용도로 사용된다.
    • 문자열, 커스텀 객체, 리스트 형태의 값을 반환 가능

 

GraphQL Input Type

  • GraphQl의 Input Type은 말 그대로 입력 값을 의미한다. 
  • RestFul API로 비유하자면 파라미터 값 혹은 Body에 들어가는 값에 대해 미리 정의하는 것
  • Input Type은 단일, 객체 형태로 입력 가능하다. 
  • Input Type은 인자 관리를 조금 더 체계적으로 관리 가능하다.
  • Inpyt Type은 스키마 관리적인 측면에서 체계화 가능하다
  • Input Type은 모든 필드에서 인자로 사용이 가능함으로 재사용성이 용이하다. 

 

GraphQL Input Type Code

  • 아래의 코드는 임의로 작성된 코드입니다.

.graphqls (스키마 파일)

schema {
    query: Query,
}

# Query Type 정의
type Query {
	# member 1개 조회
	getOneMember(memberInfo: memberDto): memberReqDto
	# member 리스트 조회
	getMembers(membersInfo: memberDto): [memberReqDto]
}

# Scalar 정의
Scalar Date

# Type 정의
type memberReqDto {
    memberId: Int,
    memberEmail: String,
    memberSex: String,
    insertDate: Date
}

# input 정의
input memberDto {
    memberId: Int,
    memberEmail: String
}
  • 스키마 파일은 맴버 단일 및 다중 조회에 대한 스키마입니다.
  • 위의 Input Type 설명과 동일하게 Input Type을 재사용 가능하며 입력 인자로 사용됩니다.
  •  Type은 Query 요청 정보에 대한 리턴 값을 반환해줍니다. 

resolver/dto (소스코드)

/**
 * Info : resolver 
 */

@Component
@RequiredArgsConstructor
public class memberResolver implements GraphQLQueryResolver {

    private final memberRepository memberRepository;
    
    // 맴버 단일 조회 
    public MemberReqDto getOneMember(MemberDto memberDto){
    	MemberReqDto member = memberRepository.findByIdOne(memberDto.getMemberId());
        return member
    }
    
    // 맴버 리스트 조회 
    public ArrayList<MemberReqDto> getMembers(MemberDto memberDto){
    	return memberRepository.findByIdOne(memberDto.getMemberId());
    }
}

/**
 * Info : memberReqDto
 */
 
 @Builder
 @Getter
 public Class memberReqDto {
 	private Integer memberId;
    private String memberEmail;
    private String memberSex;
    private LocalDate insertDate;
 }
 
/**
 * Info : memberDto
 */
 
 @Builder
 @Getter
 public Class memberReqDto {
 	private Integer memberId;
    private String memberEmail;
 }
  
  
 /**
  * Info : member.Repository.findByIdOne 설명
  *  - findByIdOne은 NativeJPA로 구현하면 된다.  
  *  - memberId로 중복 없이 한개의 row를 조회한 후 memberReqDto에 담아주면 된다. 
  * /
  • 위의 스키마와 연결고리를 Back Logic에서 만들어주면 된다. 
  • 결국 InputType에 해당하는 값은 하나의 DTO 객체로 관리하게 되며 이는 재사용이 가능하다. 
  • 또한 현재는 2개의 최소 필드만 사용했으나 추후 필드의 개수는 증가 가능함으로 확장성을 가진다.

결과 (텍스트 형태로 정리)

// Query Body 

query {
  getOneMember(memberInfo : {
    memberId: "11"
  })
  {
    memberEmail,
    memberSex
  }
}


// result Body (결과 값)

{
  "data": {
    "getOneMember": {
      "memberEmail": "sgm@tistory.com",
      "memberSex": "M"
    }
  }
}
  • GraphQL을 Post 형태로 요청을 보냈을 때 반환 받는 값에 대해 텍스트로 정리한 내용이다. 
  • Input Type과 Type에 대해 전체 필드 혹은 특정 원하는 필드에 대해 값을 요청하거나 반환 받을 수 있다. 
  • 이를 통해 GraphQL은 원하는 필드 값만 반환 받을 수 있다는 점에서 RestFul의 오버패칭 문제를 최소화 한다.
    • 오버패칭이란 front에서 요청한 정보에 비해 훨씬 더 많은 정보를 전달하는 경우를 말함

 

마치며

RestFul API도 충분히 좋지만 GraphQL로 넘어가는 추세에 맞춰 요즘 공부하는 중인데..

생각보다 파면 팔수록 어려운 것 같고 결론적으로 프론트와 백앤드 사이에서 스키마를 잘 정의해야 하는게 중요하다. 

또한 GraphQL의 경우 러닝 커브가 존재하기 때문에 바로 도입은 어려운 것 같고 RestFul과 혼용하여 사용하는 것이 

조금 더 편리하다고 느껴진다.

2~3년 후의 API 트랜드가 어떻게 흘러갈 지 모르겠지만 GraphQL에 대해 좀 더 파야겠다는 생각이 들었다. 

다음 포스팅에서는 더 유익한 정보로 찾아오겠습니다.

728x90