diff --git a/src/App.vue b/src/App.vue
index 3ec463e..168da05 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -38,4 +38,12 @@
     }
   }
 }
+
+html::-webkit-scrollbar, body::-webkit-scrollbar {
+  overflow-y: hidden;
+}
+
+html, body {
+  overflow-y: hidden;
+}
 </style>
diff --git a/src/api/audio_content_series.js b/src/api/audio_content_series.js
index b7bfbe6..f77959e 100644
--- a/src/api/audio_content_series.js
+++ b/src/api/audio_content_series.js
@@ -55,6 +55,13 @@ async function removeContentInTheSeries(seriesId, contentId) {
     )
 }
 
+async function updateSeriesOrders(ids) {
+    return Vue.axios.put(
+        "/creator-admin/audio-content/series/orders",
+        {ids: ids}
+    )
+}
+
 export {
     getGenreList,
     getSeriesList,
@@ -62,6 +69,7 @@ export {
     modifySeries,
     getSeriesDetail,
     getSeriesContent,
+    updateSeriesOrders,
     addingContentToTheSeries,
     removeContentInTheSeries,
     searchContentNotInSeries
diff --git a/src/views/Content/ContentSeriesList.vue b/src/views/Content/ContentSeriesList.vue
index 142cac8..e994149 100644
--- a/src/views/Content/ContentSeriesList.vue
+++ b/src/views/Content/ContentSeriesList.vue
@@ -22,44 +22,54 @@
           </v-btn>
         </v-col>
       </v-row>
-      <v-row>
-        <v-col
-          v-for="(item, i) in series_list"
-          :key="i"
-          cols="3"
+      <div
+        ref="scroll_container"
+        class="scroll_container"
+        @scroll="onScroll"
+      >
+        <draggable
+          v-model="series_list"
+          class="row"
+          @end="onDropCallback(series_list)"
         >
-          <v-card>
-            <v-card-title>
-              <v-spacer />
-              <v-img
-                :src="item.coverImageUrl"
-                class="cover-image"
-                @click="selectSeries(item)"
-              />
-              <v-spacer />
-            </v-card-title>
-            <v-card-text class="series-title-container">
-              {{ item.title }}
-            </v-card-text>
-            <v-card-actions>
-              <v-spacer />
-              <v-btn
-                text
-                @click="showModifyDialog(item)"
-              >
-                수정
-              </v-btn>
-              <v-btn
-                text
-                @click="deleteConfirm(item)"
-              >
-                삭제
-              </v-btn>
-              <v-spacer />
-            </v-card-actions>
-          </v-card>
-        </v-col>
-      </v-row>
+          <v-col
+            v-for="(item, i) in series_list"
+            :key="i"
+            cols="3"
+          >
+            <v-card>
+              <v-card-title>
+                <v-spacer />
+                <v-img
+                  :src="item.coverImageUrl"
+                  class="cover-image"
+                  @click="selectSeries(item)"
+                />
+                <v-spacer />
+              </v-card-title>
+              <v-card-text class="series-title-container">
+                {{ item.title }}
+              </v-card-text>
+              <v-card-actions>
+                <v-spacer />
+                <v-btn
+                  text
+                  @click="showModifyDialog(item)"
+                >
+                  수정
+                </v-btn>
+                <v-btn
+                  text
+                  @click="deleteConfirm(item)"
+                >
+                  삭제
+                </v-btn>
+                <v-spacer />
+              </v-card-actions>
+            </v-card>
+          </v-col>
+        </draggable>
+      </div>
     </v-container>
 
     <v-dialog
@@ -345,10 +355,11 @@
 
 <script>
 import * as api from '@/api/audio_content_series';
+import Draggable from "vuedraggable";
 
 export default {
   name: "ContentSeriesList",
-
+  components: {Draggable},
   data() {
     return {
       is_loading: false,
@@ -378,6 +389,14 @@ export default {
   },
 
   methods: {
+    async onScroll() {
+      const scrollContainer = this.$refs.scroll_container;
+      const threshold = scrollContainer.scrollHeight - scrollContainer.clientHeight;
+      if (scrollContainer.scrollTop >= threshold - 10 && this.total_page >= this.page) {
+        await this.getSeriesList();
+      }
+    },
+
     imageAdd(payload) {
       const file = payload;
       if (file) {
@@ -485,8 +504,18 @@ export default {
       this.$router.push({name: 'ContentSeriesDetail', params: {seriesId: series.seriesId}})
     },
 
+    async onDropCallback(items) {
+      const ids = items.map((item) => {
+        return item.seriesId
+      })
+
+      const res = await api.updateSeriesOrders(ids)
+      if (res.status === 200 && res.data.success === true) {
+        this.notifySuccess(res.data.message)
+      }
+    },
+
     async getSeriesGenreList() {
-      this.is_loading = true
       try {
         const res = await api.getGenreList()
         if (res.status === 200 && res.data.success === true) {
@@ -496,23 +525,24 @@ export default {
         } else {
           this.notifyError(res.data.message || '알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.')
         }
-
-        this.is_loading = false
       } catch (e) {
         this.notifyError('알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.')
-        this.is_loading = false
       }
     },
 
     async getSeriesList() {
+      if (this.is_loading) return;
+
       this.is_loading = true
       try {
         const res = await api.getSeriesList(this.page)
         if (res.status === 200 && res.data.success === true) {
           const data = res.data.data
+          const total_page = Math.ceil(data.totalCount / 10)
 
-          const total_page = Math.ceil(data.totalCount / 20)
-          this.series_list = data.items
+          if (this.page === 1) this.series_list.length = 0;
+          this.page += 1;
+          this.series_list.push(...data.items);
 
           if (total_page <= 0)
             this.total_page = 1
@@ -665,6 +695,11 @@ export default {
 </script>
 
 <style scoped>
+.scroll_container {
+  height: 100vh;
+  overflow-y: auto;
+}
+
 .image-select label {
   display: inline-block;
   padding: 10px 20px;