GraphQL 게시판 GraphQL 설정

이재연·2021년 1월 14일
1

이번 글에서는 GraphQL을 설정한다.

구현

우선 필요한 쿼리와 뮤테이션을 생각해보자.
조회, 저장, 삭제가 필요하다.
board.graphqls 파일을 만들어 필요한 쿼리와 뮤테이션을 작성한다. 파일은 resources 아래에 둔다.

type Query{
	getBoardList: [Board]
}

type Mutation{
	setBoard(author: ID!,content: String!,removeKey: String!): Board
	removeBoard(boardId: Int!, removeKey: String!): Board
}

type Board{
	boardId:Int
	content: String
	author: String
	updatedDate: String
}
  • 전체 글 조회는 Board 타입의 리스트를 반환한다.
  • 게시글 저장은 input 타입을 사용했는데 어차피 화면에서 필요한 값은 3개 뿐이라서 각각 받게 했다.
  • 삭제 역시 id와 key만 입력받는다.
  • 게시글 타입을 설정한다.

.graphqls에 정의한 쿼리/뮤테이션을 매핑하는 메소드들을 구현하지 않으면 구동 에러가 발생한다.

Unable to start embedded Tomcat
...
Caused by: com.coxautodev.graphql.tools.FieldResolverError: No method found with any of the following signatures (with or without one of [interface graphql.schema.DataFetchingEnvironment] as the last argument), in priority order:
...

톰캣을 구동하지 못한다는 에러와 메소드 시그니처를 찾지 못한다는 에러 메세지가 뜬다.

.graphql에 정의한 쿼리와 뮤테이션를 처리할 클래스를 만들어야 한다.

쿼리는 GraphQLQueryResolver를 상속받고 뮤테이션은 GraphQLMutationResolver를 상속받아 매핑 메소드를 작성한다.

  • 쿼리 클래스
@Service
@RequiredArgsConstructor
public class BoardQuery implements  GraphQLQueryResolver{

	private final BoardRepository boardRepository;	
	
	public List<Board> getBoardList(){
		return boardRepository.findByVisibleOrderByCreatedDateDesc(true);
	}	
	
}
  • 뮤테이션 클래스
@Service
@RequiredArgsConstructor
public class BoardMutation implements GraphQLMutationResolver{

	private final BoardRepository boardRepository;	
	
	public Board setBoard(String author, String content, String removeKey) {
		if(author.isEmpty() || content.isEmpty() || removeKey.isEmpty()) {
			return null;
		}
		
		Board board = Board.builder()
		.author(author)
		.content(content)
		.removeKey(removeKey)
		.visible(true)
		.build();
		return boardRepository.save(board);
	}
	
	public Board removeBoard(Long boardId, String removeKey) {
		Optional<Board> removeBoard = boardRepository.findByBoardId(boardId);
		if(!removeBoard.isPresent()) return null;
		Board targetBoard = removeBoard.get();
		if(!targetBoard.getRemoveKey().equals(removeKey))return null;
		targetBoard.setVisible(false);
		
		return boardRepository.save(targetBoard);
	}
}

결과

Postman을 사용해서 테스트 했다.
값이 잘 오는걸 확인 할 수 있다.

  • 조회

  • 저장

0개의 댓글