diff --git a/db/migrations/006_momo_user_info_extend.sql b/db/migrations/006_momo_user_info_extend.sql
index 3d6c6d5..d66ab9b 100644
--- a/db/migrations/006_momo_user_info_extend.sql
+++ b/db/migrations/006_momo_user_info_extend.sql
@@ -39,15 +39,24 @@ BEGIN
END IF;
-- 자식: 메뉴관리 (LABEL_TO_TAB 매핑이 '메뉴관리' → 'menu' 이므로 정확히 동일 이름 필수)
- IF NOT EXISTS (
+ -- menu_info.objid 에 unique 제약이 없을 수 있으므로 ON CONFLICT 대신 EXISTS 분기로 idempotent 처리
+ IF EXISTS (SELECT 1 FROM menu_info WHERE objid = 9000601) THEN
+ UPDATE menu_info
+ SET parent_obj_id = menu_section_id,
+ menu_name_kor = '메뉴관리',
+ menu_name_eng = 'Menus',
+ menu_url = '',
+ status = 'active',
+ system_name = 'PMS'
+ WHERE objid = 9000601;
+ ELSIF NOT EXISTS (
SELECT 1 FROM menu_info
- WHERE parent_obj_id = menu_section_id AND menu_name_kor = '메뉴관리' AND COALESCE(status,'') = 'active'
+ WHERE parent_obj_id = menu_section_id AND menu_name_kor = '메뉴관리'
) THEN
INSERT INTO menu_info (objid, menu_type, parent_obj_id, menu_name_kor, menu_name_eng,
seq, menu_url, status, system_name, regdate)
VALUES (9000601, '1', menu_section_id, '메뉴관리', 'Menus',
- 10, '', 'active', 'PMS', NOW())
- ON CONFLICT (objid) DO UPDATE SET status = 'active';
+ 10, '', 'active', 'PMS', NOW());
END IF;
END $$;
diff --git a/db/migrations/007_user_info_address.sql b/db/migrations/007_user_info_address.sql
new file mode 100644
index 0000000..5a9bf11
--- /dev/null
+++ b/db/migrations/007_user_info_address.sql
@@ -0,0 +1,7 @@
+-- 회원가입 주소 입력 항목 추가 (스펙 §1: 이메일/업체명/전화번호/주소 필수)
+BEGIN;
+
+ALTER TABLE user_info
+ ADD COLUMN IF NOT EXISTS address VARCHAR(300);
+
+COMMIT;
diff --git a/src/app/(auth)/signup/page.tsx b/src/app/(auth)/signup/page.tsx
index 9b37056..7bdaa4d 100644
--- a/src/app/(auth)/signup/page.tsx
+++ b/src/app/(auth)/signup/page.tsx
@@ -4,7 +4,7 @@ import { useState, FormEvent } from "react";
import Link from "next/link";
import { useRouter } from "next/navigation";
import Swal from "sweetalert2";
-import { Mail, Lock, Building2, User as UserIcon, Phone, FileText, ArrowRight, Eye, EyeOff } from "lucide-react";
+import { Mail, Lock, Building2, User as UserIcon, Phone, FileText, MapPin, ArrowRight, Eye, EyeOff } from "lucide-react";
export default function SignupPage() {
const router = useRouter();
@@ -16,6 +16,7 @@ export default function SignupPage() {
ceoName: "",
bizNo: "",
phone: "",
+ address: "",
});
const [showPw, setShowPw] = useState(false);
const [loading, setLoading] = useState(false);
@@ -25,8 +26,8 @@ export default function SignupPage() {
const submit = async (e: FormEvent) => {
e.preventDefault();
- if (!form.email || !form.password || !form.companyName) {
- Swal.fire({ icon: "warning", title: "필수 항목을 입력하세요." });
+ if (!form.email || !form.password || !form.companyName || !form.phone || !form.address) {
+ Swal.fire({ icon: "warning", title: "필수 항목을 입력하세요.", text: "이메일·비밀번호·업체명·전화번호·주소는 필수입니다." });
return;
}
if (form.password.length < 8) {
@@ -49,6 +50,7 @@ export default function SignupPage() {
ceoName: form.ceoName,
bizNo: form.bizNo,
phone: form.phone,
+ address: form.address,
}),
});
const data = await res.json();
@@ -139,8 +141,9 @@ export default function SignupPage() {
} label="업체명 *" value={form.companyName} onChange={set("companyName")} placeholder="(주)거래처 또는 매장명" />
} label="대표자" value={form.ceoName} onChange={set("ceoName")} placeholder="홍길동" />
- } label="연락처" value={form.phone} onChange={set("phone")} placeholder="010-0000-0000" />
+ } label="연락처 *" value={form.phone} onChange={set("phone")} placeholder="010-0000-0000" />
+ } label="주소 *" value={form.address} onChange={set("address")} placeholder="배송지 주소를 입력하세요" />
} label="사업자등록번호" value={form.bizNo} onChange={set("bizNo")} placeholder="000-00-00000 (선택)" />