diff --git a/backend-node/src/controllers/authController.ts b/backend-node/src/controllers/authController.ts
index ebf3e8f5..21673369 100644
--- a/backend-node/src/controllers/authController.ts
+++ b/backend-node/src/controllers/authController.ts
@@ -50,29 +50,24 @@ export class AuthController {
logger.debug(`로그인 사용자 정보: ${userInfo.userId} (${userInfo.companyCode})`);
+ // 메뉴 조회를 위한 공통 파라미터
+ const { AdminService } = await import("../services/adminService");
+ const paramMap = {
+ userId: loginResult.userInfo.userId,
+ userCompanyCode: loginResult.userInfo.companyCode || "ILSHIN",
+ userType: loginResult.userInfo.userType,
+ userLang: "ko",
+ };
+
// 사용자의 첫 번째 접근 가능한 메뉴 조회
let firstMenuPath: string | null = null;
try {
- const { AdminService } = await import("../services/adminService");
- const paramMap = {
- userId: loginResult.userInfo.userId,
- userCompanyCode: loginResult.userInfo.companyCode || "ILSHIN",
- userType: loginResult.userInfo.userType,
- userLang: "ko",
- };
-
const menuList = await AdminService.getUserMenuList(paramMap);
logger.debug(`로그인 후 메뉴 조회: 총 ${menuList.length}개 메뉴`);
- // 접근 가능한 첫 번째 메뉴 찾기
- // 조건:
- // 1. LEV (레벨)이 2 이상 (최상위 폴더 제외)
- // 2. MENU_URL이 있고 비어있지 않음
- // 3. 이미 PATH, SEQ로 정렬되어 있으므로 첫 번째로 찾은 것이 첫 번째 메뉴
const firstMenu = menuList.find((menu: any) => {
const level = menu.lev || menu.level;
const url = menu.menu_url || menu.url;
-
return level >= 2 && url && url.trim() !== "" && url !== "#";
});
@@ -86,13 +81,30 @@ export class AuthController {
logger.warn("메뉴 조회 중 오류 발생 (무시하고 계속):", menuError);
}
+ // POP 랜딩 경로 조회
+ let popLandingPath: string | null = null;
+ try {
+ const popResult = await AdminService.getPopMenuList(paramMap);
+ if (popResult.landingMenu?.menu_url) {
+ popLandingPath = popResult.landingMenu.menu_url;
+ } else if (popResult.childMenus.length === 1) {
+ popLandingPath = popResult.childMenus[0].menu_url;
+ } else if (popResult.childMenus.length > 1) {
+ popLandingPath = "/pop";
+ }
+ logger.debug(`POP 랜딩 경로: ${popLandingPath}`);
+ } catch (popError) {
+ logger.warn("POP 메뉴 조회 중 오류 (무시):", popError);
+ }
+
res.status(200).json({
success: true,
message: "로그인 성공",
data: {
userInfo,
token: loginResult.token,
- firstMenuPath, // 첫 번째 접근 가능한 메뉴 경로 추가
+ firstMenuPath,
+ popLandingPath,
},
});
} else {
diff --git a/frontend/app/(auth)/login/page.tsx b/frontend/app/(auth)/login/page.tsx
index fe697cee..d105df77 100644
--- a/frontend/app/(auth)/login/page.tsx
+++ b/frontend/app/(auth)/login/page.tsx
@@ -10,8 +10,17 @@ import { LoginFooter } from "@/components/auth/LoginFooter";
* 비즈니스 로직은 useLogin 훅에서 처리하고, UI 컴포넌트들을 조합하여 구성
*/
export default function LoginPage() {
- const { formData, isLoading, error, showPassword, handleInputChange, handleLogin, togglePasswordVisibility } =
- useLogin();
+ const {
+ formData,
+ isLoading,
+ error,
+ showPassword,
+ isPopMode,
+ handleInputChange,
+ handleLogin,
+ togglePasswordVisibility,
+ togglePopMode,
+ } = useLogin();
return (
@@ -23,9 +32,11 @@ export default function LoginPage() {
isLoading={isLoading}
error={error}
showPassword={showPassword}
+ isPopMode={isPopMode}
onInputChange={handleInputChange}
onSubmit={handleLogin}
onTogglePassword={togglePasswordVisibility}
+ onTogglePop={togglePopMode}
/>
diff --git a/frontend/components/auth/LoginForm.tsx b/frontend/components/auth/LoginForm.tsx
index dda3736f..7eadbfeb 100644
--- a/frontend/components/auth/LoginForm.tsx
+++ b/frontend/components/auth/LoginForm.tsx
@@ -2,7 +2,8 @@ import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
-import { Eye, EyeOff, Loader2 } from "lucide-react";
+import { Switch } from "@/components/ui/switch";
+import { Eye, EyeOff, Loader2, Monitor } from "lucide-react";
import { LoginFormData } from "@/types/auth";
import { ErrorMessage } from "./ErrorMessage";
@@ -11,9 +12,11 @@ interface LoginFormProps {
isLoading: boolean;
error: string;
showPassword: boolean;
+ isPopMode: boolean;
onInputChange: (e: React.ChangeEvent) => void;
onSubmit: (e: React.FormEvent) => void;
onTogglePassword: () => void;
+ onTogglePop: () => void;
}
/**
@@ -24,9 +27,11 @@ export function LoginForm({
isLoading,
error,
showPassword,
+ isPopMode,
onInputChange,
onSubmit,
onTogglePassword,
+ onTogglePop,
}: LoginFormProps) {
return (
@@ -82,6 +87,19 @@ export function LoginForm({
+ {/* POP 모드 토글 */}
+
+
{/* 로그인 버튼 */}