jichoi / lms_front star
정다정 11-19
241119 정다정 레이아웃 수정
@20552e3fd134d31452e29c96ec132c6749732c1c
client/views/pages/main/Dashboard.vue
--- client/views/pages/main/Dashboard.vue
+++ client/views/pages/main/Dashboard.vue
@@ -1,1257 +1,1527 @@
 <template>
-  <p class="title1" v-if="state === 'finish'" style="position: absolute; top: 50%; transform: translate(0, -50%)">
-    오늘 공부를 다했어요! 너무 고생했어요!
-  </p>
-  <div class="title1" v-else-if="state === 'notRegistered'"
-    style="position: absolute;top: 50%;transform: translate(-50%, -50%);left: 50%;">
-    <div class="title-box" style="text-align: center;">
-      <img src="../../../resources/img/new_img/dashboard/rabbit.png">
-      <h3 class="title" style=" margin-top: 1em; letter-spacing: 2px; line-height: 42px; font-size: 30px">
-        지금은 학습 루트가 등록이 안됐어요! <br> 학습 일정에서 학습루트를
-        등록해볼까요?
-      </h3>
-      <div @click="goToPage2('MyPlan2')" style="cursor: pointer; margin-top: 2em;">
-        <img src="../../../resources/img/new_img/dashboard/btn.png">
-      </div>
+    <p class="title1" v-if="state === 'finish'" style="position: absolute; top: 50%; transform: translate(0, -50%)">
+        오늘 공부를 다했어요! 너무 고생했어요!
+    </p>
+    <div
+        class="title1"
+        v-else-if="state === 'notRegistered'"
+        style="position: absolute; top: 50%; transform: translate(-50%, -50%); left: 50%"
+    >
+        <div class="title-box" style="text-align: center">
+            <img src="../../../resources/img/new_img/dashboard/rabbit.png" />
+            <h3 class="title" style="margin-top: 1em; letter-spacing: 2px; line-height: 42px; font-size: 30px">
+                지금은 학습 루트가 등록이 안됐어요! <br />
+                학습 일정에서 학습루트를 등록해볼까요?
+            </h3>
+            <div @click="goToPage2('MyPlan2')" style="cursor: pointer; margin-top: 2em">
+                <img src="../../../resources/img/new_img/dashboard/btn.png" />
+            </div>
+        </div>
     </div>
-  </div>
-  <p class="title1" v-else-if="state === 'noProblem'"
-    style="position: absolute; top: 50%; transform: translate(0, -50%)">
-    교재에 등록된 문제가 없습니다.
-  </p>
-  <div v-else class="main">
-    <div class="race-wrap">
-      <!-- <div class="title-box">
+    <p
+        class="title1"
+        v-else-if="state === 'noProblem'"
+        style="position: absolute; top: 50%; transform: translate(0, -50%)"
+    >
+        교재에 등록된 문제가 없습니다.
+    </p>
+    <div v-else class="main">
+        <div class="race-wrap">
+            <!-- <div class="title-box">
         <p class="title" style="margin-top: 7rem">{{ titleUnitName }}</p>
         <p class="subtitle">{{ titleBookName }}</p>
       </div> -->
-      <div class="race-box">
-        <div class="rabbit-start">
-          <img src="../../../resources/img/new_img/rabbit.png" alt=""
-            :style="{ display: rabbitPos[0] ? 'block' : 'none' }" />
-        </div>
-        <!-- 1번째줄 -->
-        <div class="rcon flex justify-end mb5" style="position: relative; top: 24px">
-          <!-- 1 -->
-          <div class="race-btn" @click="[storeLearningId(labeledItems[0])]">
-            <div class="rabbit-running">
-              <img src="../../../resources/img/new_img/rabbit.png" alt=""
-                :style="{ display: rabbitPos[1] ? 'block' : 'none' }" />
+            <div class="race-box">
+                <div class="rabbit-start">
+                    <img
+                        src="../../../resources/img/new_img/rabbit.png"
+                        alt=""
+                        :style="{ display: rabbitPos[0] ? 'block' : 'none' }"
+                    />
+                </div>
+                <!-- 1번째줄 -->
+                <div class="rcon flex justify-end mb5" style="position: relative; top: 24px">
+                    <!-- 1 -->
+                    <div class="race-btn" @click="[storeLearningId(labeledItems[0])]">
+                        <div class="rabbit-running">
+                            <img
+                                src="../../../resources/img/new_img/rabbit.png"
+                                alt=""
+                                :style="{ display: rabbitPos[1] ? 'block' : 'none' }"
+                            />
+                        </div>
+                        <button
+                            class="popTxt"
+                            v-for="(item, index) in items"
+                            :key="index"
+                            @click="toggleImage(index)"
+                            data-num="1"
+                        >
+                            <div class="image-container">
+                                <img
+                                    src="../../../resources/img/new_img/board/racebtn_1.png"
+                                    alt="Race Button"
+                                    class="base-img"
+                                />
+                                <img
+                                    v-if="rabbitCompl[1]"
+                                    src="../../../resources/img/new_img/icon/clear_img.png"
+                                    alt="Clear Icon"
+                                    class="clear-img"
+                                />
+                            </div>
+                        </button>
+                        <p :class="!rabbitCompl[1] ? 'before-clear' : 'clear'">
+                            <img
+                                v-if="rabbitCompl[1]"
+                                src="../../../resources/img/new_img/icon/complete_icon.png"
+                                alt="Complete Icon"
+                                class="complete-icon"
+                            />
+                            {{ labeledItems[0].label }}
+                        </p>
+                    </div>
+                    <!-- 2 -->
+                    <div class="race-btn" @click="[storeLearningId(labeledItems[1])]">
+                        <div class="rabbit-running">
+                            <img
+                                src="../../../resources/img/new_img/rabbit.png"
+                                alt=""
+                                :style="{ display: rabbitPos[2] ? 'block' : 'none' }"
+                            />
+                        </div>
+                        <button
+                            class="popTxt"
+                            v-for="(item, index) in items"
+                            :key="index"
+                            @click="toggleImage(index)"
+                            data-num="2"
+                        >
+                            <div class="image-container">
+                                <img
+                                    src="../../../resources/img/new_img/board/racebtn_2.png"
+                                    alt="Race Button"
+                                    class="base-img"
+                                />
+                                <img
+                                    v-if="rabbitCompl[2]"
+                                    src="../../../resources/img/new_img/icon/clear_img.png"
+                                    alt="Clear Icon"
+                                    class="clear-img"
+                                    style="position: absolute; left: 16px"
+                                />
+                            </div>
+                        </button>
+                        <p :class="!rabbitCompl[2] ? 'before-clear' : 'clear'">
+                            <img
+                                v-if="rabbitCompl[2]"
+                                src="../../../resources/img/new_img/icon/complete_icon.png"
+                                alt="Complete Icon"
+                                class="complete-icon"
+                            />
+                            {{ labeledItems[1].label }}
+                        </p>
+                    </div>
+                </div>
+                <!-- 2번째줄 -->
+                <div class="lcon flex justify-between mb5">
+                    <!-- 7 -->
+                    <div class="race-btn" @click="[storeLearningId(labeledItems[6])]">
+                        <div class="rabbit-running" style="top: -71px">
+                            <img
+                                src="../../../resources/img/new_img/rabbit.png"
+                                alt=""
+                                :style="{ display: rabbitPos[7] ? 'block' : 'none' }"
+                            />
+                        </div>
+                        <button
+                            class="popTxt"
+                            v-for="(item, index) in items"
+                            :key="index"
+                            @click="toggleImage(index)"
+                            data-num="7"
+                            style="top: -53px; position: relative"
+                        >
+                            <div class="image-container">
+                                <img
+                                    src="../../../resources/img/new_img/board/racebtn_7.png"
+                                    alt="Race Button"
+                                    class="base-img"
+                                />
+                                <img
+                                    v-if="rabbitCompl[7]"
+                                    src="../../../resources/img/new_img/icon/clear_img.png"
+                                    alt="Clear Icon"
+                                    class="clear-img"
+                                    style="position: absolute; top: 85px"
+                                />
+                            </div>
+                        </button>
+                        <p
+                            :class="!rabbitCompl[7] ? 'before-clear' : 'clear'"
+                            style="position: relative; top: -53px; left: -10px"
+                        >
+                            <img
+                                v-if="rabbitCompl[7]"
+                                src="../../../resources/img/new_img/icon/complete_icon.png"
+                                alt="Complete Icon"
+                                class="complete-icon"
+                            />
+                            {{ labeledItems[6].label }}
+                        </p>
+                    </div>
+                    <!-- 6 -->
+                    <div class="race-btn" @click="[storeLearningId(labeledItems[5])]">
+                        <div class="rabbit-running">
+                            <img
+                                src="../../../resources/img/new_img/rabbit.png"
+                                alt=""
+                                :style="{ display: rabbitPos[6] ? 'block' : 'none' }"
+                            />
+                        </div>
+                        <button
+                            class="popTxt"
+                            v-for="(item, index) in items"
+                            :key="index"
+                            @click="toggleImage(index)"
+                            data-num="6"
+                        >
+                            <div class="image-container">
+                                <img
+                                    src="../../../resources/img/new_img/board/racebtn_6.png"
+                                    alt="Race Button"
+                                    class="base-img"
+                                />
+                                <img
+                                    v-if="rabbitCompl[6]"
+                                    src="../../../resources/img/new_img/icon/clear_img.png"
+                                    alt="Clear Icon"
+                                    class="clear-img"
+                                />
+                            </div>
+                        </button>
+                        <p :class="!rabbitCompl[6] ? 'before-clear' : 'clear'">
+                            <img
+                                v-if="rabbitCompl[6]"
+                                src="../../../resources/img/new_img/icon/complete_icon.png"
+                                alt="Complete Icon"
+                                class="complete-icon"
+                            />
+                            {{ labeledItems[5].label }}
+                        </p>
+                    </div>
+                    <!-- 5 -->
+                    <div
+                        class="race-btn"
+                        @click="[storeLearningId(labeledItems[4])]"
+                        style="position: relative; left: -31px"
+                    >
+                        <div class="rabbit-running">
+                            <img
+                                src="../../../resources/img/new_img/rabbit.png"
+                                alt=""
+                                :style="{ display: rabbitPos[5] ? 'block' : 'none' }"
+                            />
+                        </div>
+                        <button
+                            class="popTxt"
+                            v-for="(item, index) in items"
+                            :key="index"
+                            @click="toggleImage(index)"
+                            data-num="5"
+                        >
+                            <div class="image-container">
+                                <img
+                                    src="../../../resources/img/new_img/board/racebtn_5.png"
+                                    alt="Race Button"
+                                    class="base-img"
+                                />
+                                <img
+                                    v-if="rabbitCompl[5]"
+                                    src="../../../resources/img/new_img/icon/clear_img.png"
+                                    alt="Clear Icon"
+                                    class="clear-img"
+                                />
+                            </div>
+                        </button>
+                        <p :class="!rabbitCompl[5] ? 'before-clear' : 'clear'">
+                            <img
+                                v-if="rabbitCompl[5]"
+                                src="../../../resources/img/new_img/icon/complete_icon.png"
+                                alt="Complete Icon"
+                                class="complete-icon"
+                            />
+                            {{ labeledItems[4].label }}
+                        </p>
+                    </div>
+                    <!-- 4 -->
+                    <div class="race-btn" @click="[storeLearningId(labeledItems[3])]">
+                        <div class="rabbit-running">
+                            <img
+                                src="../../../resources/img/new_img/rabbit.png"
+                                alt=""
+                                :style="{ display: rabbitPos[4] ? 'block' : 'none' }"
+                            />
+                        </div>
+                        <button
+                            class="popTxt"
+                            v-for="(item, index) in items"
+                            :key="index"
+                            @click="toggleImage(index)"
+                            data-num="4"
+                        >
+                            <div class="image-container">
+                                <img
+                                    src="../../../resources/img/new_img/board/racebtn_4.png"
+                                    alt="Race Button"
+                                    class="base-img"
+                                />
+                                <img
+                                    v-if="rabbitCompl[4]"
+                                    src="../../../resources/img/new_img/icon/clear_img.png"
+                                    alt="Clear Icon"
+                                    class="clear-img"
+                                />
+                            </div>
+                        </button>
+                        <p :class="!rabbitCompl[4] ? 'before-clear' : 'clear'">
+                            <img
+                                v-if="rabbitCompl[4]"
+                                src="../../../resources/img/new_img/icon/complete_icon.png"
+                                alt="Complete Icon"
+                                class="complete-icon"
+                            />
+                            {{ labeledItems[3].label }}
+                        </p>
+                    </div>
+                    <!-- 3 -->
+                    <div class="race-btn" @click="[storeLearningId(labeledItems[2])]" style="right: 12px">
+                        <div class="rabbit-running">
+                            <img
+                                src="../../../resources/img/new_img/rabbit.png"
+                                alt=""
+                                :style="{ display: rabbitPos[3] ? 'block' : 'none' }"
+                            />
+                        </div>
+                        <button
+                            class="popTxt"
+                            v-for="(item, index) in items"
+                            :key="index"
+                            @click="toggleImage(index)"
+                            data-num="3"
+                        >
+                            <div class="image-container">
+                                <img
+                                    src="../../../resources/img/new_img/board/racebtn_3.png"
+                                    alt="Race Button"
+                                    class="base-img"
+                                />
+                                <img
+                                    v-if="rabbitCompl[3]"
+                                    src="../../../resources/img/new_img/icon/clear_img.png"
+                                    alt="Clear Icon"
+                                    class="clear-img"
+                                />
+                            </div>
+                        </button>
+                        <p :class="!rabbitCompl[3] ? 'before-clear' : 'clear'">
+                            <img
+                                v-if="rabbitCompl[3]"
+                                src="../../../resources/img/new_img/icon/complete_icon.png"
+                                alt="Complete Icon"
+                                class="complete-icon"
+                            />
+                            {{ labeledItems[2].label }}
+                        </p>
+                    </div>
+                </div>
+                <!-- 3번째줄 -->
+                <div class="rcon flex" style="position: relative; top: -23px">
+                    <!-- 8 -->
+                    <div class="race-btn" @click="[storeLearningId(labeledItems[7])]">
+                        <div class="rabbit-running">
+                            <img
+                                src="../../../resources/img/new_img/rabbit.png"
+                                alt=""
+                                :style="{ display: rabbitPos[8] ? 'block' : 'none' }"
+                            />
+                        </div>
+                        <button
+                            class="popTxt"
+                            v-for="(item, index) in items"
+                            :key="index"
+                            @click="toggleImage(index)"
+                            data-num="8"
+                        >
+                            <div class="image-container">
+                                <img
+                                    src="../../../resources/img/new_img/board/racebtn_8.png"
+                                    alt="Race Button"
+                                    class="base-img"
+                                />
+                                <img
+                                    v-if="rabbitCompl[8]"
+                                    src="../../../resources/img/new_img/icon/clear_img.png"
+                                    alt="Clear Icon"
+                                    class="clear-img"
+                                />
+                            </div>
+                        </button>
+                        <p :class="!rabbitCompl[8] ? 'before-clear' : 'clear'">
+                            <img
+                                v-if="rabbitCompl[8]"
+                                src="../../../resources/img/new_img/icon/complete_icon.png"
+                                alt="Complete Icon"
+                                class="complete-icon"
+                            />
+                            {{ labeledItems[7].label }}
+                        </p>
+                    </div>
+                    <!-- 9 -->
+                    <div class="race-btn" @click="[storeLearningId(labeledItems[8])]">
+                        <div class="rabbit-running">
+                            <img
+                                src="../../../resources/img/new_img/rabbit.png"
+                                alt=""
+                                :style="{ display: rabbitPos[9] ? 'block' : 'none' }"
+                            />
+                        </div>
+                        <button
+                            class="popTxt"
+                            v-for="(item, index) in items"
+                            :key="index"
+                            @click="toggleImage(index)"
+                            data-num="9"
+                        >
+                            <div class="image-container">
+                                <img
+                                    src="../../../resources/img/new_img/board/racebtn_9.png"
+                                    alt="Race Button"
+                                    class="base-img"
+                                />
+                                <img
+                                    v-if="rabbitCompl[9]"
+                                    src="../../../resources/img/new_img/icon/clear_img.png"
+                                    alt="Clear Icon"
+                                    class="clear-img"
+                                />
+                            </div>
+                        </button>
+                        <p :class="!rabbitCompl[9] ? 'before-clear' : 'clear'">
+                            <img
+                                v-if="rabbitCompl[9]"
+                                src="../../../resources/img/new_img/icon/complete_icon.png"
+                                alt="Complete Icon"
+                                class="complete-icon"
+                            />
+                            {{ labeledItems[8].label }}
+                        </p>
+                    </div>
+                    <!-- 10 -->
+                    <div class="race-btn" @click="[storeLearningId(labeledItems[9])]">
+                        <div class="rabbit-running">
+                            <img
+                                src="../../../resources/img/new_img/rabbit.png"
+                                alt=""
+                                :style="{ display: rabbitPos[10] ? 'block' : 'none' }"
+                            />
+                        </div>
+                        <button
+                            class="popTxt"
+                            v-for="(item, index) in items"
+                            :key="index"
+                            @click="toggleImage(index)"
+                            data-num="10"
+                        >
+                            <div class="image-container">
+                                <img
+                                    src="../../../resources/img/new_img/board/racebtn_10.png"
+                                    alt="Race Button"
+                                    class="base-img"
+                                />
+                                <img
+                                    v-if="rabbitCompl[10]"
+                                    src="../../../resources/img/new_img/icon/clear_img.png"
+                                    alt="Clear Icon"
+                                    class="clear-img"
+                                />
+                            </div>
+                        </button>
+                        <p :class="!rabbitCompl[10] ? 'before-clear' : 'clear'">
+                            <img
+                                v-if="rabbitCompl[10]"
+                                src="../../../resources/img/new_img/icon/complete_icon.png"
+                                alt="Complete Icon"
+                                class="complete-icon"
+                            />
+                            {{ labeledItems[9].label }}
+                        </p>
+                    </div>
+                    <!-- 11 -->
+                    <div class="race-btn" @click="[storeLearningId(labeledItems[10])]">
+                        <div class="rabbit-running">
+                            <img
+                                src="../../../resources/img/new_img/rabbit.png"
+                                alt=""
+                                :style="{ display: rabbitPos[11] ? 'block' : 'none' }"
+                            />
+                        </div>
+                        <button
+                            class="popTxt"
+                            v-for="(item, index) in items"
+                            :key="index"
+                            @click="toggleImageAndShowPopup(index, '11')"
+                            data-num="11"
+                        >
+                            <div class="image-container">
+                                <img
+                                    src="../../../resources/img/new_img/board/racebtn_11.png"
+                                    alt="Race Button"
+                                    class="base-img"
+                                />
+                                <img
+                                    v-if="rabbitCompl[11]"
+                                    src="../../../resources/img/new_img/icon/clear_img.png"
+                                    alt="Clear Icon"
+                                    class="clear-img"
+                                />
+                            </div>
+                        </button>
+                        <p :class="!rabbitCompl[11] ? 'before-clear' : 'clear'">
+                            <img
+                                v-if="rabbitCompl[11]"
+                                src="../../../resources/img/new_img/icon/complete_icon.png"
+                                alt="Complete Icon"
+                                class="complete-icon"
+                            />
+                            {{ labeledItems[10].label }}
+                        </p>
+                    </div>
+                </div>
+                <div class="race-btn">
+                    <div class="rabbit-running" style="display: flex">
+                        <img
+                            class="rabbit-end"
+                            src="../../../resources/img/new_img/rabbit.png"
+                            alt=""
+                            :style="{ display: rabbitEnd ? 'block' : 'none' }"
+                        />
+                        <img
+                            class="fireworks-end"
+                            src="../../../resources/img/fireworks.gif"
+                            alt=""
+                            :style="{ display: rabbitEnd ? 'block' : 'none' }"
+                        />
+                    </div>
+                </div>
             </div>
-            <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)" data-num="1">
-              <div class="image-container">
-                <img src="../../../resources/img/new_img/board/racebtn_1.png" alt="Race Button" class="base-img" />
-                <img v-if="rabbitCompl[1]" src="../../../resources/img/new_img/icon/clear_img.png" alt="Clear Icon"
-                  class="clear-img" />
-              </div>
-            </button>
-            <p :class="!rabbitCompl[1] ? 'before-clear' : 'clear'">
-              <img v-if="rabbitCompl[1]" src="../../../resources/img/new_img/icon/complete_icon.png" alt="Complete Icon"
-                class="complete-icon" />
-              {{ labeledItems[0].label }}
-            </p>
-          </div>
-          <!-- 2 -->
-          <div class="race-btn" @click="[storeLearningId(labeledItems[1])]">
-            <div class="rabbit-running">
-              <img src="../../../resources/img/new_img/rabbit.png" alt=""
-                :style="{ display: rabbitPos[2] ? 'block' : 'none' }" />
-            </div>
-            <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)" data-num="2">
-              <div class="image-container">
-                <img src="../../../resources/img/new_img/board/racebtn_2.png" alt="Race Button" class="base-img" />
-                <img v-if="rabbitCompl[2]" src="../../../resources/img/new_img/icon/clear_img.png" alt="Clear Icon"
-                  class="clear-img" style="position: absolute; left: 16px" />
-              </div>
-            </button>
-            <p :class="!rabbitCompl[2] ? 'before-clear' : 'clear'">
-              <img v-if="rabbitCompl[2]" src="../../../resources/img/new_img/icon/complete_icon.png" alt="Complete Icon"
-                class="complete-icon" />
-              {{ labeledItems[1].label }}
-            </p>
-          </div>
-        </div>
-        <!-- 2번째줄 -->
-        <div class="lcon flex justify-between mb5">
-          <!-- 7 -->
-          <div class="race-btn" @click="[storeLearningId(labeledItems[6])]">
-            <div class="rabbit-running" style="top: -71px">
-              <img src="../../../resources/img/new_img/rabbit.png" alt=""
-                :style="{ display: rabbitPos[7] ? 'block' : 'none' }" />
-            </div>
-            <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)" data-num="7"
-              style="top: -53px; position: relative">
-              <div class="image-container">
-                <img src="../../../resources/img/new_img/board/racebtn_7.png" alt="Race Button" class="base-img" />
-                <img v-if="rabbitCompl[7]" src="../../../resources/img/new_img/icon/clear_img.png" alt="Clear Icon"
-                  class="clear-img" style="position: absolute; top: 85px" />
-              </div>
-            </button>
-            <p :class="!rabbitCompl[7] ? 'before-clear' : 'clear'" style="position: relative; top: -53px; left: -10px">
-              <img v-if="rabbitCompl[7]" src="../../../resources/img/new_img/icon/complete_icon.png" alt="Complete Icon"
-                class="complete-icon" />
-              {{ labeledItems[6].label }}
-            </p>
-          </div>
-          <!-- 6 -->
-          <div class="race-btn" @click="[storeLearningId(labeledItems[5])]">
-            <div class="rabbit-running">
-              <img src="../../../resources/img/new_img/rabbit.png" alt=""
-                :style="{ display: rabbitPos[6] ? 'block' : 'none' }" />
-            </div>
-            <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)" data-num="6">
-              <div class="image-container">
-                <img src="../../../resources/img/new_img/board/racebtn_6.png" alt="Race Button" class="base-img" />
-                <img v-if="rabbitCompl[6]" src="../../../resources/img/new_img/icon/clear_img.png" alt="Clear Icon"
-                  class="clear-img" />
-              </div>
-            </button>
-            <p :class="!rabbitCompl[6] ? 'before-clear' : 'clear'">
-              <img v-if="rabbitCompl[6]" src="../../../resources/img/new_img/icon/complete_icon.png" alt="Complete Icon"
-                class="complete-icon" />
-              {{ labeledItems[5].label }}
-            </p>
-          </div>
-          <!-- 5 -->
-          <div class="race-btn" @click="[storeLearningId(labeledItems[4])]" style="position: relative; left: -31px">
-            <div class="rabbit-running">
-              <img src="../../../resources/img/new_img/rabbit.png" alt=""
-                :style="{ display: rabbitPos[5] ? 'block' : 'none' }" />
-            </div>
-            <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)" data-num="5">
-              <div class="image-container">
-                <img src="../../../resources/img/new_img/board/racebtn_5.png" alt="Race Button" class="base-img" />
-                <img v-if="rabbitCompl[5]" src="../../../resources/img/new_img/icon/clear_img.png" alt="Clear Icon"
-                  class="clear-img" />
-              </div>
-            </button>
-            <p :class="!rabbitCompl[5] ? 'before-clear' : 'clear'">
-              <img v-if="rabbitCompl[5]" src="../../../resources/img/new_img/icon/complete_icon.png" alt="Complete Icon"
-                class="complete-icon" />
-              {{ labeledItems[4].label }}
-            </p>
-          </div>
-          <!-- 4 -->
-          <div class="race-btn" @click="[storeLearningId(labeledItems[3])]">
-            <div class="rabbit-running">
-              <img src="../../../resources/img/new_img/rabbit.png" alt=""
-                :style="{ display: rabbitPos[4] ? 'block' : 'none' }" />
-            </div>
-            <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)" data-num="4">
-              <div class="image-container">
-                <img src="../../../resources/img/new_img/board/racebtn_4.png" alt="Race Button" class="base-img" />
-                <img v-if="rabbitCompl[4]" src="../../../resources/img/new_img/icon/clear_img.png" alt="Clear Icon"
-                  class="clear-img" />
-              </div>
-            </button>
-            <p :class="!rabbitCompl[4] ? 'before-clear' : 'clear'">
-              <img v-if="rabbitCompl[4]" src="../../../resources/img/new_img/icon/complete_icon.png" alt="Complete Icon"
-                class="complete-icon" />
-              {{ labeledItems[3].label }}
-            </p>
-          </div>
-          <!-- 3 -->
-          <div class="race-btn" @click="[storeLearningId(labeledItems[2])]" style="right: 12px">
-            <div class="rabbit-running">
-              <img src="../../../resources/img/new_img/rabbit.png" alt=""
-                :style="{ display: rabbitPos[3] ? 'block' : 'none' }" />
-            </div>
-            <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)" data-num="3">
-              <div class="image-container">
-                <img src="../../../resources/img/new_img/board/racebtn_3.png" alt="Race Button" class="base-img" />
-                <img v-if="rabbitCompl[3]" src="../../../resources/img/new_img/icon/clear_img.png" alt="Clear Icon"
-                  class="clear-img" />
-              </div>
-            </button>
-            <p :class="!rabbitCompl[3] ? 'before-clear' : 'clear'">
-              <img v-if="rabbitCompl[3]" src="../../../resources/img/new_img/icon/complete_icon.png" alt="Complete Icon"
-                class="complete-icon" />
-              {{ labeledItems[2].label }}
-            </p>
-          </div>
-        </div>
-        <!-- 3번째줄 -->
-        <div class="rcon flex" style="position: relative; top: -23px">
-          <!-- 8 -->
-          <div class="race-btn" @click="[storeLearningId(labeledItems[7])]">
-            <div class="rabbit-running">
-              <img src="../../../resources/img/new_img/rabbit.png" alt=""
-                :style="{ display: rabbitPos[8] ? 'block' : 'none' }" />
-            </div>
-            <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)" data-num="8">
-              <div class="image-container">
-                <img src="../../../resources/img/new_img/board/racebtn_8.png" alt="Race Button" class="base-img" />
-                <img v-if="rabbitCompl[8]" src="../../../resources/img/new_img/icon/clear_img.png" alt="Clear Icon"
-                  class="clear-img" />
-              </div>
-            </button>
-            <p :class="!rabbitCompl[8] ? 'before-clear' : 'clear'">
-              <img v-if="rabbitCompl[8]" src="../../../resources/img/new_img/icon/complete_icon.png" alt="Complete Icon"
-                class="complete-icon" />
-              {{ labeledItems[7].label }}
-            </p>
-          </div>
-          <!-- 9 -->
-          <div class="race-btn" @click="[storeLearningId(labeledItems[8])]">
-            <div class="rabbit-running">
-              <img src="../../../resources/img/new_img/rabbit.png" alt=""
-                :style="{ display: rabbitPos[9] ? 'block' : 'none' }" />
-            </div>
-            <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)" data-num="9">
-              <div class="image-container">
-                <img src="../../../resources/img/new_img/board/racebtn_9.png" alt="Race Button" class="base-img" />
-                <img v-if="rabbitCompl[9]" src="../../../resources/img/new_img/icon/clear_img.png" alt="Clear Icon"
-                  class="clear-img" />
-              </div>
-            </button>
-            <p :class="!rabbitCompl[9] ? 'before-clear' : 'clear'">
-              <img v-if="rabbitCompl[9]" src="../../../resources/img/new_img/icon/complete_icon.png" alt="Complete Icon"
-                class="complete-icon" />
-              {{ labeledItems[8].label }}
-            </p>
-          </div>
-          <!-- 10 -->
-          <div class="race-btn" @click="[storeLearningId(labeledItems[9])]">
-            <div class="rabbit-running">
-              <img src="../../../resources/img/new_img/rabbit.png" alt=""
-                :style="{ display: rabbitPos[10] ? 'block' : 'none' }" />
-            </div>
-            <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)"
-              data-num="10">
-              <div class="image-container">
-                <img src="../../../resources/img/new_img/board/racebtn_10.png" alt="Race Button" class="base-img" />
-                <img v-if="rabbitCompl[10]" src="../../../resources/img/new_img/icon/clear_img.png" alt="Clear Icon"
-                  class="clear-img" />
-              </div>
-            </button>
-            <p :class="!rabbitCompl[10] ? 'before-clear' : 'clear'">
-              <img v-if="rabbitCompl[10]" src="../../../resources/img/new_img/icon/complete_icon.png"
-                alt="Complete Icon" class="complete-icon" />
-              {{ labeledItems[9].label }}
-            </p>
-          </div>
-          <!-- 11 -->
-          <div class="race-btn" @click="[storeLearningId(labeledItems[10])]">
-            <div class="rabbit-running">
-              <img src="../../../resources/img/new_img/rabbit.png" alt=""
-                :style="{ display: rabbitPos[11] ? 'block' : 'none' }" />
-            </div>
-            <button class="popTxt" v-for="(item, index) in items" :key="index"
-              @click="toggleImageAndShowPopup(index, '11')" data-num="11">
-              <div class="image-container">
-                <img src="../../../resources/img/new_img/board/racebtn_11.png" alt="Race Button" class="base-img" />
-                <img v-if="rabbitCompl[11]" src="../../../resources/img/new_img/icon/clear_img.png" alt="Clear Icon"
-                  class="clear-img" />
-              </div>
-            </button>
-            <p :class="!rabbitCompl[11] ? 'before-clear' : 'clear'">
-              <img v-if="rabbitCompl[11]" src="../../../resources/img/new_img/icon/complete_icon.png"
-                alt="Complete Icon" class="complete-icon" />
-              {{ labeledItems[10].label }}
-            </p>
-          </div>
-        </div>
-        <div class="race-btn">
-          <div class="rabbit-running" style="display: flex">
-            <img class="rabbit-end" src="../../../resources/img/new_img/rabbit.png" alt=""
-              :style="{ display: rabbitEnd ? 'block' : 'none' }" />
-            <img class="fireworks-end" src="../../../resources/img/fireworks.gif" alt=""
-              :style="{ display: rabbitEnd ? 'block' : 'none' }" />
-          </div>
-        </div>
-      </div>
 
-      <!-- 팝업 -->
-      <div v-show="searchOpen2" class="popup-wrap">
-        <div class="popup-box">
-          <button type="button" class="popup-close-btn" style="position: absolute; top: 10px; right: 10px"
-            @click="closeModal">
-            <svg-icon type="mdi" :path="mdiWindowClose" class="close-btn"></svg-icon>
-          </button>
+            <!-- 팝업 -->
+            <div v-show="searchOpen2" class="phogo-popup popup-wrap">
+                <div class="popup-box">
+                    <button
+                        type="button"
+                        class="popup-close-btn"
+                        style="position: absolute; top: 10px; right: 10px"
+                        @click="closeModal"
+                    >
+                        <svg-icon type="mdi" :path="mdiWindowClose" class="close-btn"></svg-icon>
+                    </button>
 
-          <div class="mb30 text-ct">
-            <p class="title1 mb20">1단원이 끝났습니다!</p>
-            <p class="title1">
-              <em class="yellow">기념사진</em>을 촬영하러 가요
-            </p>
-          </div>
-          <div class="flex justify-center">
-            <button type="button" title="사진촬영" class="new-btn" @click="openCameraModal">
-              사진 촬영
-            </button>
-          </div>
-        </div>
-      </div>
-      <!-- 카메라 모달 -->
-      <article v-show="showCameraModal" class="popup-wrap">
-        <div class="popup-box" style="top: 500px; left: 500px">
-          <div class="flex mb10 justify-between">
-            <p class="popup-title">사진 촬영</p>
-            <button type="button" class="popup-close-btn" @click="closeModal">
-              <svg-icon type="mdi" :path="mdiWindowClose" class="close-btn"></svg-icon>
-            </button>
-          </div>
-          <div class="box">
-            <div style="width: 100%">
-              <div id="container" ref="container">
-                <video v-if="!photoTaken" autoplay="true" ref="modalVideoElement" class="mirrored"
-                  @canplay="onVideoLoaded" style="position: absolute; height: 100%"></video>
-                <img src="../../../resources/img/camera-rabbit.png" class="camera-rabbit" style="position: absolute" />
-                <canvas ref="canvas" style="pointer-events: none"></canvas>
-              </div>
+                    <div class="mb30 text-ct">
+                        <p class="title1 mb20">1단원이 끝났습니다!</p>
+                        <p class="title1"><em class="yellow">기념사진</em>을 촬영하러 가요</p>
+                    </div>
+                    <div class="flex justify-center">
+                        <button type="button" title="사진촬영" class="new-btn" @click="openCameraModal">
+                            사진 촬영
+                        </button>
+                    </div>
+                </div>
             </div>
-          </div>
-          <div class="flex justify-center mt20">
-            <button class="new-btn" @click="takePhoto">사진 찍기</button>
-          </div>
+            <!-- 카메라 모달 -->
+            <article v-show="showCameraModal" class="popup-wrap">
+                <div class="popup-box" style="top: 500px; left: 500px">
+                    <div class="flex mb10 justify-between">
+                        <p class="popup-title">사진 촬영</p>
+                        <button type="button" class="popup-close-btn" @click="closeModal">
+                            <svg-icon type="mdi" :path="mdiWindowClose" class="close-btn"></svg-icon>
+                        </button>
+                    </div>
+                    <div class="box">
+                        <div style="width: 100%">
+                            <div id="container" ref="container">
+                                <video
+                                    v-if="!photoTaken"
+                                    autoplay="true"
+                                    ref="modalVideoElement"
+                                    class="mirrored"
+                                    @canplay="onVideoLoaded"
+                                    style="position: absolute; height: 100%"
+                                ></video>
+                                <img
+                                    src="../../../resources/img/camera-rabbit.png"
+                                    class="camera-rabbit"
+                                    style="position: absolute"
+                                />
+                                <canvas ref="canvas" style="pointer-events: none"></canvas>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="flex justify-center mt20">
+                        <button class="new-btn" @click="takePhoto">사진 찍기</button>
+                    </div>
+                </div>
+            </article>
         </div>
-      </article>
+
+        <div class="complete-wrap myphoto">
+            <button class="login-btn mt10" type="submit" style="width: 100%" @click="finishSchedule">
+                <img src="../../../resources/img/btn07_s.png" alt="" style="height: 100px" />
+                <p>학습 종료하기</p>
+            </button>
+            <h2 class="mb40 mt10">이 단원을 끝낸 친구들</h2>
+
+            <article class="flex-column">
+                <div class="flex-row">
+                    <div class="flex" style="gap: 5px; flex-wrap: wrap">
+                        <div
+                            v-for="image in images"
+                            :key="image.fileId"
+                            @click="buttonSearch(image)"
+                            class="photo"
+                            style="margin-bottom: 5px"
+                        >
+                            <img :src="image.url" :alt="image.fileNm" reloadable="true" style="height: 100%" />
+                        </div>
+                    </div>
+                </div>
+            </article>
+            <article class="popup-wrap" v-show="searchOpen">
+                <div class="popup-box" style="top: 50%">
+                    <div class="flex mb10 justify-between">
+                        <button type="button" class="popup-close-btn" @click="closeModal">
+                            <svg-icon type="mdi" :path="mdiWindowClose" class="close-btn"></svg-icon>
+                        </button>
+                    </div>
+                    <div class="box">
+                        <div style="width: 910px; height: 680px">
+                            <img :src="selectedImage.image" alt="Image" @error="onImageError" reloadable="true" />
+                        </div>
+                    </div>
+                    <div class="flex justify-between mt20">
+                        <div class="text flex">
+                            <p class="title2 date ml30">{{ selectedImage.date }}</p>
+                            <span class="title1 ml30"
+                                >{{ selectedImage.unit }}을 마친 <em class="yellow">{{ selectedImage.name }}</em
+                                >친구</span
+                            >
+                        </div>
+                        <div class="title2 flex align-center" style="gap: 10px">
+                            <svg-icon
+                                v-if="!isHeartFilled"
+                                type="mdi"
+                                :path="mdiHeartOutline"
+                                @click="toggleHeart(selectedImage.heart, selectedImage.fileMngId)"
+                                style="color: #ffba08; cursor: pointer"
+                            ></svg-icon>
+                            <svg-icon
+                                v-if="isHeartFilled"
+                                type="mdi"
+                                :path="mdiHeart"
+                                @click="toggleHeart(selectedImage.heart, selectedImage.fileMngId)"
+                                style="color: #ffba08; cursor: pointer"
+                            ></svg-icon>
+                            <p>
+                                <em class="yellow">{{ selectedImage.heart }}</em>
+                            </p>
+                        </div>
+                    </div>
+                </div>
+            </article>
+        </div>
     </div>
-
-    <div class="complete-wrap myphoto">
-      <button class="login-btn mt10" type="submit" style="width: 100%" @click="finishSchedule">
-        <img src="../../../resources/img/btn07_s.png" alt="" style="height: 100px" />
-        <p>학습 종료하기</p>
-      </button>
-      <h2 class="mb40 mt10">이 단원을 끝낸 친구들</h2>
-
-      <article class="flex-column">
-        <div class="flex-row">
-          <div class="flex" style="gap: 5px; flex-wrap: wrap">
-            <div v-for="(image, index) in images" :key="image.fileId" @click="buttonSearch(image)" class="photo"
-              style="margin-bottom: 5px">
-              <img :src="image.url" :alt="image.fileNm" reloadable="true" style="height: 100%" />
-            </div>
-          </div>
-        </div>
-      </article>
-      <article class="popup-wrap" v-show="searchOpen">
-        <div class="popup-box" style="top: 50%">
-          <div class="flex mb10 justify-between">
-            <button type="button" class="popup-close-btn" @click="closeModal">
-              <svg-icon type="mdi" :path="mdiWindowClose" class="close-btn"></svg-icon>
-            </button>
-          </div>
-          <div class="box">
-            <div style="width: 910px; height: 680px">
-              <img :src="selectedImage.image" alt="Image" @error="onImageError" reloadable="true" />
-            </div>
-          </div>
-          <div class="flex justify-between mt20">
-            <div class="text flex">
-              <p class="title2 date ml30">{{ selectedImage.date }}</p>
-              <span class="title1 ml30">{{ selectedImage.unit }}을 마친
-                <em class="yellow">{{ selectedImage.name }}</em>친구</span>
-            </div>
-            <div class="title2 flex align-center" style="gap: 10px">
-              <svg-icon v-if="!isHeartFilled" type="mdi" :path="mdiHeartOutline" @click="
-                toggleHeart(selectedImage.heart, selectedImage.fileMngId)
-                " style="color: #ffba08; cursor: pointer"></svg-icon>
-              <svg-icon v-if="isHeartFilled" type="mdi" :path="mdiHeart" @click="
-                toggleHeart(selectedImage.heart, selectedImage.fileMngId)
-                " style="color: #ffba08; cursor: pointer"></svg-icon>
-              <p>
-                <em class="yellow">{{ selectedImage.heart }}</em>
-              </p>
-            </div>
-          </div>
-        </div>
-      </article>
-    </div>
-  </div>
 </template>
 
 <script>
-import SvgIcon from "@jamescoyle/vue-icon";
-import { mdiMagnify, mdiHeart, mdiWindowClose } from "@mdi/js";
-import { mdiHeartOutline } from "@mdi/js";
-import axios from "axios";
-import { call } from "file-loader";
-import { name } from "file-loader";
-import { mapGetters } from "vuex";
-import { mapActions } from "vuex";
+import SvgIcon from '@jamescoyle/vue-icon';
+import { mdiMagnify, mdiHeart, mdiWindowClose } from '@mdi/js';
+import { mdiHeartOutline } from '@mdi/js';
+import axios from 'axios';
+import { call } from 'file-loader';
+import { name } from 'file-loader';
+import { mapGetters } from 'vuex';
+import { mapActions } from 'vuex';
 
 export default {
-  data() {
-    return {
-      items: [
-        {
-          imgSrc1: "client/resources/img/img11_1_s.png",
-          imgSrc2: "client/resources/img/img12_1_s.png",
-          imgSrc3: "client/resources/img/img11_2_s.png",
-          imgSrc4: "client/resources/img/img12_2_s.png",
-          isSecondImageVisible: false,
-        },
-      ],
-      mdiMagnify: mdiMagnify,
-      mdiWindowClose: mdiWindowClose,
-      mdiHeart: mdiHeart,
-      mdiHeartOutline: mdiHeartOutline,
-      showModal: false,
-      searchOpen: false, // 사진 상세보기 모달창
-      searchOpen2: false, // 단원 마친 후, 사진 촬영 여부 선택 모달창
-      showCameraModal: false, // 카메라 모달창
-      photoTaken: false,
-      photo: null, //캡쳐 사진
-      stream: null,
+    data() {
+        return {
+            items: [
+                {
+                    imgSrc1: 'client/resources/img/img11_1_s.png',
+                    imgSrc2: 'client/resources/img/img12_1_s.png',
+                    imgSrc3: 'client/resources/img/img11_2_s.png',
+                    imgSrc4: 'client/resources/img/img12_2_s.png',
+                    isSecondImageVisible: false,
+                },
+            ],
+            mdiMagnify: mdiMagnify,
+            mdiWindowClose: mdiWindowClose,
+            mdiHeart: mdiHeart,
+            mdiHeartOutline: mdiHeartOutline,
+            showModal: false,
+            searchOpen: false, // 사진 상세보기 모달창
+            searchOpen2: false, // 단원 마친 후, 사진 촬영 여부 선택 모달창
+            showCameraModal: false, // 카메라 모달창
+            photoTaken: false,
+            photo: null, //캡쳐 사진
+            stream: null,
 
-      roadmapData: [],
-      labeledItems: [],
+            roadmapData: [],
+            labeledItems: [],
 
-      problemCounter: 0,
-      wordCounter: 0,
-      textCounter: 0,
-      evalCounter: 0,
-      book_id: null,
-      unit_id: null,
+            problemCounter: 0,
+            wordCounter: 0,
+            textCounter: 0,
+            evalCounter: 0,
+            book_id: null,
+            unit_id: null,
 
-      schedules: [],
-      nowSchedule: "",
-      state: "",
-      rabbitPos: [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
-      rabbitCompl: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
-      rabbitEnd: false,
+            schedules: [],
+            nowSchedule: '',
+            state: '',
+            rabbitPos: [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+            rabbitCompl: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+            rabbitEnd: false,
 
-      titleUnitName: "",
-      titleBookName: "",
+            titleUnitName: '',
+            titleBookName: '',
 
-      images: [],
+            images: [],
 
-      selectedImage: [
-        {
-          image: "",
-          unit: "",
-          date: "",
-          name: "",
-          heart: "",
-          fileMngId: "",
-        },
-      ],
+            selectedImage: [
+                {
+                    image: '',
+                    unit: '',
+                    date: '',
+                    name: '',
+                    heart: '',
+                    fileMngId: '',
+                },
+            ],
 
-      isHeartFilled: false, // 하트가 채워졌는지 여부
+            isHeartFilled: false, // 하트가 채워졌는지 여부
 
-      problemType: null,
-      wordBookType: null,
-      wordContentList: [],
-    };
-  },
-  methods: {
-    toggleHeart(heart, fileMngId) {
-      this.isHeartFilled = !this.isHeartFilled; // 하트 상태 토글
-
-      if (this.isHeartFilled) var calHeart = heart + 1;
-      else var calHeart = heart - 1;
-
-      // 하트 수를 증가시키기 위한 API 요청
-      axios
-        .post("/photo/likeUpdate.json", {
-          likeData: calHeart,
-          fileMngId: fileMngId,
-        })
-        .then((response) => {
-          this.selectedImage.heart = calHeart;
-        })
-        .catch((error) => {
-          console.error("Error updating heart:", error);
-        });
+            problemType: null,
+            wordBookType: null,
+            wordContentList: [],
+        };
     },
-    checkAndFetchData() {
-      console.log("받은 Book ID:", this.getBookId);
-      console.log("받은 Unit ID:", this.getUnitId);
-      const book_id = this.getBookId;
-      const unit_id = this.getUnitId;
+    methods: {
+        toggleHeart(heart, fileMngId) {
+            this.isHeartFilled = !this.isHeartFilled; // 하트 상태 토글
 
-      if (!book_id || !unit_id) {
-        console.error("book_id 또는 unit_id가 설정되지 않았습니다.");
-        this.state = "notRegistered";
-        return;
-      }
-      this.fetchImage(unit_id);
-      this.fetchSchedule(unit_id, book_id);
-      this.fetchRoadmapData(unit_id, book_id);
-      this.fetchRabbit();
+            if (this.isHeartFilled) var calHeart = heart + 1;
+            else var calHeart = heart - 1;
 
-      this.unit_id = unit_id;
-      this.book_id = book_id;
-
-      if (this.$route.query.reCapture == "true") {
-        this.openCameraModal();
-      }
-
-      this.searchStdId();
-    },
-
-    //은진
-    buttonSearch(image) {
-      this.isHeartFilled = false;
-      this.selectedImage.name = image.stdId;
-      this.selectedImage.image = image.url;
-      this.selectedImage.unit = this.titleUnitName;
-      this.selectedImage.date = image.fileRegDate.split(" ")[0];
-      this.selectedImage.heart = image.likeData;
-      this.selectedImage.fileMngId = image.fileMngId;
-      this.searchOpen = true;
-    },
-    fetchImage(unit_id) {
-      axios({
-        url: "/photo/photoUnitList.json",
-        method: "post",
-        headers: {
-          "Content-Type": "application/json; charset=UTF-8",
+            // 하트 수를 증가시키기 위한 API 요청
+            axios
+                .post('/photo/likeUpdate.json', {
+                    likeData: calHeart,
+                    fileMngId: fileMngId,
+                })
+                .then((response) => {
+                    this.selectedImage.heart = calHeart;
+                })
+                .catch((error) => {
+                    console.error('Error updating heart:', error);
+                });
         },
-        data: {
-          unitId: unit_id,
-          sclsId: "1",
+        checkAndFetchData() {
+            console.log('받은 Book ID:', this.getBookId);
+            console.log('받은 Unit ID:', this.getUnitId);
+            const book_id = this.getBookId;
+            const unit_id = this.getUnitId;
+
+            if (!book_id || !unit_id) {
+                console.error('book_id 또는 unit_id가 설정되지 않았습니다.');
+                this.state = 'notRegistered';
+                return;
+            }
+            this.fetchImage(unit_id);
+            this.fetchSchedule(unit_id, book_id);
+            this.fetchRoadmapData(unit_id, book_id);
+            this.fetchRabbit();
+
+            this.unit_id = unit_id;
+            this.book_id = book_id;
+
+            if (this.$route.query.reCapture == 'true') {
+                this.openCameraModal();
+            }
+
+            this.searchStdId();
         },
-      })
-        .then((response) => {
-          this.file = response.data;
 
-          const findFilePromises = this.file.map((f) =>
-            this.findFile(f.file_mng_id)
-          );
-
-          return Promise.all(findFilePromises);
-        })
-        .then((fileResults) => {
-          this.images = this.file
-            .map((file, index) => {
-              const result = fileResults[index];
-              if (result) {
-                return {
-                  url: "http://165.229.169.113:9080/" + `${result.fileRpath}`,
-                  fileId: result.fileId,
-                  fileNm: result.fileNm,
-                  fileRegDate: result.regDt,
-                  likeData: file.like_data,
-                  stdId: file.user_nm,
-                  fileMngId: result.fileMngId,
-                };
-              }
-              return null;
+        //은진
+        buttonSearch(image) {
+            this.isHeartFilled = false;
+            this.selectedImage.name = image.stdId;
+            this.selectedImage.image = image.url;
+            this.selectedImage.unit = this.titleUnitName;
+            this.selectedImage.date = image.fileRegDate.split(' ')[0];
+            this.selectedImage.heart = image.likeData;
+            this.selectedImage.fileMngId = image.fileMngId;
+            this.searchOpen = true;
+        },
+        fetchImage(unit_id) {
+            axios({
+                url: '/photo/photoUnitList.json',
+                method: 'post',
+                headers: {
+                    'Content-Type': 'application/json; charset=UTF-8',
+                },
+                data: {
+                    unitId: unit_id,
+                    sclsId: '1',
+                },
             })
-            .filter((image) => image !== null);
-        })
-        .catch((error) => {
-          console.error("Error fetching images:", error);
-        });
-    },
-    async findFile(file_mng_id) {
-      try {
-        const res = await axios({
-          url: "/file/find.json",
-          method: "post",
-          headers: {
-            "Content-Type": "application/json; charset=UTF-8",
-          },
-          data: {
-            file_mng_id: file_mng_id,
-          },
-        });
-        return res.data.list[0];
-      } catch (error) {
-        console.log("result - error : ", error);
-        return null;
-      }
-    },
-    goToPageImg(page) {
-      const canvas = document.querySelector("canvas");
-      const dataURL = canvas.toDataURL("image/png");
+                .then((response) => {
+                    this.file = response.data;
 
-      this.$router.push({
-        name: page,
-        query: { image: encodeURIComponent(dataURL) },
-      });
-    },
+                    const findFilePromises = this.file.map((f) => this.findFile(f.file_mng_id));
 
-    fetchRabbit() {
-      for (var i = 0; i < 12; i++) {
-        this.rabbitPos[i] = false;
-      }
-
-      if (this.$route.query.value) {
-        this.rabbitPos[parseInt(this.$route.query.value, 10) + 1] = true;
-        for (var i = 0; i < this.$route.query.value; i++) {
-          this.rabbitCompl[i + 1] = true;
-        }
-
-        if (this.$route.query.value === "11") {
-          this.rabbitEnd = true;
-          setTimeout(() => {
-            this.searchOpen2 = true;
-          }, 1000);
-        }
-      } else this.rabbitPos[0] = true;
-    },
-    fetchSchedule(unit_id, book_id) {
-      axios({
-        url: "/schedule/selectSchedule.json",
-        method: "post",
-        headers: {
-          "Content-Type": "application/json; charset=UTF-8",
+                    return Promise.all(findFilePromises);
+                })
+                .then((fileResults) => {
+                    this.images = this.file
+                        .map((file, index) => {
+                            const result = fileResults[index];
+                            if (result) {
+                                return {
+                                    url: 'http://165.229.169.113:9080/' + `${result.fileRpath}`,
+                                    fileId: result.fileId,
+                                    fileNm: result.fileNm,
+                                    fileRegDate: result.regDt,
+                                    likeData: file.like_data,
+                                    stdId: file.user_nm,
+                                    fileMngId: result.fileMngId,
+                                };
+                            }
+                            return null;
+                        })
+                        .filter((image) => image !== null);
+                })
+                .catch((error) => {
+                    console.error('Error fetching images:', error);
+                });
         },
-        data: {
-          stdId: "2",
-        },
-      })
-        .then((response) => {
-          this.schedules = response.data;
-
-          if (this.schedules.length == 0) {
-            this.state = "notRegistered";
-          } else {
-            const allFinished = this.schedules.every(
-              (schedule) => schedule.finish === "T"
-            );
-            if (allFinished) {
-              this.state = "finish";
-            } else {
-              this.nowSchedule = this.schedules.find(
-                (schedule) =>
-                  schedule.finish === null || schedule.finish === "F"
-              );
-              if (this.nowSchedule) {
-                this.fetchRoadmapData(unit_id, book_id);
-                this.state = "studying";
-              } else {
-                this.state = "notRegistered";
-              }
+        async findFile(file_mng_id) {
+            try {
+                const res = await axios({
+                    url: '/file/find.json',
+                    method: 'post',
+                    headers: {
+                        'Content-Type': 'application/json; charset=UTF-8',
+                    },
+                    data: {
+                        file_mng_id: file_mng_id,
+                    },
+                });
+                return res.data.list[0];
+            } catch (error) {
+                console.log('result - error : ', error);
+                return null;
             }
-          }
-        })
-        .catch((error) => {
-          console.error("Error fetching roadmap data:", error);
-        });
-    },
-    finishSchedule() {
-      axios({
-        url: "/schedule/scheduleUpdate.json",
-        method: "post",
-        headers: {
-          "Content-Type": "application/json; charset=UTF-8",
         },
-        data: {
-          scheduleId: this.nowSchedule.schdl_id,
-          finish: "T",
-        },
-      })
-        .then((response) => {
-          const nextSchedule = this.schedules.find(
-            (schedule) => schedule.schdl_id > this.nowSchedule.schdl_id
-          );
-          alert("학습을 완료했습니다!");
+        goToPageImg(page) {
+            const canvas = document.querySelector('canvas');
+            const dataURL = canvas.toDataURL('image/png');
 
-          if (nextSchedule) {
-            this.nowSchedule = nextSchedule;
-            this.fetchSchedule(nextSchedule.unit_id, nextSchedule.book_id);
-            this.fetchRoadmapData(nextSchedule.unit_id, nextSchedule.book_id);
             this.$router.push({
-              name: "Dashboard",
-              query: {
-                unit_id: nextSchedule.unit_id,
-                book_id: nextSchedule.book_id,
-              },
+                name: page,
+                query: { image: encodeURIComponent(dataURL) },
             });
-          } else {
-            alert("모든 학습을 완료했습니다!");
-            this.state = "finish";
-          }
-        })
-        .catch((error) => {
-          console.error("Error updating schedule:", error);
-        });
-    },
-    fetchRoadmapData(unit_id, book_id) {
-      axios({
-        url: "/unitLearning/find.json",
-        method: "post",
-        headers: {
-          "Content-Type": "application/json; charset=UTF-8",
         },
-        data: {
-          unit_id: unit_id,
-          book_id: book_id,
-        },
-      })
-        .then((response) => {
-          if (response.data.length != 0) {
-            this.roadmapData = response.data;
-            this.titleUnitName = this.roadmapData[0].unit_nm;
-            this.titleBookName = this.roadmapData[0].book_nm;
-            this.labeledItems = this.processedRoadmap;
-            console.log(this.roadmapData, this.labeledItems);
-          } else {
-            this.state = "noProblem";
-          }
-        })
-        .catch((error) => {
-          this.state = "noProblem";
-          console.error("Error fetching roadmap data:", error);
-        });
-    },
-    toggleImage(index) {
-      this.items[index].isSecondImageVisible =
-        !this.items[index].isSecondImageVisible;
-    },
-    ShowPopup() {
-      this.searchOpen2 = true; // 촬영 여부 묻는 모달창 열기
-    },
-    goToPage(page) {
-      // const { unit_id, book_id } = this.$route.query;
-      // this.$router.push({ name: page, query: { unit_id, book_id } });
-      this.$router.push({ name: page });
-    },
-    goToPage2(page, unit_id) {
-      this.$router.push({
-        name: page,
-        query: {
-          unit_id: unit_id,
-        },
-      });
-    },
 
-    storeLearningId(labeledItems) {
-      this.$store.dispatch("updateLearningData", labeledItems);
-      this.$store.dispatch("updateLearningId", labeledItems.learning_id); // 단어장에 사용중..
-
-      console.log("레이블된 아이템: ", labeledItems);
-      if (labeledItems.label.startsWith("문제")) {
-        this.handleProblemDetail(this.$store.getters.currentLearningId);
-        console.log(">>>>>>>>>>", this.$store.getters.currentLearningId)
-        this.goToPage(this.problemType);
-      } else if (labeledItems.label.startsWith("단어장")) {
-        this.handleWordBookContent(this.$store.getters.getLearningId);
-      } else if (labeledItems.label.startsWith("지문")) {
-        //console.log("지문 아이디 : ", labeledItems.learning_id);
-        this.$store.dispatch("updateTextId", labeledItems.learning_id);
-        this.fetchTextType(labeledItems.learning_id);
-      } else if (labeledItems.label.startsWith("중간평가")) {
-        this.fetchEvalData(labeledItems);
-      } else if (labeledItems.label.startsWith("최종평가")) {
-        this.fetchEvalData(labeledItems);
-      }
-    },
-    handleWordBookContent(item) {
-      console.log("처리할 단어장 콘텐츠 id: ", item);
-
-      // 단어장 ID 가져오기
-      axios
-        .post("/wordContent/selectWordContent.json", {
-          wordContentId: item,
-        })
-        .then((response) => {
-          this.wordContentList = response.data;
-
-          this.$store.dispatch(
-            "updateWdBookIdList",
-            this.wordContentList.map((content) => content.wd_book_id)
-          );
-          this.$store.dispatch("updateCurrentWdBkIndex", 0);
-          console.log(
-            "저장한 단어장 id 리스트: ",
-            this.$store.getters.getWdBookIdList
-          );
-
-          // 단어장 ID 리스트에서 첫 번째 단어장 ID를 사용
-          const wdBookId = this.wordContentList[0].wd_book_id;
-
-          // 단어장 정보 가져오기
-          return axios.post("/wordbook/find.json", {
-            wdBookId: wdBookId,
-          });
-        })
-        .then((response) => {
-          const wordbookData = response.data;
-
-          // 단어장 타입에 따라 페이지 설정
-          if (wordbookData && wordbookData.wdBookTypeId) {
-            switch (wordbookData.wdBookTypeId) {
-              case "1":
-                this.wordBookType = "Chapter2";
-                break;
-              case "2":
-                this.wordBookType = "Chapter2_3";
-                break;
-              case "3":
-                this.wordBookType = "Chapter2_2";
-                break;
-              case "4":
-                this.wordBookType = "Chapter2_9";
-                break;
-              case "5":
-                this.wordBookType = "Chapter2_4";
-                break;
-              default:
-                this.wordBookType = null;
+        fetchRabbit() {
+            for (var i = 0; i < 12; i++) {
+                this.rabbitPos[i] = false;
             }
-          } else {
-            console.error("wdBookTypeId가 없습니다.");
-            this.wordBookType = null;
-          }
 
-          console.log("현재 단어장 타입: ", this.wordBookType);
-          this.goToPage(this.wordBookType);
-        })
-        .catch((error) => {
-          console.error("단어장 정보를 불러오는 중 오류 발생:", error);
-          this.wordBookType = null;
-        });
-    },
-    // 지문 type 불러오기
-    fetchTextType(text_id) {
-      axios({
-        url: "/text/selectOneText.json",
-        method: "post",
-        headers: {
-          "Content-Type": "application/json; charset=UTF-8",
+            if (this.$route.query.value) {
+                this.rabbitPos[parseInt(this.$route.query.value, 10) + 1] = true;
+                for (var i = 0; i < this.$route.query.value; i++) {
+                    this.rabbitCompl[i + 1] = true;
+                }
+
+                if (this.$route.query.value === '11') {
+                    this.rabbitEnd = true;
+                    setTimeout(() => {
+                        this.searchOpen2 = true;
+                    }, 1000);
+                }
+            } else this.rabbitPos[0] = true;
         },
-        data: {
-          textId: text_id,
+        fetchSchedule(unit_id, book_id) {
+            axios({
+                url: '/schedule/selectSchedule.json',
+                method: 'post',
+                headers: {
+                    'Content-Type': 'application/json; charset=UTF-8',
+                },
+                data: {
+                    stdId: '2',
+                },
+            })
+                .then((response) => {
+                    this.schedules = response.data;
+
+                    if (this.schedules.length == 0) {
+                        this.state = 'notRegistered';
+                    } else {
+                        const allFinished = this.schedules.every((schedule) => schedule.finish === 'T');
+                        if (allFinished) {
+                            this.state = 'finish';
+                        } else {
+                            this.nowSchedule = this.schedules.find(
+                                (schedule) => schedule.finish === null || schedule.finish === 'F'
+                            );
+                            if (this.nowSchedule) {
+                                this.fetchRoadmapData(unit_id, book_id);
+                                this.state = 'studying';
+                            } else {
+                                this.state = 'notRegistered';
+                            }
+                        }
+                    }
+                })
+                .catch((error) => {
+                    console.error('Error fetching roadmap data:', error);
+                });
         },
-      })
-        .then((response) => {
-          const text_type_id = response.data[0].text_type_id;
-          // console.log("지문 유형 아이디 : ", text_type_id);
-          if (text_type_id === "2") {
-            this.goToPage("Chapter1_2");
-          } else if (text_type_id === "3") {
-            this.goToPage("Chapter1_3");
-          }
-        })
-        .catch((err) => {
-          console.log("지문 에러 : ", err);
-        });
-    },
+        finishSchedule() {
+            axios({
+                url: '/schedule/scheduleUpdate.json',
+                method: 'post',
+                headers: {
+                    'Content-Type': 'application/json; charset=UTF-8',
+                },
+                data: {
+                    scheduleId: this.nowSchedule.schdl_id,
+                    finish: 'T',
+                },
+            })
+                .then((response) => {
+                    const nextSchedule = this.schedules.find(
+                        (schedule) => schedule.schdl_id > this.nowSchedule.schdl_id
+                    );
+                    alert('학습을 완료했습니다!');
 
-    // 평가 정보를 통해서 관련 문제 가져오기
-    fetchEvalData(evaldata) {
-      axios({
-        url: "/evalProblem/selectEvalProblem.json",
-        method: "post",
-        headers: {
-          "Content-Type": "application/json; charset=UTF-8",
+                    if (nextSchedule) {
+                        this.nowSchedule = nextSchedule;
+                        this.fetchSchedule(nextSchedule.unit_id, nextSchedule.book_id);
+                        this.fetchRoadmapData(nextSchedule.unit_id, nextSchedule.book_id);
+                        this.$router.push({
+                            name: 'Dashboard',
+                            query: {
+                                unit_id: nextSchedule.unit_id,
+                                book_id: nextSchedule.book_id,
+                            },
+                        });
+                    } else {
+                        alert('모든 학습을 완료했습니다!');
+                        this.state = 'finish';
+                    }
+                })
+                .catch((error) => {
+                    console.error('Error updating schedule:', error);
+                });
         },
-        data: {
-          evalId: evaldata.learning_id,
+        fetchRoadmapData(unit_id, book_id) {
+            axios({
+                url: '/unitLearning/find.json',
+                method: 'post',
+                headers: {
+                    'Content-Type': 'application/json; charset=UTF-8',
+                },
+                data: {
+                    unit_id: unit_id,
+                    book_id: book_id,
+                },
+            })
+                .then((response) => {
+                    if (response.data.length != 0) {
+                        this.roadmapData = response.data;
+                        this.titleUnitName = this.roadmapData[0].unit_nm;
+                        this.titleBookName = this.roadmapData[0].book_nm;
+                        this.labeledItems = this.processedRoadmap;
+                        console.log(this.roadmapData, this.labeledItems);
+                    } else {
+                        this.state = 'noProblem';
+                    }
+                })
+                .catch((error) => {
+                    this.state = 'noProblem';
+                    console.error('Error fetching roadmap data:', error);
+                });
         },
-      })
-        .then((response) => {
-          const payload = {
-            learning_id: response.data,
-            label: evaldata.label,
-            seqNum: evaldata.seqNum,
-          };
-
-          // Vuex 뮤테이션 호출
-          this.$store.commit("setLearningData", payload);
-          this.handleProblemDetail(response.data[0]);
-          this.goToPage(this.problemType);
-        })
-        .catch((error) => {
-          console.error("fetchData - error: ", error);
-          return [];
-        });
-    },
-
-    handleProblemDetail(item) {
-      if (item.prblm_type_id === "prblm_type_001") {
-        this.problemType = "Chapter3";
-      } else if (item.prblm_type_id === "prblm_type_002") {
-        this.problemType = "Chapter3_1";
-      } else if (item.prblm_type_id === "prblm_type_003") {
-        this.problemType = "Chapter3_2";
-      } else if (item.prblm_type_id === "prblm_type_004") {
-        this.problemType = "Chapter3_3";
-      } else if (item.prblm_type_id === "prblm_type_005") {
-        this.problemType = "Chapter3_3_1";
-      } else if (item.prblm_type_id === "prblm_type_006") {
-        console.log(item);
-        this.problemType = "Chapter3_4";
-      } else if (item.prblm_type_id === "prblm_type_007") {
-        this.problemType = "Chapter3_5";
-      } else if (item.prblm_type_id === "prblm_type_008") {
-        this.problemType = "Chapter3_6";
-      } else if (item.prblm_type_id === "prblm_type_009") {
-        this.problemType = "Chapter3_7";
-      } else if (item.prblm_type_id === "prblm_type_010") {
-        this.problemType = "Chapter3_8";
-      } else if (item.prblm_type_id === "prblm_type_011") {
-        this.problemType = "Chapter3_9";
-      } else if (item.prblm_type_id === "prblm_type_012") {
-        this.problemType = "Chapter3_10";
-      } else if (item.prblm_type_id === "prblm_type_013") {
-        this.problemType = "Chapter3_11";
-      } else if (item.prblm_type_id === "prblm_type_014") {
-        this.problemType = "Chapter3_12";
-      } else if (item.prblm_type_id === "prblm_type_015") {
-        this.problemType = "Chapter3_13";
-      } else if (item.prblm_type_id === "prblm_type_016") {
-        this.problemType = "Chapter3_14";
-      } else if (item.prblm_type_id === "prblm_type_017") {
-        this.problemType = "Chapter3_15";
-      } else if (item.prblm_type_id === "prblm_type_018") {
-        this.problemType = "Chapter2_8";
-      } else if (item.prblm_type_id === "prblm_type_019") {
-        this.problemType = "Chapter2_7";
-      } else if (item.prblm_type_id === "prblm_type_020") {
-        this.problemType = "Chapter2_5";
-      } else if (item.prblm_type_id === "prblm_type_021") {
-        this.problemType = "Chapter2_6";
-      } else if (item.prblm_type_id === "prblm_type_022") {
-        this.problemType = "Chapter2_10";
-      } else if (item.prblm_type_id === "prblm_type_023") {
-        this.problemType = "Chapter2_11";
-      } else if (item.prblm_type_id === "prblm_type_024") {
-        this.problemType = "Chapter2_13";
-      }
-    },
-    openCameraModal() {
-      this.closeModal();
-
-      this.showCameraModal = true;
-      navigator.mediaDevices
-        .getUserMedia({ video: true })
-        .then((stream) => {
-          const modalVideo = this.$refs.modalVideoElement;
-          modalVideo.srcObject = stream;
-          this.stream = stream;
-        })
-        .catch((error) => {
-          console.log("error>>>>>>>>", error);
-          alert("웹캠이 필요한 기능입니다!");
-          this.closeModal(); // 모달창을 닫음
-        });
-    },
-    closeModal() {
-      this.searchOpen = false;
-      this.searchOpen2 = false;
-      this.showCameraModal = false;
-      this.photoTaken = false;
-      this.photo = null;
-
-      //스트림 종료
-      if (this.stream) {
-        let tracks = this.stream.getTracks();
-        tracks.forEach((track) => track.stop());
-        this.stream = null;
-      }
-    },
-
-    onVideoLoaded() {
-      const video = this.$refs.modalVideoElement;
-      const canvas = this.$refs.canvas;
-      const ctx = canvas.getContext("2d");
-
-      canvas.width = video.videoWidth;
-      canvas.height = video.videoHeight;
-    },
-    takePhoto() {
-      const video = this.$refs.modalVideoElement;
-      const canvas = this.$refs.canvas;
-      const ctx = canvas.getContext("2d");
-
-      ctx.save(); // 현재 상태 저장
-
-      // 캔버스 좌우 반전
-      ctx.scale(-1, 1);
-      ctx.drawImage(video, -canvas.width, 0, canvas.width, canvas.height);
-
-      ctx.restore();
-
-      const overlayImg = new Image();
-      overlayImg.src = "client/resources/img/camera-rabbit.png";
-      overlayImg.onload = () => {
-        const overlayWidth = canvas.width * 0.4;
-        const overlayHeight =
-          (overlayImg.height / overlayImg.width) * overlayWidth;
-        const overlayX = canvas.width - overlayWidth;
-        const overlayY = canvas.height - overlayHeight;
-
-        // 오버레이 이미지 그리기
-        ctx.drawImage(
-          overlayImg,
-          overlayX,
-          overlayY,
-          overlayWidth,
-          overlayHeight
-        );
-
-        // 사진 저장 함수 호출
-        const dataURL = canvas.toDataURL("image/png");
-        this.$router.push({
-          name: "PhotoEdit",
-          query: {
-            image: encodeURIComponent(dataURL),
-            unit_id: this.unit_id,
-            book_id: this.book_id,
-          },
-        });
-      };
-    },
-
-    buttonSearch2() {
-      this.searchOpen2 = true;
-    },
-    closeBtn() {
-      this.searchOpen = false;
-    },
-
-    // 유저 아이디를 unit 아이디를 통해 가져오기
-    searchStdId() {
-      const userInfo = this.$store.getters.getUserInfo;
-      axios({
-        url: "/userclass/searchStdId.json",
-        method: "post",
-        headers: {
-          "Content-Type": "application/json; charset=UTF-8",
+        toggleImage(index) {
+            this.items[index].isSecondImageVisible = !this.items[index].isSecondImageVisible;
         },
-        data: {
-          userId: userInfo.userId,
-          unitId: this.unit_id,
+        ShowPopup() {
+            this.searchOpen2 = true; // 촬영 여부 묻는 모달창 열기
         },
-      })
-        .then((response) => {
-          this.$store.commit("setStdId", response.data);
-        })
-        .catch((err) => {
-          console.log("지문 에러 : ", err);
-        });
-    },
-  },
-  components: {
-    SvgIcon,
-  },
-  mounted() {
-    console.log("main mounted");
-    this.checkAndFetchData();
-    // const { book_id, unit_id } = this.$route.query;
-    console.log(">>>>>>>>>>>>>>>>>>>",this.$store.getters.currentDashboard);
-  },
-  watch: {
-    getBookId(newBookId) {
-      this.checkAndFetchData();
-    },
-    getUnitId(newUnitId) {
-      this.checkAndFetchData();
-    },
-  },
-  computed: {
-    ...mapGetters(["getBookId", "getUnitId"]),
+        goToPage(page) {
+            // const { unit_id, book_id } = this.$route.query;
+            // this.$router.push({ name: page, query: { unit_id, book_id } });
+            this.$router.push({ name: page });
+        },
+        goToPage2(page, unit_id) {
+            this.$router.push({
+                name: page,
+                query: {
+                    unit_id: unit_id,
+                },
+            });
+        },
 
-    processedRoadmap() {
-      let problemCounter = 0;
-      let wordCounter = 0;
-      let textCounter = 0;
-      let evalCounter = 0;
+        storeLearningId(labeledItems) {
+            this.$store.dispatch('updateLearningData', labeledItems);
+            this.$store.dispatch('updateLearningId', labeledItems.learning_id); // 단어장에 사용중..
 
-      return this.roadmapData.map((item) => {
-        if (item.wd_cnt_id !== null) {
-          wordCounter++;
-          return {
-            label: `단어장${wordCounter}`,
-            learning_id: item.wd_cnt_id,
-            seqNum: item.seq,
-          };
-        } else if (item.text_id !== null) {
-          textCounter++;
-          return {
-            label: `지문${textCounter}`,
-            learning_id: item.text_id,
-            seqNum: item.seq,
-          };
-        } else if (item.eval_id !== null) {
-          evalCounter++;
-          return {
-            label: evalCounter === 1 ? "중간평가" : "최종평가",
-            learning_id: item.eval_id,
-            seqNum: item.seq,
-          };
-        } else {
-          problemCounter++;
-          return {
-            label: `문제${problemCounter}`,
-            learning_id: item.prblm_id,
-            seqNum: item.seq,
-          };
-        }
-      });
+            console.log('레이블된 아이템: ', labeledItems);
+            if (labeledItems.label.startsWith('문제')) {
+                this.handleProblemDetail(this.$store.getters.currentLearningId);
+                console.log('>>>>>>>>>>', this.$store.getters.currentLearningId);
+                this.goToPage(this.problemType);
+            } else if (labeledItems.label.startsWith('단어장')) {
+                this.handleWordBookContent(this.$store.getters.getLearningId);
+            } else if (labeledItems.label.startsWith('지문')) {
+                //console.log("지문 아이디 : ", labeledItems.learning_id);
+                this.$store.dispatch('updateTextId', labeledItems.learning_id);
+                this.fetchTextType(labeledItems.learning_id);
+            } else if (labeledItems.label.startsWith('중간평가')) {
+                this.fetchEvalData(labeledItems);
+            } else if (labeledItems.label.startsWith('최종평가')) {
+                this.fetchEvalData(labeledItems);
+            }
+        },
+        handleWordBookContent(item) {
+            console.log('처리할 단어장 콘텐츠 id: ', item);
+
+            // 단어장 ID 가져오기
+            axios
+                .post('/wordContent/selectWordContent.json', {
+                    wordContentId: item,
+                })
+                .then((response) => {
+                    this.wordContentList = response.data;
+
+                    this.$store.dispatch(
+                        'updateWdBookIdList',
+                        this.wordContentList.map((content) => content.wd_book_id)
+                    );
+                    this.$store.dispatch('updateCurrentWdBkIndex', 0);
+                    console.log('저장한 단어장 id 리스트: ', this.$store.getters.getWdBookIdList);
+
+                    // 단어장 ID 리스트에서 첫 번째 단어장 ID를 사용
+                    const wdBookId = this.wordContentList[0].wd_book_id;
+
+                    // 단어장 정보 가져오기
+                    return axios.post('/wordbook/find.json', {
+                        wdBookId: wdBookId,
+                    });
+                })
+                .then((response) => {
+                    const wordbookData = response.data;
+
+                    // 단어장 타입에 따라 페이지 설정
+                    if (wordbookData && wordbookData.wdBookTypeId) {
+                        switch (wordbookData.wdBookTypeId) {
+                            case '1':
+                                this.wordBookType = 'Chapter2';
+                                break;
+                            case '2':
+                                this.wordBookType = 'Chapter2_3';
+                                break;
+                            case '3':
+                                this.wordBookType = 'Chapter2_2';
+                                break;
+                            case '4':
+                                this.wordBookType = 'Chapter2_9';
+                                break;
+                            case '5':
+                                this.wordBookType = 'Chapter2_4';
+                                break;
+                            default:
+                                this.wordBookType = null;
+                        }
+                    } else {
+                        console.error('wdBookTypeId가 없습니다.');
+                        this.wordBookType = null;
+                    }
+
+                    console.log('현재 단어장 타입: ', this.wordBookType);
+                    this.goToPage(this.wordBookType);
+                })
+                .catch((error) => {
+                    console.error('단어장 정보를 불러오는 중 오류 발생:', error);
+                    this.wordBookType = null;
+                });
+        },
+        // 지문 type 불러오기
+        fetchTextType(text_id) {
+            axios({
+                url: '/text/selectOneText.json',
+                method: 'post',
+                headers: {
+                    'Content-Type': 'application/json; charset=UTF-8',
+                },
+                data: {
+                    textId: text_id,
+                },
+            })
+                .then((response) => {
+                    const text_type_id = response.data[0].text_type_id;
+                    // console.log("지문 유형 아이디 : ", text_type_id);
+                    if (text_type_id === '2') {
+                        this.goToPage('Chapter1_2');
+                    } else if (text_type_id === '3') {
+                        this.goToPage('Chapter1_3');
+                    }
+                })
+                .catch((err) => {
+                    console.log('지문 에러 : ', err);
+                });
+        },
+
+        // 평가 정보를 통해서 관련 문제 가져오기
+        fetchEvalData(evaldata) {
+            axios({
+                url: '/evalProblem/selectEvalProblem.json',
+                method: 'post',
+                headers: {
+                    'Content-Type': 'application/json; charset=UTF-8',
+                },
+                data: {
+                    evalId: evaldata.learning_id,
+                },
+            })
+                .then((response) => {
+                    const payload = {
+                        learning_id: response.data,
+                        label: evaldata.label,
+                        seqNum: evaldata.seqNum,
+                    };
+
+                    // Vuex 뮤테이션 호출
+                    this.$store.commit('setLearningData', payload);
+                    this.handleProblemDetail(response.data[0]);
+                    this.goToPage(this.problemType);
+                })
+                .catch((error) => {
+                    console.error('fetchData - error: ', error);
+                    return [];
+                });
+        },
+
+        handleProblemDetail(item) {
+            if (item.prblm_type_id === 'prblm_type_001') {
+                this.problemType = 'Chapter3';
+            } else if (item.prblm_type_id === 'prblm_type_002') {
+                this.problemType = 'Chapter3_1';
+            } else if (item.prblm_type_id === 'prblm_type_003') {
+                this.problemType = 'Chapter3_2';
+            } else if (item.prblm_type_id === 'prblm_type_004') {
+                this.problemType = 'Chapter3_3';
+            } else if (item.prblm_type_id === 'prblm_type_005') {
+                this.problemType = 'Chapter3_3_1';
+            } else if (item.prblm_type_id === 'prblm_type_006') {
+                console.log(item);
+                this.problemType = 'Chapter3_4';
+            } else if (item.prblm_type_id === 'prblm_type_007') {
+                this.problemType = 'Chapter3_5';
+            } else if (item.prblm_type_id === 'prblm_type_008') {
+                this.problemType = 'Chapter3_6';
+            } else if (item.prblm_type_id === 'prblm_type_009') {
+                this.problemType = 'Chapter3_7';
+            } else if (item.prblm_type_id === 'prblm_type_010') {
+                this.problemType = 'Chapter3_8';
+            } else if (item.prblm_type_id === 'prblm_type_011') {
+                this.problemType = 'Chapter3_9';
+            } else if (item.prblm_type_id === 'prblm_type_012') {
+                this.problemType = 'Chapter3_10';
+            } else if (item.prblm_type_id === 'prblm_type_013') {
+                this.problemType = 'Chapter3_11';
+            } else if (item.prblm_type_id === 'prblm_type_014') {
+                this.problemType = 'Chapter3_12';
+            } else if (item.prblm_type_id === 'prblm_type_015') {
+                this.problemType = 'Chapter3_13';
+            } else if (item.prblm_type_id === 'prblm_type_016') {
+                this.problemType = 'Chapter3_14';
+            } else if (item.prblm_type_id === 'prblm_type_017') {
+                this.problemType = 'Chapter3_15';
+            } else if (item.prblm_type_id === 'prblm_type_018') {
+                this.problemType = 'Chapter2_8';
+            } else if (item.prblm_type_id === 'prblm_type_019') {
+                this.problemType = 'Chapter2_7';
+            } else if (item.prblm_type_id === 'prblm_type_020') {
+                this.problemType = 'Chapter2_5';
+            } else if (item.prblm_type_id === 'prblm_type_021') {
+                this.problemType = 'Chapter2_6';
+            } else if (item.prblm_type_id === 'prblm_type_022') {
+                this.problemType = 'Chapter2_10';
+            } else if (item.prblm_type_id === 'prblm_type_023') {
+                this.problemType = 'Chapter2_11';
+            } else if (item.prblm_type_id === 'prblm_type_024') {
+                this.problemType = 'Chapter2_13';
+            }
+        },
+        openCameraModal() {
+            this.closeModal();
+
+            this.showCameraModal = true;
+            navigator.mediaDevices
+                .getUserMedia({ video: true })
+                .then((stream) => {
+                    const modalVideo = this.$refs.modalVideoElement;
+                    modalVideo.srcObject = stream;
+                    this.stream = stream;
+                })
+                .catch((error) => {
+                    console.log('error>>>>>>>>', error);
+                    alert('웹캠이 필요한 기능입니다!');
+                    this.closeModal(); // 모달창을 닫음
+                });
+        },
+        closeModal() {
+            this.searchOpen = false;
+            this.searchOpen2 = false;
+            this.showCameraModal = false;
+            this.photoTaken = false;
+            this.photo = null;
+
+            //스트림 종료
+            if (this.stream) {
+                let tracks = this.stream.getTracks();
+                tracks.forEach((track) => track.stop());
+                this.stream = null;
+            }
+        },
+
+        onVideoLoaded() {
+            const video = this.$refs.modalVideoElement;
+            const canvas = this.$refs.canvas;
+            const ctx = canvas.getContext('2d');
+
+            canvas.width = video.videoWidth;
+            canvas.height = video.videoHeight;
+        },
+        takePhoto() {
+            const video = this.$refs.modalVideoElement;
+            const canvas = this.$refs.canvas;
+            const ctx = canvas.getContext('2d');
+
+            ctx.save(); // 현재 상태 저장
+
+            // 캔버스 좌우 반전
+            ctx.scale(-1, 1);
+            ctx.drawImage(video, -canvas.width, 0, canvas.width, canvas.height);
+
+            ctx.restore();
+
+            const overlayImg = new Image();
+            overlayImg.src = 'client/resources/img/camera-rabbit.png';
+            overlayImg.onload = () => {
+                const overlayWidth = canvas.width * 0.4;
+                const overlayHeight = (overlayImg.height / overlayImg.width) * overlayWidth;
+                const overlayX = canvas.width - overlayWidth;
+                const overlayY = canvas.height - overlayHeight;
+
+                // 오버레이 이미지 그리기
+                ctx.drawImage(overlayImg, overlayX, overlayY, overlayWidth, overlayHeight);
+
+                // 사진 저장 함수 호출
+                const dataURL = canvas.toDataURL('image/png');
+                this.$router.push({
+                    name: 'PhotoEdit',
+                    query: {
+                        image: encodeURIComponent(dataURL),
+                        unit_id: this.unit_id,
+                        book_id: this.book_id,
+                    },
+                });
+            };
+        },
+
+        buttonSearch2() {
+            this.searchOpen2 = true;
+        },
+        closeBtn() {
+            this.searchOpen = false;
+        },
+
+        // 유저 아이디를 unit 아이디를 통해 가져오기
+        searchStdId() {
+            const userInfo = this.$store.getters.getUserInfo;
+            axios({
+                url: '/userclass/searchStdId.json',
+                method: 'post',
+                headers: {
+                    'Content-Type': 'application/json; charset=UTF-8',
+                },
+                data: {
+                    userId: userInfo.userId,
+                    unitId: this.unit_id,
+                },
+            })
+                .then((response) => {
+                    this.$store.commit('setStdId', response.data);
+                })
+                .catch((err) => {
+                    console.log('지문 에러 : ', err);
+                });
+        },
     },
-  },
-  beforeDestroy() {
-    // 컴포넌트가 파괴되기 전에 리스너 제거
-    window.removeEventListener("resize", this.updateCanvasRect);
-    this.$refs.canvas.removeEventListener("click", this.handleCanvasClick);
-  },
+    components: {
+        SvgIcon,
+    },
+    mounted() {
+        console.log('main mounted');
+        this.checkAndFetchData();
+        // const { book_id, unit_id } = this.$route.query;
+        console.log('>>>>>>>>>>>>>>>>>>>', this.$store.getters.currentDashboard);
+    },
+    watch: {
+        getBookId(newBookId) {
+            this.checkAndFetchData();
+        },
+        getUnitId(newUnitId) {
+            this.checkAndFetchData();
+        },
+    },
+    computed: {
+        ...mapGetters(['getBookId', 'getUnitId']),
+
+        processedRoadmap() {
+            let problemCounter = 0;
+            let wordCounter = 0;
+            let textCounter = 0;
+            let evalCounter = 0;
+
+            return this.roadmapData.map((item) => {
+                if (item.wd_cnt_id !== null) {
+                    wordCounter++;
+                    return {
+                        label: `단어장${wordCounter}`,
+                        learning_id: item.wd_cnt_id,
+                        seqNum: item.seq,
+                    };
+                } else if (item.text_id !== null) {
+                    textCounter++;
+                    return {
+                        label: `지문${textCounter}`,
+                        learning_id: item.text_id,
+                        seqNum: item.seq,
+                    };
+                } else if (item.eval_id !== null) {
+                    evalCounter++;
+                    return {
+                        label: evalCounter === 1 ? '중간평가' : '최종평가',
+                        learning_id: item.eval_id,
+                        seqNum: item.seq,
+                    };
+                } else {
+                    problemCounter++;
+                    return {
+                        label: `문제${problemCounter}`,
+                        learning_id: item.prblm_id,
+                        seqNum: item.seq,
+                    };
+                }
+            });
+        },
+    },
+    beforeDestroy() {
+        // 컴포넌트가 파괴되기 전에 리스너 제거
+        window.removeEventListener('resize', this.updateCanvasRect);
+        this.$refs.canvas.removeEventListener('click', this.handleCanvasClick);
+    },
 };
 </script>
 
 <style scoped>
 .complete-wrap img {
-  width: auto;
+    width: auto;
 }
 
 .body {
-  width: 1435px;
-  height: auto;
-  margin: 0 auto;
+    width: 1435px;
+    height: auto;
+    margin: 0 auto;
 }
 
 #container {
-  position: relative;
-  margin: auto;
-  border: 10px #333 solid;
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  z-index: 100;
+    position: relative;
+    margin: auto;
+    border: 10px #333 solid;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    z-index: 100;
 }
 
 video {
-  width: 100%;
-  height: auto;
-  background-color: #666;
+    width: 100%;
+    height: auto;
+    background-color: #666;
 }
 
 .mirrored {
-  transform: scaleX(-1);
+    transform: scaleX(-1);
 }
 
 .new-btn:disabled {
-  background-color: #fff3d7;
-  cursor: not-allowed;
+    background-color: #fff3d7;
+    cursor: not-allowed;
 }
 
 .sticker {
-  position: absolute;
-  cursor: move;
+    position: absolute;
+    cursor: move;
 }
 
 .sticker-handle {
-  width: 15px;
-  height: 15px;
-  background: rgba(255, 255, 255, 0.521);
-  position: absolute;
-  bottom: 0;
-  right: 0;
-  cursor: nwse-resize;
-  font-size: 13px;
-  font-weight: bolder;
-  color: rgb(63, 63, 63);
+    width: 15px;
+    height: 15px;
+    background: rgba(255, 255, 255, 0.521);
+    position: absolute;
+    bottom: 0;
+    right: 0;
+    cursor: nwse-resize;
+    font-size: 13px;
+    font-weight: bolder;
+    color: rgb(63, 63, 63);
 }
 
 .sticker-delete {
-  position: absolute;
-  top: 0;
-  right: 0;
-  background: rgba(255, 0, 0, 0.425);
-  color: white;
-  padding: 5px;
-  cursor: pointer;
+    position: absolute;
+    top: 0;
+    right: 0;
+    background: rgba(255, 0, 0, 0.425);
+    color: white;
+    padding: 5px;
+    cursor: pointer;
 }
 
 .toolbar {
-  display: flex;
-  justify-content: center;
-  margin-top: 10px;
+    display: flex;
+    justify-content: center;
+    margin-top: 10px;
 }
 
 .toolbar button {
-  margin: 5px;
-  padding: 5px 10px;
-  cursor: pointer;
+    margin: 5px;
+    padding: 5px 10px;
+    cursor: pointer;
 }
 
 .toolbar input {
-  margin: 5px;
+    margin: 5px;
 }
 
 .rabbit-end {
-  cursor: pointer;
-  display: block;
-  position: absolute;
-  bottom: 0px;
-  left: -15px;
-  z-index: 10000;
+    cursor: pointer;
+    display: block;
+    position: absolute;
+    bottom: 0px;
+    left: -15px;
+    z-index: 10000;
 }
 
 .rabbit-running {
-  position: absolute;
-  /* bottom: 40px; */
-  /* right: 110px; */
-  top: -118px;
-  z-index: 10000;
-  transform: scaleX(-1);
-  transition: all 0.5s ease-in-out;
+    position: absolute;
+    /* bottom: 40px; */
+    /* right: 110px; */
+    top: -118px;
+    z-index: 1;
+    transform: scaleX(-1);
+    transition: all 0.5s ease-in-out;
 }
 
 .fireworks-end {
-  position: absolute;
-  bottom: 70px;
-  left: -40px;
-  width: 20rem;
+    position: absolute;
+    bottom: 70px;
+    left: -40px;
+    width: 20rem;
 }
 
 .camera-rabbit {
-  position: absolute;
-  right: 0;
-  bottom: 0;
-  width: 40%;
+    position: absolute;
+    right: 0;
+    bottom: 0;
+    width: 40%;
 }
 
 .race-btn p.clear {
-  /* width: auto; */
-  font-size: 20px;
-  line-height: 1.6;
-  color: #333;
-  background-color: #f9f9f9;
-  padding: 6px;
-  border-radius: 8px;
-  /* box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); */
-  margin-bottom: 20px;
-  position: static;
-  display: flex;
-  align-items: center;
-  gap: 0.5rem;
+    /* width: auto; */
+    font-size: 20px;
+    line-height: 1.6;
+    color: #333;
+    background-color: #f9f9f9;
+    padding: 6px;
+    border-radius: 8px;
+    /* box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); */
+    margin-bottom: 20px;
+    position: static;
+    display: flex;
+    align-items: center;
+    gap: 0.5rem;
 }
 
 .race-btn p.before-clear {
-  /* width: auto; */
-  font-size: 20px;
-  line-height: 1.6;
-  color: #ffffff;
-  background-color: rgba(119, 119, 119, 0.815);
-  padding: 6px;
-  border-radius: 8px;
-  /* border: 1px solid rgba(255, 255, 255, 0.2); */
-  margin-bottom: 20px;
-  /* box-shadow: none; */
-  position: static;
+    /* width: auto; */
+    font-size: 20px;
+    line-height: 1.6;
+    color: #ffffff;
+    background-color: rgba(119, 119, 119, 0.815);
+    padding: 6px;
+    border-radius: 8px;
+    /* border: 1px solid rgba(255, 255, 255, 0.2); */
+    margin-bottom: 20px;
+    /* box-shadow: none; */
+    position: static;
 }
 
 .race-box .lcon {
-  display: flex;
-  align-items: center;
+    display: flex;
+    align-items: center;
 }
 
 .lcon .race-btn .rabbit-running {
-  transform: scaleX(1);
+    transform: scaleX(1);
 }
 
 .rabbit-start img {
-  transform: scaleX(-1);
+    transform: scaleX(-1);
 }
 
 .image-container {
-  position: relative;
-  display: inline-block;
+    position: relative;
+    display: inline-block;
 }
 
 .clear-img {
-  position: absolute;
-  top: -27px;
-  left: 0;
-  width: 100px;
-  height: 100px;
-  z-index: 1;
+    position: absolute;
+    top: -27px;
+    left: 0;
+    width: 100px;
+    height: 100px;
+    z-index: 1;
+}
+
+.popup-wrap {
+    z-index: 1;
 }
 </style>
client/views/pages/main/PhotoEdit.vue
--- client/views/pages/main/PhotoEdit.vue
+++ client/views/pages/main/PhotoEdit.vue
@@ -1,197 +1,203 @@
 <template>
-  <div class="content-wrap ">
-    <div class="flex justify-center">
-      <div>
-        <div class="frame title-box">
-          <div class="photo" style="height: 100%;">
-            <img :src="imageSrc" alt="" style="height: 100%;">
-          </div>
-          <p class="title mt20" style="color: #fff;">{{ today }} 1단원 완료!</p>
-        </div>
-        <div class="btn-wrap flex justify-center mt40" style="gap: 40px;">
-          <button class="login-btn" @click="recapture()">
-            <img src="../../../resources/img/btn07_s.png" alt="">
-            <p>다시 찍기</p>
-          </button>
+    <div class="content-wrap">
+        <div class="flex justify-center">
+            <div>
+                <div class="frame title-box">
+                    <div class="photo" style="height: 100%">
+                        <img :src="imageSrc" alt="" style="height: 100%" />
+                    </div>
+                    <p class="title mt20" style="color: #fff">{{ today }} 1단원 완료!</p>
+                </div>
+                <div class="btn-wrap flex justify-center mt40" style="gap: 40px">
+                    <button class="login-btn" @click="recapture()">
+                        <img src="../../../resources/img/btn07_s.png" alt="" />
+                        <p>다시 찍기</p>
+                    </button>
 
-          <button class="login-btn" type="submit" @click="insertPhoto()"><img src="../../../resources/img/btn07_s.png"
-              alt="">
-            <p>완료</p>
-          </button>
+                    <button class="login-btn" type="submit" @click="insertPhoto()">
+                        <img src="../../../resources/img/btn07_s.png" alt="" />
+                        <p>완료</p>
+                    </button>
+                </div>
+            </div>
         </div>
-      </div>
     </div>
-  </div>
 </template>
 
 <script>
 import axios from 'axios';
 
 export default {
-  data() {
-    return {
-      items: [
-        { imgSrc1: 'client/resources/img/btn20_75s_normal.png', imgSrc2: 'client/resources/img/btn20_75s_click.png', },
-        { imgSrc1: 'client/resources/img/btn21_75s_normal.png', imgSrc2: 'client/resources/img/btn21_75s_click.png', },
-      ],
-      timer: '00',
-      selectedIndex: 0,
+    data() {
+        return {
+            items: [
+                {
+                    imgSrc1: 'client/resources/img/btn20_75s_normal.png',
+                    imgSrc2: 'client/resources/img/btn20_75s_click.png',
+                },
+                {
+                    imgSrc1: 'client/resources/img/btn21_75s_normal.png',
+                    imgSrc2: 'client/resources/img/btn21_75s_click.png',
+                },
+            ],
+            timer: '00',
+            selectedIndex: 0,
 
-      imageSrc: '',
-      file: '',
-      fileId: '',
-      unit_id: '',
-      book_id: '',
-      today: '',
-    }
-  },
-  methods: {
-    recapture() {
-      this.$router.push({ name: 'Dashboard', query: { reCapture: 'true', unit_id: this.unit_id, book_id: this.book_id } });
+            imageSrc: '',
+            file: '',
+            fileId: '',
+            unit_id: '',
+            book_id: '',
+            today: '',
+        };
     },
-    async fetchImageAsFile(imageUrl, filename = "image.jpg") {
-      try {
-        const response = await fetch(imageUrl);
-        const blob = await response.blob();
+    methods: {
+        recapture() {
+            this.$router.push({
+                name: 'Dashboard',
+                query: { reCapture: 'true', unit_id: this.unit_id, book_id: this.book_id },
+            });
+        },
+        async fetchImageAsFile(imageUrl, filename = 'image.jpg') {
+            try {
+                const response = await fetch(imageUrl);
+                const blob = await response.blob();
 
-        const file = new File([blob], filename, { type: blob.type });
+                const file = new File([blob], filename, { type: blob.type });
 
-        return file;
-      } catch (error) {
-        console.error("이미지 변환 오류:", error);
-        throw new Error("이미지 변환에 실패했습니다.");
-      }
+                return file;
+            } catch (error) {
+                console.error('이미지 변환 오류:', error);
+                throw new Error('이미지 변환에 실패했습니다.');
+            }
+        },
+        async fetchPhoto() {
+            const image = this.$route.query.image;
+            if (image) {
+                this.imageSrc = decodeURIComponent(image);
+                try {
+                    this.file = await this.fetchImageAsFile(this.imageSrc, 'image.jpg');
+                } catch (error) {
+                    console.error('파일 변환 오류:', error);
+                }
+            }
+        },
+        async uploadFiles(file) {
+            if (!file) {
+                console.error('파일이 없습니다.');
+                throw new Error('파일이 없습니다.');
+            }
+            const formData = new FormData();
+            formData.append('files', file);
+
+            try {
+                const response = await axios.post('http://165.229.169.113:9080/file/upload.json', formData, {
+                    headers: {
+                        'Content-Type': 'multipart/form-data',
+                    },
+                });
+
+                return response.data.fileMngId; // 서버에서 반환된 파일 매니지 ID
+            } catch (error) {
+                console.error('파일 업로드 오류:', error);
+                throw new Error('파일 업로드에 실패했습니다.');
+            }
+        },
+        async insertPhoto() {
+            try {
+                this.fileId = await this.uploadFiles(this.file);
+
+                const response = await axios({
+                    url: '/photo/insertPhoto.json',
+                    method: 'post',
+                    headers: {
+                        'Content-Type': 'application/json; charset=UTF-8',
+                    },
+                    data: {
+                        photoMngId: 'PHOTO_MNG_000000000000001', // 사진첩아이디 교체
+                        likeData: '0',
+                        unitId: this.unit_id,
+                        stdId: '1', //학생아이디 교체
+                        fileMngId: this.fileId,
+                    },
+                });
+                this.$router.push({ name: 'Dashboard', query: { unit_id: this.unit_id, book_id: this.book_id } });
+            } catch (error) {
+                console.error('사진 삽입 오류:', error);
+            }
+        },
+        updateContent(index) {
+            this.selectedIndex = index;
+        },
+        goToPage(page) {
+            this.$router.push({ name: page });
+        },
     },
-    async fetchPhoto() {
-      const image = this.$route.query.image;
-      if (image) {
-        this.imageSrc = decodeURIComponent(image);
-        try {
-          this.file = await this.fetchImageAsFile(this.imageSrc, "image.jpg");
-        } catch (error) {
-          console.error("파일 변환 오류:", error);
-        }
-      }
-    }, async uploadFiles(file) {
-      if (!file) {
-        console.error("파일이 없습니다.");
-        throw new Error("파일이 없습니다.");
-      }
-      const formData = new FormData();
-      formData.append("files", file);
-
-      try {
-        const response = await axios.post("http://165.229.169.113:9080/file/upload.json", formData, {
-          headers: {
-            "Content-Type": "multipart/form-data",
-          },
-        });
-
-        return response.data.fileMngId; // 서버에서 반환된 파일 매니지 ID
-      } catch (error) {
-        console.error("파일 업로드 오류:", error);
-        throw new Error("파일 업로드에 실패했습니다.");
-      }
-    }, async insertPhoto() {
-      try {
-        this.fileId = await this.uploadFiles(this.file);
-
-        const response = await axios({
-          url: "/photo/insertPhoto.json",
-          method: "post",
-          headers: {
-            "Content-Type": "application/json; charset=UTF-8",
-          },
-          data: {
-            "photoMngId": "PHOTO_MNG_000000000000001", // 사진첩아이디 교체
-            "likeData": "0",
-            "unitId": this.unit_id,
-            "stdId": "1", //학생아이디 교체
-            "fileMngId": this.fileId
-          }
-        });
-        this.$router.push({ name: 'Dashboard', query: { unit_id: this.unit_id, book_id: this.book_id } });
-      } catch (error) {
-        console.error("사진 삽입 오류:", error);
-      }
+    watch: {},
+    computed: {},
+    created() {
+        const date = new Date();
+        const year = date.getFullYear();
+        const month = String(date.getMonth() + 1).padStart(2, '0'); // 월은 0부터 시작하므로 +1 필요
+        const day = String(date.getDate()).padStart(2, '0');
+        this.today = `${year}.${month}.${day}`;
     },
-    updateContent(index) {
-      this.selectedIndex = index;
+    components: {},
+    mounted() {
+        this.book_id = this.$route.query.book_id;
+        this.unit_id = this.$route.query.unit_id;
+        this.fetchPhoto();
     },
-    goToPage(page) {
-      this.$router.push({ name: page });
-    },
-  },
-  watch: {
-
-  },
-  computed: {
-
-  },
-  created() {
-    const date = new Date();
-    const year = date.getFullYear();
-    const month = String(date.getMonth() + 1).padStart(2, '0'); // 월은 0부터 시작하므로 +1 필요
-    const day = String(date.getDate()).padStart(2, '0');
-    this.today = `${year}.${month}.${day}`;
-  },
-  components: {
-  },
-  mounted() {
-    this.book_id = this.$route.query.book_id;
-    this.unit_id = this.$route.query.unit_id;
-    this.fetchPhoto();
-  }
-}
+};
 </script>
 <style scoped>
 .imgGroup {
-  width: fit-content;
+    width: fit-content;
 }
 
 .imgGroup button {
-  position: relative;
+    position: relative;
 }
 
 .imgGroup button p,
 .textbox p {
-  position: absolute;
-  top: 50%;
-  left: 50%;
-  transform: translate(-50%, -50%);
-  width: fit-content;
-  height: fit-content;
-  background: #ffffffb8;
-  border-radius: 5px;
-  padding: 10px;
-  font-size: 48px;
-  font-family: 'ONEMobilePOP';
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    transform: translate(-50%, -50%);
+    width: fit-content;
+    height: fit-content;
+    background: #ffffffb8;
+    border-radius: 5px;
+    padding: 10px;
+    font-size: 48px;
+    font-family: 'ONEMobilePOP';
 }
 
 .pickGroup button {
-  position: relative;
-  margin-right: 30px;
+    position: relative;
+    margin-right: 30px;
 }
 
 .pickGroup button p {
-  font-size: 34px;
-  color: #c6c6c6;
-  position: absolute;
-  top: 50%;
-  left: 50%;
-  transform: translate(-50%, -50%);
+    font-size: 34px;
+    color: #c6c6c6;
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    transform: translate(-50%, -50%);
 }
 
 .pickGroup article img {
-  object-fit: contain;
-  width: -webkit-fill-available;
+    object-fit: contain;
+    width: -webkit-fill-available;
 }
 
-.pickGroup article>div>p {
-  font-size: 64px;
+.pickGroup article > div > p {
+    font-size: 64px;
 }
 
 .popTxt {
-  width: 101px;
+    width: 101px;
 }
-</style>
(파일 끝에 줄바꿈 문자 없음)
+</style>
client/views/pages/main/PreviewNote.vue
--- client/views/pages/main/PreviewNote.vue
+++ client/views/pages/main/PreviewNote.vue
@@ -1,5 +1,6 @@
 <template>
     <div class="main myplan">
+        <!--         
         <div class="yellow-box mt30">
             <div class="title-box flex justify-between align-center">
                 <div class="flex justify-between align-center" style="gap: 20px;">
@@ -12,22 +13,25 @@
                 </div>
             </div>
         </div>
+         -->
         <div class="title-box flex justify-between mb20 mt30">
             <p class="title">오답노트</p>
         </div>
-        <div class="wrap" style="border-radius: 0;">
+        <div class="wrap" style="border-radius: 0">
             <div class="table-wrap">
                 <span class="flex align-center title2 gray mb20">
-                    이 단원에서 틀린 문제가 총 <p class="title1 black">&nbsp;{{ wrongAnswerNotes.length }}&nbsp;</p> 개 있습니다!
+                    이 단원에서 틀린 문제가 총
+                    <p class="title1 black">&nbsp;{{ wrongAnswerNotes.length }}&nbsp;</p>
+                    개 있습니다!
                 </span>
                 <table>
                     <colgroup>
-                        <col style="width: 10%;">
-                        <col style="width: 70%;">
-                        <col style="width: 15%;">
+                        <col style="width: 10%" />
+                        <col style="width: 70%" />
+                        <col style="width: 15%" />
                     </colgroup>
                     <tr v-for="note in wrongAnswerNotes" :key="note.prblmLogId">
-                        <td><img src="../../../resources/img/img214_19s.png" alt=""></td>
+                        <td><img src="../../../resources/img/img214_19s.png" alt="" /></td>
                         <td class="text-lf">
                             <p class="title1">{{ note.evalType || '(평가 유형 데이터 없음)' }}</p>
                             <p class="title2">{{ note.prblmExpln || '(기본 문제 설명 데이터 없음)' }}</p>
@@ -55,12 +59,12 @@
 export default {
     data() {
         return {
-            currentStdId: "1", // 임시 학생 아이디
-            currentUnitId: "1", // 임시 유닛 아이디
+            currentStdId: '1', // 임시 학생 아이디
+            currentUnitId: '1', // 임시 유닛 아이디
             wrongAnswerNotes: [], // 오답 노트 목록 데이터
             unitData: {}, // 단원 정보 데이터
             problemType: null, // 링크될 문제 유형 페이지 이름
-        }
+        };
     },
     methods: {
         pageSetting() {
@@ -78,75 +82,71 @@
 
         // 단원 정보를 불러오는 API 호출
         fetchUnitDetail() {
-            axios.post('/unit/unitDetail.json', {
-                unitId: this.currentUnitId
-            })
-            .then(response => {
-                console.log(response.data[0]);
-                if (response.data.length > 0) {
-                    this.unitData = response.data[0];
-                }
-            })
-            .catch(error => {
-                console.error('단원 정보를 불러오는 중 오류 발생:', error);
-            })
+            axios
+                .post('/unit/unitDetail.json', {
+                    unitId: this.currentUnitId,
+                })
+                .then((response) => {
+                    console.log(response.data[0]);
+                    if (response.data.length > 0) {
+                        this.unitData = response.data[0];
+                    }
+                })
+                .catch((error) => {
+                    console.error('단원 정보를 불러오는 중 오류 발생:', error);
+                });
         },
 
         // 오답노트 목록을 가져오는 API 호출
         fetchWrongAnswerNotes() {
-            axios.post('/problemLog/getPreviewNoteList.json', {
-                stdId: this.currentStdId,
-                unitId: this.currentUnitId
-            })
-            .then(response => {
-                console.log(response.data);
-                this.wrongAnswerNotes = response.data;
-            })
-            .catch(error => {
-                console.error('오답노트를 불러오는 중 오류 발생:', error);
-            });
+            axios
+                .post('/problemLog/getPreviewNoteList.json', {
+                    stdId: this.currentStdId,
+                    unitId: this.currentUnitId,
+                })
+                .then((response) => {
+                    console.log(response.data);
+                    this.wrongAnswerNotes = response.data;
+                })
+                .catch((error) => {
+                    console.error('오답노트를 불러오는 중 오류 발생:', error);
+                });
         },
 
         // 문제 유형에 따른 라우팅 메서드
         handleProblemDetail(item) {
             // 세션 저장소에 문제 ID 저장
-            sessionStorage.setItem("prblmId", JSON.stringify(item.prblmId));
-            if (item.prblmTypeId === "11") {
-                this.problemType = "Chapter3_9";
-            } else if (item.prblmTypeId === "12") {
-                this.problemType = "Chapter3_4";
-            } else if (item.prblmTypeId === "4") {
-                this.problemType = "Chapter3_3";
-            } else if (item.prblmTypeId === "3") {
-                this.problemType = "Chapter3_7";
-            } else if (item.prblmTypeId === "10") {
-                this.problemType = "Chapter3_2";
-            } else if (item.prblmTypeId === "14") {
-                this.problemType = "Chapter3_12";
+            sessionStorage.setItem('prblmId', JSON.stringify(item.prblmId));
+            if (item.prblmTypeId === '11') {
+                this.problemType = 'Chapter3_9';
+            } else if (item.prblmTypeId === '12') {
+                this.problemType = 'Chapter3_4';
+            } else if (item.prblmTypeId === '4') {
+                this.problemType = 'Chapter3_3';
+            } else if (item.prblmTypeId === '3') {
+                this.problemType = 'Chapter3_7';
+            } else if (item.prblmTypeId === '10') {
+                this.problemType = 'Chapter3_2';
+            } else if (item.prblmTypeId === '14') {
+                this.problemType = 'Chapter3_12';
             } else {
-                this.problemType = "Chapter3";
+                this.problemType = 'Chapter3';
             }
         },
 
         goToPage(page) {
             this.$router.push({ name: page });
-        }
-
+        },
     },
-    watch: {
-
-    },
-    computed: {
-
-    },
-    components: {
-    },
+    watch: {},
+    computed: {},
+    components: {},
     mounted() {
         console.log('PreviewNote mounted');
         this.pageSetting();
         this.fetchUnitDetail();
-    }
-}
+    },
+};
 </script>
 <style scoped>
 .textbox {
@@ -170,4 +170,4 @@
 .dragGroup button p {
     font-size: 48px;
 }
-</style>
(파일 끝에 줄바꿈 문자 없음)
+</style>
client/views/pages/parents/CategoryBarChart.vue
--- client/views/pages/parents/CategoryBarChart.vue
+++ client/views/pages/parents/CategoryBarChart.vue
@@ -1,124 +1,143 @@
 <template>
-    <div ref="CategoryBarChart" style="width: 500px; height: 500px;"></div>
-  </template>
-  
-  <script>
-  import * as am5 from "@amcharts/amcharts5";
-  import * as am5xy from "@amcharts/amcharts5/xy";
-  import am5themes_Animated from "@amcharts/amcharts5/themes/Animated";
-  import axios from "axios";
-  
-  export default {
-    name: "CategoryBarChart",
-  
-    data() {
-      return {
-        chartData: [],
-        currentStdId: "1"
-      };
-    },
-  
-    mounted() {
-      this.getCategoryScoreData();
-    },
-  
-    methods: {
-      // 카테고리별 점수 데이터 가져오기
-      getCategoryScoreData() {
-        const vm = this;
-        axios.post('/dashboard/categoryScoreData.json', {
-            std_id: vm.currentStdId
-        })
-        .then(response => {
-            vm.chartData = response.data.map(item => ({
-                ...item,
-                combinedCategory: `${item.categoryNm}\n(${item.categoryCls})`
-            }));
-            vm.createChart();
-        })
-        .catch(error => {
-            console.error('카테고리 점수 데이터를 가져오는 중 오류 발생:', error);
-        })
-      },
-  
-      createChart() {
-        // Initialize root
-        const root = am5.Root.new(this.$refs.CategoryBarChart);
-  
-        // Apply themes
-        root.setThemes([
-          am5themes_Animated.new(root)
-        ]);
-  
-        // Create chart
-        const chart = root.container.children.push(am5xy.XYChart.new(root, {
-          panX: false,
-          panY: false,
-          wheelX: "panX",
-          wheelY: "zoomX",
-          layout: root.verticalLayout
-        }));
-  
-        // Create axes
-        const yAxis = chart.yAxes.push(am5xy.ValueAxis.new(root, {
-          renderer: am5xy.AxisRendererY.new(root, {}),
-          min: 0
-        }));
-  
-        const xAxis = chart.xAxes.push(am5xy.CategoryAxis.new(root, {
-          categoryField: "combinedCategory",
-          renderer: am5xy.AxisRendererX.new(root, {}),
-          tooltip: am5.Tooltip.new(root, { themeTags: ["axis"] })
-        }));
-  
-        xAxis.get("renderer").labels.template.setAll({
-            textAlign: "center",
-            centerX: am5.p50
-        });
+    <div ref="CategoryBarChart" class="chart-container"></div>
+</template>
 
-        xAxis.data.setAll(this.chartData);
-  
-        // Create series
-        const series = chart.series.push(am5xy.ColumnSeries.new(root, {
-          name: "Category Scores",
-          xAxis: xAxis,
-          yAxis: yAxis,
-          valueYField: "totalScore",
-          categoryXField: "combinedCategory",
-          tooltip: am5.Tooltip.new(root, {
-            labelText: "{categoryX}: {valueY}"
-          })
-        }));
-  
-        // Set color manually for each bar (simplified for clarity)
-        series.columns.template.setAll({
-          fill: am5.color("#67b7dc"),
-          stroke: am5.color("#67b7dc"),
-          fillOpacity: 0.8, // Adjust opacity if needed
-          strokeWidth: 0,
-          cornerRadiusTL: 5,
-          cornerRadiusTR: 5
-        });
-  
-        // Assign data
-        series.data.setAll(this.chartData);
-  
-        // Add legend
-        chart.children.push(am5.Legend.new(root, {
-          centerX: am5.p50,
-          x: am5.p50,
-          marginTop: 15,
-          marginBottom: 15
-        }));
-  
-        // Play initial series animation
-        series.appear(1000, 100);
-      }
-    }
-  };
-  </script>
-  
-  <style scoped>
-  /* 스타일은 필요에 따라 추가 */
-  </style>
-  
(파일 끝에 줄바꿈 문자 없음)
+<script>
+import * as am5 from '@amcharts/amcharts5';
+import * as am5xy from '@amcharts/amcharts5/xy';
+import am5themes_Animated from '@amcharts/amcharts5/themes/Animated';
+import axios from 'axios';
+
+export default {
+    name: 'CategoryBarChart',
+
+    data() {
+        return {
+            chartData: [],
+            currentStdId: '1',
+        };
+    },
+
+    mounted() {
+        this.getCategoryScoreData();
+    },
+
+    methods: {
+        // 카테고리별 점수 데이터 가져오기
+        getCategoryScoreData() {
+            const vm = this;
+            axios
+                .post('/dashboard/categoryScoreData.json', {
+                    std_id: vm.currentStdId,
+                })
+                .then((response) => {
+                    vm.chartData = response.data.map((item) => ({
+                        ...item,
+                        combinedCategory: `${item.categoryNm}\n(${item.categoryCls})`,
+                    }));
+                    vm.createChart();
+                })
+                .catch((error) => {
+                    console.error('카테고리 점수 데이터를 가져오는 중 오류 발생:', error);
+                });
+        },
+
+        createChart() {
+            // Initialize root
+            const root = am5.Root.new(this.$refs.CategoryBarChart);
+
+            // Apply themes
+            root.setThemes([am5themes_Animated.new(root)]);
+
+            // Create chart
+            const chart = root.container.children.push(
+                am5xy.XYChart.new(root, {
+                    panX: false,
+                    panY: false,
+                    wheelX: 'panX',
+                    wheelY: 'zoomX',
+                    layout: root.verticalLayout,
+                })
+            );
+
+            // Create axes
+            const yAxis = chart.yAxes.push(
+                am5xy.ValueAxis.new(root, {
+                    renderer: am5xy.AxisRendererY.new(root, {}),
+                    min: 0,
+                })
+            );
+
+            const xAxis = chart.xAxes.push(
+                am5xy.CategoryAxis.new(root, {
+                    categoryField: 'combinedCategory',
+                    renderer: am5xy.AxisRendererX.new(root, {}),
+                    tooltip: am5.Tooltip.new(root, { themeTags: ['axis'] }),
+                })
+            );
+
+            xAxis.get('renderer').labels.template.setAll({
+                textAlign: 'center',
+                centerX: am5.p50,
+            });
+
+            xAxis.data.setAll(this.chartData);
+
+            // Create series
+            const series = chart.series.push(
+                am5xy.ColumnSeries.new(root, {
+                    name: 'Category Scores',
+                    xAxis: xAxis,
+                    yAxis: yAxis,
+                    valueYField: 'totalScore',
+                    categoryXField: 'combinedCategory',
+                    tooltip: am5.Tooltip.new(root, {
+                        labelText: '{categoryX}: {valueY}',
+                    }),
+                })
+            );
+
+            // Set color manually for each bar (simplified for clarity)
+            series.columns.template.setAll({
+                fill: am5.color('#67b7dc'),
+                stroke: am5.color('#67b7dc'),
+                fillOpacity: 0.8, // Adjust opacity if needed
+                strokeWidth: 0,
+                cornerRadiusTL: 5,
+                cornerRadiusTR: 5,
+            });
+
+            // Assign data
+            series.data.setAll(this.chartData);
+
+            // Add legend
+            chart.children.push(
+                am5.Legend.new(root, {
+                    centerX: am5.p50,
+                    x: am5.p50,
+                    marginTop: 15,
+                    marginBottom: 15,
+                })
+            );
+
+            // Play initial series animation
+            series.appear(1000, 100);
+        },
+    },
+};
+</script>
+
+<style scoped>
+/* 스타일은 필요에 따라 추가 */
+.chart-container {
+    display: block;
+    position: absolute;
+    bottom: 30px;
+    right: 5px;
+    width: 100%;
+    height: 100%;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+}
+</style>
client/views/pages/parents/ColumnLineChart.vue
--- client/views/pages/parents/ColumnLineChart.vue
+++ client/views/pages/parents/ColumnLineChart.vue
@@ -1,237 +1,239 @@
 <template>
-  <div ref="ColumnLineChart" style="width: 500px; height: 500px;"></div>
+    <div class="columnChart" ref="ColumnLineChart"></div>
 </template>
 
 <script>
-import * as am5 from "@amcharts/amcharts5";
-import * as am5xy from "@amcharts/amcharts5/xy";
-import am5themes_Animated from "@amcharts/amcharts5/themes/Animated";
-import axios from "axios";
+import * as am5 from '@amcharts/amcharts5';
+import * as am5xy from '@amcharts/amcharts5/xy';
+import am5themes_Animated from '@amcharts/amcharts5/themes/Animated';
+import axios from 'axios';
 
 export default {
-  name: "ColumnLineChart",
+    name: 'ColumnLineChart',
 
-  data() {
-    return {
-      chartData: [],
-      currentStdId: "1"
-    };
-  },
-
-  mounted() {
-    this.getMtrScoreData();
-  },
-
-  methods: {
-    // 학생의 문제 지표 점수 데이터 가져오기
-    getMtrScoreData() {
-      const vm = this;
-      axios.post('/dashboard/mtrScoreData.json', {
-          std_id: vm.currentStdId
-      })
-      .then(response => {
-        if (response.data) {
-          // 데이터를 날짜순으로 정렬
-          vm.chartData = response.data.sort(
-            (a, b) => new Date(a.learnedDate) - new Date(b.learnedDate)
-          );
-          vm.createChart();
-        } else {
-          console.error("mtrScoreList가 응답 데이터에 없습니다.");
-        }
-      })
-      .catch(error => {
-          console.error('문제 지표 점수 데이터를 가져오는 중 오류 발생:', error);
-      });
+    data() {
+        return {
+            chartData: [],
+            currentStdId: '1',
+        };
     },
 
-    createChart() {
-      // Initialize root
-      const root = am5.Root.new(this.$refs.ColumnLineChart);
-
-      // Apply themes
-      root.setThemes([
-        am5themes_Animated.new(root),
-      ]);
-
-      // Create chart
-      const chart = root.container.children.push(
-        am5xy.XYChart.new(root, {
-          panX: false,
-          panY: false,
-          wheelX: "panX",
-          wheelY: "zoomX",
-          paddingLeft: 0,
-          layout: root.verticalLayout
-        })
-      );
-
-      // Create axes
-      const xRenderer = am5xy.AxisRendererX.new(root, {
-        minorGridEnabled: true,
-        minGridDistance: 60
-      });
-
-      const xAxis = chart.xAxes.push(
-        am5xy.CategoryAxis.new(root, {
-          categoryField: "learnedDate",
-          renderer: xRenderer,
-          tooltip: am5.Tooltip.new(root, {})
-        })
-      );
-
-      xRenderer.grid.template.setAll({
-        location: 1
-      });
-
-      xAxis.data.setAll(this.chartData);
-
-      let yAxis = chart.yAxes.push(
-        am5xy.ValueAxis.new(root, {
-          min: 0,
-          extraMax: 0.1,
-          renderer: am5xy.AxisRendererY.new(root, {
-            strokeOpacity: 0.1
-          })
-        })
-      );
-
-      // 이해 점수 막대 그래프
-      let series1 = chart.series.push(
-        am5xy.ColumnSeries.new(root, {
-          name: "이해 점수",
-          xAxis: xAxis,
-          yAxis: yAxis,
-          valueYField: "totalMtr01Score",
-          categoryXField: "learnedDate",
-          tooltip: am5.Tooltip.new(root, {
-            pointerOrientation: "horizontal",
-            labelText: "{name} in {categoryX}: {valueY}"
-          })
-        })
-      );
-
-      // 파스텔 블루
-      series1.columns.template.setAll({
-        fill: am5.color(0x87CEEB),
-        stroke: am5.color(0x87CEEB),
-        tooltipY: am5.percent(10),
-      });
-
-      series1.data.setAll(this.chartData);
-
-      // 표현 점수 막대 그래프
-      let series2 = chart.series.push(
-        am5xy.ColumnSeries.new(root, {
-          name: "표현 점수",
-          xAxis: xAxis,
-          yAxis: yAxis,
-          valueYField: "totalMtr02Score",
-          categoryXField: "learnedDate",
-          tooltip: am5.Tooltip.new(root, {
-            pointerOrientation: "horizontal",
-            labelText: "{name} in {categoryX}: {valueY}"
-          })
-        })
-      );
-
-      // 파스텔 핑크
-      series2.columns.template.setAll({
-        fill: am5.color(0xFFB6C1),
-        stroke: am5.color(0xFFB6C1),
-        tooltipY: am5.percent(10),
-      });
-
-      series2.data.setAll(this.chartData);
-
-      // 이해 점수 변화 꺾은선 그래프
-      const lineSeries1 = chart.series.push(
-        am5xy.LineSeries.new(root, {
-          name: "이해 점수 변화",
-          xAxis: xAxis,
-          yAxis: yAxis,
-          valueYField: "totalMtr01Score",
-          categoryXField: "learnedDate",
-          stroke: am5.color(0xADD8E6), // 라이트 블루로 설정
-          tooltip: am5.Tooltip.new(root, {
-            pointerOrientation: "horizontal",
-            labelText: "{name} on {categoryX}: {valueY}"
-          })
-        })
-      );
-
-      lineSeries1.strokes.template.setAll({
-        strokeWidth: 3,
-        stroke: am5.color(0xADD8E6), // 다시 명시적 설정
-      });
-
-      lineSeries1.bullets.push(function () {
-        return am5.Bullet.new(root, {
-          sprite: am5.Circle.new(root, {
-            radius: 5,
-            fill: am5.color(0xADD8E6), // 라이트 블루로 설정
-            strokeWidth: 3,
-            stroke: am5.color(0xADD8E6)
-          })
-        });
-      });
-
-      lineSeries1.data.setAll(this.chartData);
-
-      // 표현 점수 변화 꺾은선 그래프
-      const lineSeries2 = chart.series.push(
-        am5xy.LineSeries.new(root, {
-          name: "표현 점수 변화",
-          xAxis: xAxis,
-          yAxis: yAxis,
-          valueYField: "totalMtr02Score",
-          categoryXField: "learnedDate",
-          stroke: am5.color(0xFF69B4), // 핫 핑크로 설정
-          tooltip: am5.Tooltip.new(root, {
-            pointerOrientation: "horizontal",
-            labelText: "{name} on {categoryX}: {valueY}"
-          })
-        })
-      );
-
-      lineSeries2.strokes.template.setAll({
-        strokeWidth: 3,
-        stroke: am5.color(0xFF69B4), // 다시 명시적 설정
-      });
-
-      lineSeries2.bullets.push(function () {
-        return am5.Bullet.new(root, {
-          sprite: am5.Circle.new(root, {
-            radius: 5,
-            fill: am5.color(0xFF69B4), // 핫 핑크로 설정
-            strokeWidth: 3,
-            stroke: am5.color(0xFF69B4)
-          })
-        });
-      });
-
-      lineSeries2.data.setAll(this.chartData);
-
-      chart.set("cursor", am5xy.XYCursor.new(root, {}));
-
-      let legend = chart.children.push(
-        am5.Legend.new(root, {
-          centerX: am5.p50,
-          x: am5.p50
-        })
-      );
-      legend.data.setAll(chart.series.values);
-
-      chart.appear(1000, 100);
-      series1.appear();
-      series2.appear();
-      lineSeries1.appear();
-      lineSeries2.appear();
+    mounted() {
+        this.getMtrScoreData();
     },
-  },
+
+    methods: {
+        // 학생의 문제 지표 점수 데이터 가져오기
+        getMtrScoreData() {
+            const vm = this;
+            axios
+                .post('/dashboard/mtrScoreData.json', {
+                    std_id: vm.currentStdId,
+                })
+                .then((response) => {
+                    if (response.data) {
+                        // 데이터를 날짜순으로 정렬
+                        vm.chartData = response.data.sort((a, b) => new Date(a.learnedDate) - new Date(b.learnedDate));
+                        vm.createChart();
+                    } else {
+                        console.error('mtrScoreList가 응답 데이터에 없습니다.');
+                    }
+                })
+                .catch((error) => {
+                    console.error('문제 지표 점수 데이터를 가져오는 중 오류 발생:', error);
+                });
+        },
+
+        createChart() {
+            // Initialize root
+            const root = am5.Root.new(this.$refs.ColumnLineChart);
+
+            // Apply themes
+            root.setThemes([am5themes_Animated.new(root)]);
+
+            // Create chart
+            const chart = root.container.children.push(
+                am5xy.XYChart.new(root, {
+                    panX: false,
+                    panY: false,
+                    wheelX: 'panX',
+                    wheelY: 'zoomX',
+                    paddingLeft: 0,
+                    layout: root.verticalLayout,
+                })
+            );
+
+            // Create axes
+            const xRenderer = am5xy.AxisRendererX.new(root, {
+                minorGridEnabled: true,
+                minGridDistance: 60,
+            });
+
+            const xAxis = chart.xAxes.push(
+                am5xy.CategoryAxis.new(root, {
+                    categoryField: 'learnedDate',
+                    renderer: xRenderer,
+                    tooltip: am5.Tooltip.new(root, {}),
+                })
+            );
+
+            xRenderer.grid.template.setAll({
+                location: 1,
+            });
+
+            xAxis.data.setAll(this.chartData);
+
+            let yAxis = chart.yAxes.push(
+                am5xy.ValueAxis.new(root, {
+                    min: 0,
+                    extraMax: 0.1,
+                    renderer: am5xy.AxisRendererY.new(root, {
+                        strokeOpacity: 0.1,
+                    }),
+                })
+            );
+
+            // 이해 점수 막대 그래프
+            let series1 = chart.series.push(
+                am5xy.ColumnSeries.new(root, {
+                    name: '이해 점수',
+                    xAxis: xAxis,
+                    yAxis: yAxis,
+                    valueYField: 'totalMtr01Score',
+                    categoryXField: 'learnedDate',
+                    tooltip: am5.Tooltip.new(root, {
+                        pointerOrientation: 'horizontal',
+                        labelText: '{name} in {categoryX}: {valueY}',
+                    }),
+                })
+            );
+
+            // 파스텔 블루
+            series1.columns.template.setAll({
+                fill: am5.color(0x87ceeb),
+                stroke: am5.color(0x87ceeb),
+                tooltipY: am5.percent(10),
+            });
+
+            series1.data.setAll(this.chartData);
+
+            // 표현 점수 막대 그래프
+            let series2 = chart.series.push(
+                am5xy.ColumnSeries.new(root, {
+                    name: '표현 점수',
+                    xAxis: xAxis,
+                    yAxis: yAxis,
+                    valueYField: 'totalMtr02Score',
+                    categoryXField: 'learnedDate',
+                    tooltip: am5.Tooltip.new(root, {
+                        pointerOrientation: 'horizontal',
+                        labelText: '{name} in {categoryX}: {valueY}',
+                    }),
+                })
+            );
+
+            // 파스텔 핑크
+            series2.columns.template.setAll({
+                fill: am5.color(0xffb6c1),
+                stroke: am5.color(0xffb6c1),
+                tooltipY: am5.percent(10),
+            });
+
+            series2.data.setAll(this.chartData);
+
+            // 이해 점수 변화 꺾은선 그래프
+            const lineSeries1 = chart.series.push(
+                am5xy.LineSeries.new(root, {
+                    name: '이해 점수 변화',
+                    xAxis: xAxis,
+                    yAxis: yAxis,
+                    valueYField: 'totalMtr01Score',
+                    categoryXField: 'learnedDate',
+                    stroke: am5.color(0xadd8e6), // 라이트 블루로 설정
+                    tooltip: am5.Tooltip.new(root, {
+                        pointerOrientation: 'horizontal',
+                        labelText: '{name} on {categoryX}: {valueY}',
+                    }),
+                })
+            );
+
+            lineSeries1.strokes.template.setAll({
+                strokeWidth: 3,
+                stroke: am5.color(0xadd8e6), // 다시 명시적 설정
+            });
+
+            lineSeries1.bullets.push(function () {
+                return am5.Bullet.new(root, {
+                    sprite: am5.Circle.new(root, {
+                        radius: 5,
+                        fill: am5.color(0xadd8e6), // 라이트 블루로 설정
+                        strokeWidth: 3,
+                        stroke: am5.color(0xadd8e6),
+                    }),
+                });
+            });
+
+            lineSeries1.data.setAll(this.chartData);
+
+            // 표현 점수 변화 꺾은선 그래프
+            const lineSeries2 = chart.series.push(
+                am5xy.LineSeries.new(root, {
+                    name: '표현 점수 변화',
+                    xAxis: xAxis,
+                    yAxis: yAxis,
+                    valueYField: 'totalMtr02Score',
+                    categoryXField: 'learnedDate',
+                    stroke: am5.color(0xff69b4), // 핫 핑크로 설정
+                    tooltip: am5.Tooltip.new(root, {
+                        pointerOrientation: 'horizontal',
+                        labelText: '{name} on {categoryX}: {valueY}',
+                    }),
+                })
+            );
+
+            lineSeries2.strokes.template.setAll({
+                strokeWidth: 3,
+                stroke: am5.color(0xff69b4), // 다시 명시적 설정
+            });
+
+            lineSeries2.bullets.push(function () {
+                return am5.Bullet.new(root, {
+                    sprite: am5.Circle.new(root, {
+                        radius: 5,
+                        fill: am5.color(0xff69b4), // 핫 핑크로 설정
+                        strokeWidth: 3,
+                        stroke: am5.color(0xff69b4),
+                    }),
+                });
+            });
+
+            lineSeries2.data.setAll(this.chartData);
+
+            chart.set('cursor', am5xy.XYCursor.new(root, {}));
+
+            let legend = chart.children.push(
+                am5.Legend.new(root, {
+                    centerX: am5.p50,
+                    x: am5.p50,
+                })
+            );
+            legend.data.setAll(chart.series.values);
+
+            chart.appear(1000, 100);
+            series1.appear();
+            series2.appear();
+            lineSeries1.appear();
+            lineSeries2.appear();
+        },
+    },
 };
 </script>
 
 <style scoped>
 /* Add necessary styles here */
+.columnChart {
+    width: 40rem;
+    height: 40rem;
+    /* margin-left: -10rem;*/
+}
 </style>
client/views/pages/parents/Main_p.vue
--- client/views/pages/parents/Main_p.vue
+++ client/views/pages/parents/Main_p.vue
@@ -142,7 +142,7 @@
                         </div>
                         <div class="wrap" style="flex: 1">
                             <p class="name">이해/표현 점수</p>
-                            <div class="flex justify-center mt50">
+                            <div class="flex justify-center mt50" style="position: absolute">
                                 <ColumnLineChart />
                             </div>
                         </div>
@@ -199,9 +199,12 @@
                                 </div>
                             </div>
 
-                            <div class="wrap">
+                            <div class="wrap" style="height: 65rem">
                                 <p class="name">문제 카테고리별 세부 점수</p>
-                                <div class="flex justify-center">
+                                <div
+                                    class="flex justify-center mt50"
+                                    style="position: relative; width: 45rem; height: 40rem"
+                                >
                                     <CategoryBarChart />
                                 </div>
                             </div>
client/views/pages/teacher/Main_t.vue
--- client/views/pages/teacher/Main_t.vue
+++ client/views/pages/teacher/Main_t.vue
@@ -1,14 +1,18 @@
 <template>
-    <div class="flex justify-between" style="height: 100%;">
-       <Side_t></Side_t>
-       <div style="padding: 15px 60px 120px 0px ">
+    <div>
         <Header_t></Header_t>
-          <div class="main-wrap">
-              <router-view />
-          </div>
-       </div>
-    </div>
+        <div class="flex justify-between" style="height: 100%">
+            <div>
+                <Side_t></Side_t>
+            </div>
 
+            <div style="padding: 15px 60px 120px 0px">
+                <div class="main-wrap">
+                    <router-view />
+                </div>
+            </div>
+        </div>
+    </div>
 </template>
 
 <script>
@@ -17,35 +21,28 @@
 import Side_t from '../../layout/Side_t.vue';
 
 export default {
-  data() {
-      return {
-      }
-  },
-  methods: {
-     
-  },
-  watch: {
-
-  },
-  computed: {
-
-  },
-  components: {
-      Header_t: Header_t,
-    Menu: Menu,
-    // Footer:Footer,
-    Side_t:Side_t,
-  },
-  mounted() {
-      console.log('main mounted');
-  }
-}
+    data() {
+        return {};
+    },
+    methods: {},
+    watch: {},
+    computed: {},
+    components: {
+        Header_t: Header_t,
+        Menu: Menu,
+        // Footer:Footer,
+        Side_t: Side_t,
+    },
+    mounted() {
+        console.log('main mounted');
+    },
+};
 </script>
 <style scoped>
-.main-wrap{
-  margin-top: 20px;
-  position: static;
-  width: 144rem;
-  height: 100%;
+.main-wrap {
+    margin-top: 20px;
+    position: static;
+    width: 144rem;
+    height: 100%;
 }
-</style>
(파일 끝에 줄바꿈 문자 없음)
+</style>
client/views/pages/teacher/QuestionInsert.vue
--- client/views/pages/teacher/QuestionInsert.vue
+++ client/views/pages/teacher/QuestionInsert.vue
@@ -26,7 +26,7 @@
         </div>
         <hr>
         -->
-            <div class="gd-col2 ">
+            <div class="gd-col2">
                 <div class="flex align-center mb20">
                     <label for="" class="title2">카테고리</label>
                     <select v-model="selectedSearchOption" class="mr10 data-wrap">
@@ -44,7 +44,6 @@
                             {{ prblmT.prblm_type_nm }}
                         </option>
                     </select>
-
                 </div>
 
                 <div class="flex align-center">
@@ -72,7 +71,7 @@
             </div>
             <div class="flex align-center mb20 mt40">
                 <label for="" class="title2">문제 배점</label>
-                <input type="text" class="data-wrap" v-model="prblm_scr">
+                <input type="text" class="data-wrap" v-model="prblm_scr" />
             </div>
 
             <div class="flex align-center mb20">
@@ -81,26 +80,35 @@
             </div>
             <div class="flex align-center mb20">
                 <label for="" class="title2">힌트</label>
-                <input type="text" class="data-wrap" v-model="prblm_hint">
+                <input type="text" class="data-wrap" v-model="prblm_hint" />
             </div>
-            <div class="flex align-center ">
+            <div class="flex align-center">
                 <label for="file" class="title2">첨부파일</label>
                 <input type="file" ref="fileInput" @change="handleFileUpload" multiple />
             </div>
-            <hr>
+            <hr />
             <div v-if="selectedSearchOption2.prblm_type_cls === '5지선다'">
                 <!--5지선다-->
-                <div class="gd-col2 " v-for="i in 5" :key="i">
+                <div class="gd-col2" v-for="i in 5" :key="i">
                     <div>
                         <div class="flex align-center mb20 mr40">
                             <label :for="'answer' + i" class="title2">답{{ i }}</label>
-                            <input :id="'answer' + i" type="text" class="data-wrap"
-                                v-model="prblmDetail.answers[i].text" />
+                            <input
+                                :id="'answer' + i"
+                                type="text"
+                                class="data-wrap"
+                                v-model="prblmDetail.answers[i].text"
+                            />
                         </div>
                         <div class="flex align-center mb20">
                             <label :for="'correct' + i" class="title2">정답여부</label>
-                            <input :id="'correct' + i" type="checkbox" class="ui-checkbox"
-                                :checked="prblmDetail.correctIndex === i" @change="setCorrectAnswer(i)" />
+                            <input
+                                :id="'correct' + i"
+                                type="checkbox"
+                                class="ui-checkbox"
+                                :checked="prblmDetail.correctIndex === i"
+                                @change="setCorrectAnswer(i)"
+                            />
                         </div>
                     </div>
                     <div class="flex align-center mb20">
@@ -108,74 +116,95 @@
                         <input type="file" :ref="'fileInput' + i" @change="handleDetailFileUpload(i)" multiple />
                     </div>
                 </div>
-
             </div>
             <div v-else-if="selectedSearchOption2.prblm_type_cls === '4지선다'">
                 <!--4지선다-->
-                <div class="gd-col2 " v-for="i in 4" :key="i">
+                <div class="gd-col2" v-for="i in 4" :key="i">
                     <div>
                         <div class="flex align-center mb20 mr40">
                             <label :for="'answer' + i" class="title2">답{{ i }}</label>
-                            <input :id="'answer' + i" type="text" class="data-wrap"
-                                v-model="prblmDetail.answers[i].text" />
+                            <input
+                                :id="'answer' + i"
+                                type="text"
+                                class="data-wrap"
+                                v-model="prblmDetail.answers[i].text"
+                            />
                         </div>
                         <div class="flex align-center mb20">
                             <label :for="'correct' + i" class="title2">정답여부</label>
-                            <input :id="'correct' + i" type="checkbox" class="ui-checkbox"
-                                :checked="prblmDetail.correctIndex === i" @change="setCorrectAnswer(i)" />
+                            <input
+                                :id="'correct' + i"
+                                type="checkbox"
+                                class="ui-checkbox"
+                                :checked="prblmDetail.correctIndex === i"
+                                @change="setCorrectAnswer(i)"
+                            />
                         </div>
                     </div>
                     <div class="flex align-center mb20">
                         <label :for="'file' + i" class="title2">첨부파일</label>
                         <input type="file" :ref="'fileInput' + i" @change="handleDetailFileUpload(i)" multiple />
                     </div>
-
                 </div>
             </div>
-            <div
-                v-else-if="selectedSearchOption2.prblm_type_cls === '3지선다'">
+            <div v-else-if="selectedSearchOption2.prblm_type_cls === '3지선다'">
                 <!--3지선다-->
-                <div class="gd-col2 " v-for="i in 3" :key="i">
+                <div class="gd-col2" v-for="i in 3" :key="i">
                     <div>
                         <div class="flex align-center mb20 mr40">
                             <label :for="'answer' + i" class="title2">답{{ i }}</label>
-                            <input :id="'answer' + i" type="text" class="data-wrap"
-                                v-model="prblmDetail.answers[i].text" />
+                            <input
+                                :id="'answer' + i"
+                                type="text"
+                                class="data-wrap"
+                                v-model="prblmDetail.answers[i].text"
+                            />
                         </div>
                         <div class="flex align-center mb20">
                             <label :for="'correct' + i" class="title2">정답여부</label>
-                            <input :id="'correct' + i" type="checkbox" class="ui-checkbox"
-                                :checked="prblmDetail.correctIndex === i" @change="setCorrectAnswer(i)" />
+                            <input
+                                :id="'correct' + i"
+                                type="checkbox"
+                                class="ui-checkbox"
+                                :checked="prblmDetail.correctIndex === i"
+                                @change="setCorrectAnswer(i)"
+                            />
                         </div>
                     </div>
                     <div class="flex align-center mb20">
                         <label :for="'file' + i" class="title2">첨부파일</label>
                         <input type="file" :ref="'fileInput' + i" @change="handleDetailFileUpload(i)" multiple />
                     </div>
-
                 </div>
             </div>
-            <div
-                v-else-if="selectedSearchOption2.prblm_type_cls === '2지선다'">
+            <div v-else-if="selectedSearchOption2.prblm_type_cls === '2지선다'">
                 <!--2지선다-->
-                <div class="gd-col2 " v-for="i in 2" :key="i">
+                <div class="gd-col2" v-for="i in 2" :key="i">
                     <div>
                         <div class="flex align-center mb20 mr40">
                             <label :for="'answer' + i" class="title2">답{{ i }}</label>
-                            <input :id="'answer' + i" type="text" class="data-wrap"
-                                v-model="prblmDetail.answers[i].text" />
+                            <input
+                                :id="'answer' + i"
+                                type="text"
+                                class="data-wrap"
+                                v-model="prblmDetail.answers[i].text"
+                            />
                         </div>
                         <div class="flex align-center mb20">
                             <label :for="'correct' + i" class="title2">정답여부</label>
-                            <input :id="'correct' + i" type="checkbox" class="ui-checkbox"
-                                :checked="prblmDetail.correctIndex === i" @change="setCorrectAnswer(i)" />
+                            <input
+                                :id="'correct' + i"
+                                type="checkbox"
+                                class="ui-checkbox"
+                                :checked="prblmDetail.correctIndex === i"
+                                @change="setCorrectAnswer(i)"
+                            />
                         </div>
                     </div>
                     <div class="flex align-center mb20">
                         <label :for="'file' + i" class="title2">첨부파일</label>
                         <input type="file" :ref="'fileInput' + i" @change="handleDetailFileUpload(i)" multiple />
                     </div>
-
                 </div>
             </div>
             <div v-else-if="selectedSearchOption2.prblm_type_cls === 'OX 문제'">
@@ -188,11 +217,12 @@
                     </select>
                 </div>
                 <div class="flex align-center mb20">
-                    <label class="title2">첨부파일</label>
-                    <div v-if="prblmDetail.answers[1] && prblmDetail.answers[1].fileInfo"
-                        v-for="(data, index) in prblmDetail.answers[1].fileInfo" :key="index">
-                        <label>{{ data.fileNm }}</label>
+                    <div v-if="prblmDetail.answers[1]?.fileInfo">
+                        <div v-for="(data, index) in prblmDetail.answers[1].fileInfo" :key="index">
+                            <label>{{ data.fileNm }}</label>
+                        </div>
                     </div>
+
                     <input type="file" ref="fileInput1" @change="handleDetailFileUpload(1)" multiple />
                 </div>
             </div>
@@ -202,13 +232,12 @@
                 <div class="gd-col2">
                     <div class="flex align-center mb20">
                         <label for="" class="title2">답</label>
-                        <input type="text" class="data-wrap" v-model="prblmDetail.answers[1].text">
+                        <input type="text" class="data-wrap" v-model="prblmDetail.answers[1].text" />
                     </div>
                     <div class="flex align-center mb20">
                         <label class="title2">첨부파일</label>
-                        <div v-if="prblmDetail.answers[1] && prblmDetail.answers[1].fileInfo"
-                            v-for="(data, index) in prblmDetail.answers[1].fileInfo" :key="index">
-                            <label>{{ data.fileNm }}</label>
+                        <div v-for="(data, index) in prblmDetail.answers[1]?.fileInfo" :key="index">
+                            <label v-if="prblmDetail.answers[1]?.fileInfo">{{ data.fileNm }}</label>
                         </div>
                         <input type="file" ref="fileInput1" @change="handleDetailFileUpload(1)" multiple />
                     </div>
@@ -257,44 +286,40 @@
                 <label for="" class="title2">해설</label>
                 <textarea name="" id="" class="data-wrap" v-model="prblm_cmmt"></textarea>
             </div>
-            <hr>
+            <hr />
             <div class="flex align-center mb20 mt40">
                 <label for="" class="title2">문제 지표 1</label>
-                <input type="text" class="data-wrap" v-model="prblm_mtr1">
+                <input type="text" class="data-wrap" v-model="prblm_mtr1" />
             </div>
             <div class="flex align-center mb20 mt40">
                 <label for="" class="title2">문제 지표 2</label>
-                <input type="text" class="data-wrap" v-model="prblm_mtr2">
+                <input type="text" class="data-wrap" v-model="prblm_mtr2" />
             </div>
             <div class="flex align-center mb20 mt40">
                 <label for="" class="title2">문제 지표 3</label>
-                <input type="text" class="data-wrap" v-model="prblm_mtr3">
+                <input type="text" class="data-wrap" v-model="prblm_mtr3" />
             </div>
             <div class="flex align-center mb20 mt40">
                 <label for="" class="title2">문제 지표 4</label>
-                <input type="text" class="data-wrap" v-model="prblm_mtr4">
+                <input type="text" class="data-wrap" v-model="prblm_mtr4" />
             </div>
             <div class="flex align-center mb20 mt40">
                 <label for="" class="title2">문제 지표 5</label>
-                <input type="text" class="data-wrap" v-model="prblm_mtr5">
+                <input type="text" class="data-wrap" v-model="prblm_mtr5" />
             </div>
             <div class="flex align-center mb20 mt40">
                 <label for="" class="title2">문제 지표 6</label>
-                <input type="text" class="data-wrap" v-model="prblm_mtr6">
+                <input type="text" class="data-wrap" v-model="prblm_mtr6" />
             </div>
-
         </div>
         <div class="flex justify-between mt50">
-            <button type="button" title="글쓰기" class="new-btn" @click="goToPage('QuestionList')">
-                목록
-            </button>
-            <div class="flex"><!--
+            <button type="button" title="글쓰기" class="new-btn" @click="goToPage('QuestionList')">목록</button>
+            <div class="flex">
+                <!--
                 <button type="button" title="글쓰기" class="new-btn mr10">
                     취소
                 </button>-->
-                <button type="button" title="글쓰기" class="new-btn" @click="submitForm">
-                    등록
-                </button>
+                <button type="button" title="글쓰기" class="new-btn" @click="submitForm">등록</button>
             </div>
         </div>
     </div>
@@ -304,8 +329,7 @@
 import SvgIcon from '@jamescoyle/vue-icon';
 import { mdiMagnify } from '@mdi/js';
 import store from '../AppStore';
-import axios from "axios";
-
+import axios from 'axios';
 
 export default {
     data() {
@@ -370,20 +394,20 @@
 
             const formData = new FormData();
             for (let i = 0; i < files.length; i++) {
-                formData.append("files", files[i]);
+                formData.append('files', files[i]);
             }
 
             try {
-                const response = await axios.post("http://165.229.169.113:9080/file/upload.json", formData, {
+                const response = await axios.post('http://165.229.169.113:9080/file/upload.json', formData, {
                     headers: {
-                        "Content-Type": "multipart/form-data",
+                        'Content-Type': 'multipart/form-data',
                     },
                 });
 
                 return response.data.fileMngId; // 파일 매니지 ID 반환
             } catch (error) {
-                console.error("파일 업로드 오류:", error);
-                throw new Error("파일 업로드에 실패했습니다.");
+                console.error('파일 업로드 오류:', error);
+                throw new Error('파일 업로드에 실패했습니다.');
             }
         },
 
@@ -391,22 +415,22 @@
         async submitForm() {
             // 필요한 모든 필드를 검사합니다.
             if (!this.selectedSearchOption) {
-                alert("카테고리를 지정해 주세요.");
+                alert('카테고리를 지정해 주세요.');
                 return;
             }
 
             if (!this.selectedSearchOption2.prblm_type_id) {
-                alert("문제 유형을 지정해 주세요.");
+                alert('문제 유형을 지정해 주세요.');
                 return;
             }
 
             if (!this.prblm_scr) {
-                alert("문제 배점을 입력해 주세요.");
+                alert('문제 배점을 입력해 주세요.');
                 return;
             }
 
             if (!this.prblm_expln) {
-                alert("문제 내용을 입력해 주세요.");
+                alert('문제 내용을 입력해 주세요.');
                 return;
             }
 
@@ -428,7 +452,7 @@
                 prblmMtr4: this.prblm_mtr4,
                 prblmMtr5: this.prblm_mtr5,
                 prblmMtr6: this.prblm_mtr6,
-                fileMngId: this.file_mng_id // 첨부파일 ID
+                fileMngId: this.file_mng_id, // 첨부파일 ID
             };
 
             if (this.file && this.file.length > 0) {
@@ -440,12 +464,11 @@
             try {
                 const response = await axios.post('/problem/insertProblem.json', payload);
                 console.log('성공:', response.data);
-                const prblmId = response.data.prblmId; // 상세 문제 정보를 위한 문제 ID 
+                const prblmId = response.data.prblmId; // 상세 문제 정보를 위한 문제 ID
                 const problemDetails = await this.prepareProblemDetails(prblmId);
                 await this.submitDetailForm(problemDetails);
 
                 this.goToPage('QuestionList');
-
             } catch (error) {
                 console.error('오류:', error);
                 // 오류 처리 로직 추가
@@ -454,7 +477,6 @@
 
         // 문제 상세 업로드
         async submitDetailForm(problemDetails) {
-
             try {
                 const response = await axios.post('/problem/insertProblemDetail.json', problemDetails);
                 console.log('성공:', response.data);
@@ -492,8 +514,11 @@
                 details.push({
                     prblmId,
                     prblmDtlExpln: answers[i].text || '',
-                    prblmYn: this.selectedSearchOption2.prblm_type_cls === '서술형' || 
-                    this.selectedSearchOption2.prblm_type_cls === 'OX 문제' ? 'Y' : answers[i].isCorrect, // 서술형 및 OX 문제의 경우 항상 'Y'
+                    prblmYn:
+                        this.selectedSearchOption2.prblm_type_cls === '서술형' ||
+                        this.selectedSearchOption2.prblm_type_cls === 'OX 문제'
+                            ? 'Y'
+                            : answers[i].isCorrect, // 서술형 및 OX 문제의 경우 항상 'Y'
                     fileMngId: answers[i].fileMngId,
                 });
             }
@@ -511,7 +536,6 @@
 
         resetPrblmDetail() {
             this.prblmDetail = {
-
                 answers: {
                     1: { text: '', isCorrect: 'Y', fileMngId: null },
                     2: { text: '', isCorrect: 'N', fileMngId: null },
@@ -527,20 +551,20 @@
         // 교재 정보 가져오기
         fetchBooks() {
             axios({
-                url: "/book/findAll.json",
-                method: "post",
+                url: '/book/findAll.json',
+                method: 'post',
                 headers: {
-                    "Content-Type": "application/json; charset=UTF-8",
+                    'Content-Type': 'application/json; charset=UTF-8',
                 },
             })
-                .then(response => {
-                    console.log(response.data)
+                .then((response) => {
+                    console.log(response.data);
                     this.books = response.data;
                     this.text_id = '';
                 })
-                .catch(error => {
-                    console.error("fetchBooks - error: ", error);
-                    alert("교재 목록을 불러오는 중 오류가 발생했습니다.");
+                .catch((error) => {
+                    console.error('fetchBooks - error: ', error);
+                    alert('교재 목록을 불러오는 중 오류가 발생했습니다.');
                 });
         },
 
@@ -549,75 +573,72 @@
             if (!this.book_id) return;
 
             axios({
-                url: "/unit/unitList.json",
-                method: "post",
+                url: '/unit/unitList.json',
+                method: 'post',
                 headers: {
-                    "Content-Type": "application/json; charset=UTF-8",
+                    'Content-Type': 'application/json; charset=UTF-8',
                 },
                 data: {
-                    "bookId": this.book_id
+                    bookId: this.book_id,
                 },
             })
-                .then(response => {
+                .then((response) => {
                     this.units = response.data;
                     this.text_id = '';
                 })
-                .catch(error => {
-                    console.error("fetchUnits - error: ", error);
-                    alert("단원 목록을 불러오는 중 오류가 발생했습니다.");
+                .catch((error) => {
+                    console.error('fetchUnits - error: ', error);
+                    alert('단원 목록을 불러오는 중 오류가 발생했습니다.');
                 });
         },
 
         // 지문 정보 가져오기
         fetchTexts() {
             axios({
-                url: "/text/textSearch.json",
-                method: "post",
+                url: '/text/textSearch.json',
+                method: 'post',
                 headers: {
-                    "Content-Type": "application/json; charset=UTF-8",
+                    'Content-Type': 'application/json; charset=UTF-8',
                 },
                 data: {
-                    "unitId": this.unit_id
+                    unitId: this.unit_id,
                 },
             })
-                .then(response => {
+                .then((response) => {
                     this.texts = response.data.list;
                 })
-                .catch(error => {
-                    console.error("fetchTexts - error: ", error);
-                    alert("지문 목록을 불러오는 중 오류가 발생했습니다.");
+                .catch((error) => {
+                    console.error('fetchTexts - error: ', error);
+                    alert('지문 목록을 불러오는 중 오류가 발생했습니다.');
                 });
         },
         // 문제 유형 정보 가져오기
         selectProblemType() {
             axios({
-                url: "/problem/selectType.json",
-                method: "post",
+                url: '/problem/selectType.json',
+                method: 'post',
                 headers: {
-                    "Content-Type": "application/json; charset=UTF-8",
+                    'Content-Type': 'application/json; charset=UTF-8',
                 },
             })
-                .then(response => {
+                .then((response) => {
                     this.problemType = response.data;
+                    console.log('문제 유형 : ', response.data);
                 })
-                .catch(error => {
-                    console.error("selectProblemType - error: ", error);
+                .catch((error) => {
+                    console.error('selectProblemType - error: ', error);
                 });
         },
-
     },
     watch: {
         selectedSearchOption2() {
             // 문제 유형이 변경될 때 prblmDetail 초기화
             this.resetPrblmDetail();
         },
-
     },
-    computed: {
-
-    },
+    computed: {},
     components: {
-        SvgIcon
+        SvgIcon,
     },
     mounted() {
         this.book_id = this.$route.query.book_id;
@@ -628,13 +649,12 @@
         this.fetchUnits();
         this.fetchTexts();
         this.selectProblemType();
-    }
-}
-
+    },
+};
 </script>
 <style scoped>
 .ui-checkbox {
     width: 30px;
     height: 30px;
 }
-</style>
(파일 끝에 줄바꿈 문자 없음)
+</style>
Add a comment
List