아직 어떠한 구조로 해야 예쁜 구조로 해당 파일들의 구조를 바꿀 수 있을지 모르겠다
이는 중간에 디자인 패턴을 넣어서 참고를 해봐야겠다.
일단 현재는 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();
}
}
추후 구조를 바꾸는 것으로 하고 일단 코드를 작성했다.