GraphQL 게시판 GraphQL 설정

이재연·2021년 1월 14일

이번 글에서는 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개의 댓글