diff --git a/prompto-lab-app/pom.xml b/prompto-lab-app/pom.xml
index 43abca9..edb1d71 100644
--- a/prompto-lab-app/pom.xml
+++ b/prompto-lab-app/pom.xml
@@ -123,6 +123,12 @@
fastjson
2.0.57
+
+ org.projectlombok
+ lombok
+ 1.18.30
+ provided
+
diff --git a/prompto-lab-app/src/main/java/io/github/timemachinelab/core/qatree/CommonQA.java b/prompto-lab-app/src/main/java/io/github/timemachinelab/core/qatree/CommonQA.java
new file mode 100644
index 0000000..19c4b45
--- /dev/null
+++ b/prompto-lab-app/src/main/java/io/github/timemachinelab/core/qatree/CommonQA.java
@@ -0,0 +1,17 @@
+package io.github.timemachinelab.core.qatree;
+
+import lombok.Data;
+
+@Data
+public class CommonQA extends QA {
+
+ public CommonQA() {
+ super(QAType.QA);
+ }
+
+ private String question;
+
+ private String answer;
+
+
+}
diff --git a/prompto-lab-app/src/main/java/io/github/timemachinelab/core/qatree/FormQA.java b/prompto-lab-app/src/main/java/io/github/timemachinelab/core/qatree/FormQA.java
new file mode 100644
index 0000000..ce4c968
--- /dev/null
+++ b/prompto-lab-app/src/main/java/io/github/timemachinelab/core/qatree/FormQA.java
@@ -0,0 +1,19 @@
+package io.github.timemachinelab.core.qatree;
+
+import lombok.Data;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Data
+public class FormQA extends QA {
+
+ private String question;
+
+ private Map answerMap;
+
+ public FormQA() {
+ super(QAType.FORM);
+ answerMap = new HashMap<>();
+ }
+}
diff --git a/prompto-lab-app/src/main/java/io/github/timemachinelab/core/qatree/QA.java b/prompto-lab-app/src/main/java/io/github/timemachinelab/core/qatree/QA.java
new file mode 100644
index 0000000..e9b0566
--- /dev/null
+++ b/prompto-lab-app/src/main/java/io/github/timemachinelab/core/qatree/QA.java
@@ -0,0 +1,14 @@
+package io.github.timemachinelab.core.qatree;
+
+public abstract class QA {
+
+ protected final QAType type;
+
+ protected long createTime;
+
+ protected long updateTime;
+
+ public QA(QAType type) {
+ this.type = type;
+ }
+}
diff --git a/prompto-lab-app/src/main/java/io/github/timemachinelab/core/qatree/QAType.java b/prompto-lab-app/src/main/java/io/github/timemachinelab/core/qatree/QAType.java
new file mode 100644
index 0000000..3bc31e6
--- /dev/null
+++ b/prompto-lab-app/src/main/java/io/github/timemachinelab/core/qatree/QAType.java
@@ -0,0 +1,14 @@
+package io.github.timemachinelab.core.qatree;
+
+public enum QAType {
+
+ QA("QA"),
+ SELECTION("Selection"),
+ FORM("Form");
+
+ private String name;
+
+ QAType(String name) {
+ this.name = name;
+ }
+}
diff --git a/prompto-lab-app/src/main/java/io/github/timemachinelab/core/qatree/QaTree.java b/prompto-lab-app/src/main/java/io/github/timemachinelab/core/qatree/QaTree.java
new file mode 100644
index 0000000..906e84c
--- /dev/null
+++ b/prompto-lab-app/src/main/java/io/github/timemachinelab/core/qatree/QaTree.java
@@ -0,0 +1,34 @@
+package io.github.timemachinelab.core.qatree;
+
+import lombok.Data;
+import lombok.Getter;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class QaTree {
+
+ @Getter
+ private QaTreeNode root;
+
+ private Map nodeMap = new HashMap<>();
+
+ public QaTree(QaTreeNode root) {
+ this.root = root;
+ nodeMap.put(root.getId(), root);
+ }
+
+ public void addNode(String parentId, QaTreeNode node) {
+ QaTreeNode parent = nodeMap.get(parentId);
+ if (parent == null) {
+ return;
+ }
+ parent.append(node);
+ nodeMap.put(node.getId(), node);
+ }
+
+ public QaTreeNode getNodeById(String id) {
+ return nodeMap.get(id);
+ }
+
+}
diff --git a/prompto-lab-app/src/main/java/io/github/timemachinelab/core/qatree/QaTreeDomain.java b/prompto-lab-app/src/main/java/io/github/timemachinelab/core/qatree/QaTreeDomain.java
new file mode 100644
index 0000000..6717c5c
--- /dev/null
+++ b/prompto-lab-app/src/main/java/io/github/timemachinelab/core/qatree/QaTreeDomain.java
@@ -0,0 +1,20 @@
+package io.github.timemachinelab.core.qatree;
+
+import org.springframework.stereotype.Component;
+
+@Component
+public class QaTreeDomain {
+
+ public QaTree createTree(String userStartQuestion) {
+ CommonQA startQA = new CommonQA();
+ startQA.setQuestion(userStartQuestion);
+ QaTreeNode startNode = new QaTreeNode(startQA);
+
+ return new QaTree(startNode);
+ }
+
+ public QaTree appendNode(QaTree tree, String parentId, QaTreeNode node) {
+ tree.addNode(parentId, node);
+ return tree;
+ }
+}
diff --git a/prompto-lab-app/src/main/java/io/github/timemachinelab/core/qatree/QaTreeNode.java b/prompto-lab-app/src/main/java/io/github/timemachinelab/core/qatree/QaTreeNode.java
new file mode 100644
index 0000000..b55f5fc
--- /dev/null
+++ b/prompto-lab-app/src/main/java/io/github/timemachinelab/core/qatree/QaTreeNode.java
@@ -0,0 +1,44 @@
+package io.github.timemachinelab.core.qatree;
+
+import lombok.Data;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+@Data
+public class QaTreeNode {
+
+ private final String id;
+
+ private Map children;
+
+ private QA qa;
+
+ public QaTreeNode(QA qa) {
+ this.id = UUID.randomUUID().toString();
+ this.children = new HashMap<>();
+ this.qa = qa;
+ }
+
+ public void append(QA qa) {
+ QaTreeNode node = new QaTreeNode(qa);
+ this.append(node);
+ }
+
+ public void append(QaTreeNode node) {
+ children.put(node.getId(), node);
+ }
+
+ public QaTreeNode getChild(String id) {
+ return children.get(id);
+ }
+
+ public boolean hasChild(String id) {
+ return children.containsKey(id);
+ }
+
+ public void removeChild(String id) {
+ children.remove(id);
+ }
+
+}
diff --git a/prompto-lab-app/src/main/java/io/github/timemachinelab/core/qatree/SelectionQA.java b/prompto-lab-app/src/main/java/io/github/timemachinelab/core/qatree/SelectionQA.java
new file mode 100644
index 0000000..3c6b4b2
--- /dev/null
+++ b/prompto-lab-app/src/main/java/io/github/timemachinelab/core/qatree/SelectionQA.java
@@ -0,0 +1,14 @@
+package io.github.timemachinelab.core.qatree;
+
+public class SelectionQA extends QA {
+
+ public SelectionQA() {
+ super(QAType.SELECTION);
+ }
+
+ private String question;
+
+ private String[] options;
+
+ private Integer selectedOption;
+}
diff --git a/prompto-lab-app/src/main/java/io/github/timemachinelab/core/session/Session.java b/prompto-lab-app/src/main/java/io/github/timemachinelab/core/session/Session.java
new file mode 100644
index 0000000..e84b984
--- /dev/null
+++ b/prompto-lab-app/src/main/java/io/github/timemachinelab/core/session/Session.java
@@ -0,0 +1,4 @@
+package io.github.timemachinelab.core.session;
+
+public class Session {
+}