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
'Programing > GraphQL' 카테고리의 다른 글
세기무민의 코딩일기 : Restful API 형태로 GraphQL 사용하기 (0) | 2023.08.06 |
---|---|
세무민의 코딩일기 : Spring Boot + GraphQL ScalarType 사용하기 (0) | 2023.03.28 |
type definition for root mutation type 'mutation' not found 오류 해결 (0) | 2023.01.30 |
세무민의 코딩일기 : Spring Boot + GraphQL 연결하기 (0) | 2022.05.01 |
GraphQL에 대해서 알아보도록 하자 - REST 방식과 다른점 [1탄] (0) | 2021.12.17 |