diff --git a/plm-app/src/app/(admin)/common/codeCategoryMngList/page.tsx b/plm-app/src/app/(admin)/common/codeCategoryMngList/page.tsx
index 022075f..5d034bf 100644
--- a/plm-app/src/app/(admin)/common/codeCategoryMngList/page.tsx
+++ b/plm-app/src/app/(admin)/common/codeCategoryMngList/page.tsx
@@ -248,6 +248,7 @@ const CommonCodePage = () => {
   const [deleteAlertOpen, setDeleteAlertOpen] = useState(false);
   const [codeToDelete, setCodeToDelete] = useState<string | null>(null);
   const [selectedRows, setSelectedRows] = useState<CommonCode[]>([]);
+  const [currentPageSize, setCurrentPageSize] = useState(20); // 페이지 크기 상태 추가
  
   const queryClient = useQueryClient();
   const { toast } = useToast();
@@ -503,6 +504,8 @@ const CommonCodePage = () => {
           <PLMTable<CommonCode>
             columns={columns}
             data={filteredCodes}
+            pageSize={currentPageSize} // 페이지 크기 prop 전달
+            onPageSizeChange={setCurrentPageSize} // 페이지 크기 변경 핸들러 전달
             onRowClick={(row) => {
               setSelectedCode(row);
               setIsOpen(true); 
diff --git a/plm-app/src/app/(admin)/common/menu/page.tsx b/plm-app/src/app/(admin)/common/menu/page.tsx
index 5d6ae4c..41670d7 100644
--- a/plm-app/src/app/(admin)/common/menu/page.tsx
+++ b/plm-app/src/app/(admin)/common/menu/page.tsx
@@ -306,6 +306,7 @@ const MenusPage = () => {
   const [deleteAlertOpen, setDeleteAlertOpen] = useState(false);
   const [menuToDelete, setMenuToDelete] = useState<string | null>(null);
   const [selectedRows, setSelectedRows] = useState<DBMenuItem[]>([]);
+  const [currentPageSize, setCurrentPageSize] = useState(20); // 페이지 크기 상태 추가
 
   const queryClient = useQueryClient();
   const { toast } = useToast();
@@ -575,6 +576,8 @@ const MenusPage = () => {
             <PLMTable<DBMenuItem>
               columns={columns}
               data={filteredMenus}
+              pageSize={currentPageSize} // 페이지 크기 prop 전달
+              onPageSizeChange={setCurrentPageSize} // 페이지 크기 변경 핸들러 전달
               onRowClick={(row) => {
                 setSelectedMenu(row);
                 setIsOpen(true); 
diff --git a/plm-app/src/components/common/Table/index.tsx b/plm-app/src/components/common/Table/index.tsx
index 1043ffd..a7f9cb4 100644
--- a/plm-app/src/components/common/Table/index.tsx
+++ b/plm-app/src/components/common/Table/index.tsx
@@ -42,6 +42,7 @@ interface PLMTableProps<T extends BaseRow> {
   pageSize?: number;
   enableCheckbox?: boolean;
   onCheckedChange?: (checkedRows: T[]) => void;
+  onPageSizeChange?: (newPageSize: number) => void; // 새로운 prop 추가
 }
 
 type CustomExpandedState = Record<string | number, boolean>;
@@ -52,7 +53,8 @@ export function PLMTable<T extends BaseRow>({
   onRowClick,
   pageSize = 20,
   enableCheckbox = false,
-  onCheckedChange
+  onCheckedChange,
+  onPageSizeChange,
 }: PLMTableProps<T>) {
   const [expanded, setExpanded] = useState<CustomExpandedState>({});
   const [rowSelection, setRowSelection] = useState<Record<string, boolean>>({});
@@ -290,6 +292,18 @@ export function PLMTable<T extends BaseRow>({
     setRowSelection({});
   }, [currentPageIndex]);
 
+  const pageSizeOptions = [20, 50, 75, 100];
+
+  // 페이지 크기 변경 핸들러
+  const handlePageSizeChange = (newSize: number) => {
+    const newPageSize = Number(newSize);
+    setCurrentPageIndex(0);
+    table.setPageSize(newPageSize);
+    if (onPageSizeChange) {
+      onPageSizeChange(newPageSize);
+    }
+  };
+
   return (
     <div>
       <div
@@ -319,25 +333,40 @@ export function PLMTable<T extends BaseRow>({
             {table.getRowModel().rows.map((row) => (
               <tr
                 key={row.id}
-                className={`transition-colors hover:bg-gray-50 ${
-                  row.depth > 0 ? "bg-slate-50/70" : ""
-                }`}
+                className={`transition-colors hover:bg-gray-50`}
               >
-                {row.getVisibleCells().map((cell) => (
-                  <td
-                    key={cell.id}
-                    className={`py-3 px-4 border-b border-gray-200 overflow-hidden text-ellipsis ${
-                      row.depth > 0 ? "text-gray-600" : ""
-                    } ${cell.column.columnDef.meta?.className || ""}`}
-                    style={{
-                      width: cell.column.columnDef.meta?.width,
-                      maxWidth: cell.column.columnDef.meta?.width,
-                      textAlign: cell.column.columnDef.meta?.textAlign || 'left'
-                    }}
-                  >
-                    {flexRender(cell.column.columnDef.cell, cell.getContext())}
-                  </td>
-                ))}
+                {row.getVisibleCells().map((cell) => {
+                  const isFirstCell = cell.column.id === 'expander';
+                  return (
+                    <td
+                      key={cell.id}
+                      className={`py-3 px-4 border-b border-gray-200 overflow-visible
+                        ${cell.column.columnDef.meta?.className || ""}
+                        ${isFirstCell ? 'relative' : ''}`}
+                      style={{
+                        width: cell.column.columnDef.meta?.width,
+                        maxWidth: cell.column.columnDef.meta?.width,
+                        textAlign: cell.column.columnDef.meta?.textAlign || 'left',
+                        paddingLeft: isFirstCell ? `${row.depth * 24 + 16}px` : undefined,
+                      }}
+                    >
+                      {isFirstCell && Array.from({ length: row.depth }).map((_, index) => (
+                        <span
+                          key={`line-${index}`}
+                          className="absolute h-full w-px bg-gray-200"
+                          style={{
+                            left: `${(index + 1) * 24}px`,
+                            top: 0,
+                            zIndex: 1
+                          }}
+                        />
+                      ))}
+                      <div className={isFirstCell ? 'relative z-10' : ''}>
+                        {flexRender(cell.column.columnDef.cell, cell.getContext())}
+                      </div>
+                    </td>
+                  );
+                })}
               </tr>
             ))}
           </tbody>
@@ -345,7 +374,20 @@ export function PLMTable<T extends BaseRow>({
       </div>
 
       <div className="flex items-center justify-between py-3 text-sm text-gray-700">
-        <div className="w-1/3" />
+        <div className="w-1/3 flex items-center gap-2">
+          <span>페이지당 행:</span>
+          <select
+            value={pageSize}
+            onChange={(e) => handlePageSizeChange(Number(e.target.value))}
+            className="border border-gray-200 rounded-md px-2 py-1 bg-white text-gray-700"
+          >
+            {pageSizeOptions.map((size) => (
+              <option key={size} value={size}>
+                {size}개
+              </option>
+            ))}
+          </select>
+        </div>
         <div className="flex items-center justify-center gap-2 flex-1">
           <button
             onClick={() => {