이번 글에서는 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
}
.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을 사용해서 테스트 했다.
값이 잘 오는걸 확인 할 수 있다.