NotionAPI (3)

Tadap·2023년 7월 14일

노션API

목록 보기
3/4

필터링

아직 어떠한 구조로 해야 예쁜 구조로 해당 파일들의 구조를 바꿀 수 있을지 모르겠다
이는 중간에 디자인 패턴을 넣어서 참고를 해봐야겠다.
일단 현재는 Filter구조를 사용하려고 한다.

현재 자바 스프링부트로 개발중이다(id 'org.springframework.boot' version '2.7.9')
필요한 Secret은 application.yml을 통해서 받고

public class NotionDevComponent {
	@Value("${external.notionSecret}")
	private String internalSecret;
}

현재 test 매소드를 Controller단에서 호출하면 test 매소드를 실행해 현재 test 용도로 사용중인 Notion페이지를 열고 이후 진행을 한다.
현재는 먼저 데이터를 Block 형태로 받아 온 뒤 그 결과들을 NotionBlockConverter를 통해 바꿔오는데... 문제가있다

public class NotionService {

	private final NotionDevComponent notionDevComponent;

	public String test() {
		return retrieveBlocksFromPage("Test-Fin-696290e4edac4c77b0917df853bc309c");
	}

	public String retrieveBlocksFromPage(String fullPath) {
		Blocks blocks;
		String blockId = convertPathToId(fullPath);
		NotionClient client = createClientInDev();
		RetrieveBlockChildrenRequest retrieveBlockChildrenRequest
			= new RetrieveBlockChildrenRequest(blockId);
		try {
			blocks = client.retrieveBlockChildren(retrieveBlockChildrenRequest);
		} finally {
			client.close();
		}

		List<Block> blockedContents = blocks.getResults();

		NotionBlockConverter notionBlockConverter = new NotionBlockConverter();
		notionBlockConverter.setNotionClient(client);
		for (Block blockedContent : blockedContents) {
			notionBlockConverter.setType(blockedContent);
			notionBlockConverter.doFilter();
		}
		return notionBlockConverter.toString();
	}

	private String convertPathToId(String path) {
		String[] split = path.split("-");
		return split[split.length - 1];
	}

	private NotionClient createClientInDev() {
		NotionClient client = new NotionClient();
		String internalSecret = notionDevComponent.getInternalSecret();
		client.setToken(internalSecret);
		return client;
	}
}

아래 코드를 보면 알듯이.. 냄새난다... 좀 많이난다... 특히 doFilter부분...

public class NotionBlockConverter {

	private final StringBuilder stringBuilder = new StringBuilder();
	private Block block;
	private String type;
	private NotionClient notionClient;

	public void setType(Block block) {
		this.block = block;
		this.type = block.getType().getValue();
	}

	public void setNotionClient(NotionClient notionClient) {
		this.notionClient = notionClient;
	}

	public void doFilter() {
		if (type == PARAGRAPH) {
			stringBuilder.append(ParagraphFilter.builder().block(block).build().doFilter());
		} else if (type == H1) {
			stringBuilder.append(HeadingOneFilter.builder().block(block).build().doFilter());
		} else if (type == H2) {
			stringBuilder.append(HeadingTwoFilter.builder().block(block).build().doFilter());
		} else if (type == H3) {
			stringBuilder.append(HeadingThreeFilter.builder().block(block).build().doFilter());
		} else if (type == BULLETED_LIST_ITEM) {
			stringBuilder.append(BulletedListItemFilter.builder().block(block).build().doFilter());
		} else if (type == TABLE) {
			stringBuilder.append(TableFilter.builder().block(block).notionClient(notionClient).build().doFilter());
		} else if (type == QUOTE) {
			stringBuilder.append(QuoteFilter.builder().block(block).build().doFilter());
		} else if (type == DIVIDER) {
			stringBuilder.append(DivideFilter.builder().build().doFilter());
		} else if (type == TODO) {
			stringBuilder.append(ToDoFilter.builder().block(block).build().doFilter());
		} else if (type == NUMBERED_LIST_ITEM) {
			stringBuilder.append(NumberedListItemFilter.builder().block(block).build().doFilter());
		} else if (type == CODE_BLOCK) {
			stringBuilder.append(CodeBlockFilter.builder().block(block).build().doFilter());
		} else if (type == BOOKMARK) {
			stringBuilder.append(BookmarkFilter.builder().block(block).build().doFilter());
		}
		log.info(" - toString()\n{}", stringBuilder.toString());
	}

	@Override
	public String toString() {
		return stringBuilder.toString();
	}
}

추후 구조를 바꾸는 것으로 하고 일단 코드를 작성했다.

0개의 댓글