Spring Boot + GraphQL 활용하기

sg-moomin·2023년 10월 9일
1

GraphQL Study

목록 보기
2/2

기존 Tistory에 적었던 GraphQl에 대한 학습 내용을 글로 남겨보려고 한다.

GraphQL?

  • GraphQL은 페이스북에서 만든 쿼리 언어입니다.
  • GrahpQl은 웹 클라이언트가 데이터를 서버로부터 효율적으로 가져올 수 있도록 되어있습니다.
  • REST API의 경우는 다양한 EndPoint가 존재한다면 GraphQL은 하나의 EndPoint를 가집니다.

GraphQL은 기존에 Url을 보면 이해하기 쉽다.

  • Rest Api의 경우는 /newPost, /comments, /user 등 다양한 endPoint를 가지지만
  • gql(GraphQL)은 /graphql 하나의 endpoint 만으로도 사용이 가능하다는 점이다.

Spring Boot + GraphQL

1) Create Project

  • dependencies 추후 추가해도 무관함으로 jpa, web만 추가하면 됨

1.1) build gradle

implementation 'com.graphql-java-kickstart:graphql-spring-boot-starter:11.0.0'
testImplementation 'com.graphql-java-kickstart:graphql-spring-boot-starter-test:11.0.0'

1.2) application.properties(yml)

graphql.servlet.mapping=/graphql
graphql.tools.schema-location-pattern=**/*.graphqls
graphql.servlet.cors-enabled=true
graphql.servlet.max-query-depth=100
graphql.servlet.exception-handlers-enabled=true

2) directory 구조

3) Create Graphqls File

schema {
    query: Query,
    mutation: Mutation,
}

type Mutation {
    registerMember(membersn: Int!, memberid: String!, memberemail: String!, membernumber: String!): Member
    deleteMember(memberid: String!): Boolean
}

type Query{
	findMembers(memberid: String!): Member!
	allFindMembers: [Member]
}

type Member{
	membersn: Int
	memberid: String
	memberemail : String
	membernumber : String
}
  • Query : 서버에게 데이터를 요청하여 호출
  • Mutation : 서버에게 데이터 수정을 위해 호출
  • Query 유형에서 조회, Mutation 유형에서는 생성 및 삭제, 수정 연산에서 사용된다고 보면된다

4) Create Domain/Query/Mutation Class

4.1) domain

@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
@Entity(name="member")
public class Member{
    
    @Id
    @Column(nullable = false)
    private int membersn;
    
    @Column(nullable = false)    
    private String memberid;
    
    @Column(nullable = false)
    private String memberemail;
    
    @Column(nullable = false)
    private String membernumber;
}

4.2) Query

@Service
@RequiredArgsConstructor
public class MemberQuery implements GraphQLQueryResolver{
	
	private final MemberRepository memberRepository;
	
	public Member findMembers(String memberId) {

		List<Member> members = memberRepository.findAll();
		Member member = new Member();
		for(Member newMember : members) {
			if(newMember.getMemberid().equals(memberId)) {
				member = memberRepository.findById(newMember.getMembersn())
						.orElse(null);
			}
		}
		return member;
	}
	
	public List<Member> allFindMembers(){
		
		List<Member> member = memberRepository.findAll();
		
		return member;
	}
}
  • graphql의 호출 과정은 graphqls schema file -> resolver -> repository 구조로 볼 수 있다.
  • kickstart의 경우 별도의 resolver 구현이 필요 없으나 추후 커스텀을 해야 할 경우 kickstart를 사용이 어렵다.

4.3) Mutation

@Service
@RequiredArgsConstructor
public class MemberMutation implements GraphQLMutationResolver {

	private final MemberRepository memberRepository;
	
	public Member registerMember(int memberSn, String memberId, String memberEmail, String memberNumber) {
		
		Member newMember = Member.builder()
				.membersn(memberSn)
				.memberid(memberId)
				.memberemail(memberEmail)
				.membernumber(memberNumber).build();
		
		return memberRepository.save(newMember);
	}

	
	public Boolean deleteMember(String memberId) {
		List<Member> memberList = memberRepository.findAll();
		int deleteChk = 0;
		
		for(Member member : memberList) {
			if(member.getMemberid().equals(memberId)) {
				memberRepository.delete(member);
				deleteChk += 1;
			}
		}
		
		if(deleteChk > 0) {
			return true;
		} else {
			return false;			
		}
	}

}

5. Result

  • 전체 맴버 조회 가능

  • 특정 맴버를 조회하는것도 가능

  • 맴버 생성 가능

  • 맴버 삭제 가능

마무리

  • 현재 포스팅의 경우 Graphqls 파일을 단일로 사용하였으나 추후 N개를 사용하기 위해서는 dataFatcher를 직접 구현해줘야 한다.
profile
backend 개발자를 꿈꾸는 직장인입니다.

0개의 댓글