+ {inputs.map((input) => (
+
onChange?.(input.id, event.target.value)}
+ placeholder={input.placeholder ?? '추가할 전공을 입력해주세요.'}
+ value={input.value}
+ />
+ ))}
+ {errorMessage ? (
+
+ {errorMessage}
+
+ ) : null}
+
+ )
+}
diff --git a/src/shared/ui/MajorInputGroup/index.ts b/src/shared/ui/MajorInputGroup/index.ts
new file mode 100644
index 0000000..fa8ac5b
--- /dev/null
+++ b/src/shared/ui/MajorInputGroup/index.ts
@@ -0,0 +1,2 @@
+export { MajorInputGroup } from './MajorInputGroup'
+export type { MajorInputGroupProps, MajorInputValue } from './MajorInputGroup'
diff --git a/src/shared/ui/MajorList/MajorList.module.css b/src/shared/ui/MajorList/MajorList.module.css
new file mode 100644
index 0000000..0f45852
--- /dev/null
+++ b/src/shared/ui/MajorList/MajorList.module.css
@@ -0,0 +1,20 @@
+.section {
+ display: grid;
+ gap: var(--space-5);
+ width: 100%;
+}
+
+.label {
+ margin: 0;
+ color: var(--repo-gray-50);
+ font-size: var(--repo-font-body-large-size);
+ font-weight: var(--repo-font-body-large-weight);
+ line-height: var(--repo-font-body-large-line-height);
+ letter-spacing: 0;
+}
+
+.list {
+ display: grid;
+ gap: var(--space-5);
+ width: 100%;
+}
diff --git a/src/shared/ui/MajorList/MajorList.tsx b/src/shared/ui/MajorList/MajorList.tsx
new file mode 100644
index 0000000..4b5102d
--- /dev/null
+++ b/src/shared/ui/MajorList/MajorList.tsx
@@ -0,0 +1,32 @@
+'use client'
+
+import { LinkRow } from '@/shared/ui/LinkRow'
+
+import styles from './MajorList.module.css'
+
+export type MajorListItem = {
+ readonly id: string
+ readonly name: string
+}
+
+export type MajorListProps = {
+ readonly items: readonly MajorListItem[]
+ readonly label?: string
+ readonly onSelect?: (id: string) => void
+ readonly selectedId?: string
+}
+
+export function MajorList({ items, label = '전공관리 전공', onSelect, selectedId }: MajorListProps) {
+ return (
+