# 3 · 프로필 만들기

> **보는 사람**: 로그인한 회원 (가입 직후 · 프로필 없이 입장하려던 사람)  
> **파일**: [index.html](index.html) (화면) · [screen.js](screen.js) (이 화면 동작)

## 이 화면은

닉네임, 한 줄 강점(선택), 맡고 싶은 역할, 할 수 있는 스킬(4그룹 20개)을 적는다. AI가 역할·현실성을 판단할 때 참고한다.

## 누르면 어떻게 되나

| 누르는 것 | 동작 | 이동 |
|---|---|---|
| 프로필 저장 → | `saveProfile` | — |
| 프로필 버튼 | — | [1-1 랜딩 (로그인 상태) · 프로필 팝오버](../01-1-landing-logged-in/README.md) |

## 프론트엔드

**이미 구현한 것**

- ✅ 역할 칩 1개 선택, 스킬 칩 여러 개 선택(✓ 표시)
- ✅ 닉네임·역할·스킬 1개 이상 없으면 막기 (입장 조건과 같음)
- ✅ 로그인 안 했으면 로그인 화면으로 (실서버 모드)
- ✅ 실서버 모드: 디자인 예시(노형원·예시 역할/스킬)를 지우고, 가입 때 적은 닉네임으로 시작
- ✅ 저장 후 돌아갈 곳(returnTo)이 있으면 그곳으로(예: 방 코드 입장 → 자동 입장), 없으면 로그인 상태 랜딩(1-1)

**남은 일**

- ⬜ 스킬 칩 목록을 /meta/skills 로 그리기(지금은 HTML에 고정)

## 백엔드가 해야 할 일 (쉽게)

- <b>역할·스킬 목록</b>은 서버에서 내려주면 앱을 새로 배포하지 않고도 스킬을 늘릴 수 있다.
- 프로필은 계정에 저장된다(게스트 프로필은 없음). <b>닉네임 + 맡고 싶은 역할 + 스킬 1개 이상</b>이 있어야 profileComplete=true이고, 그래야 세션 만들기·입장이 된다.
- 세션에 처음 입장할 때 프로필을 <b>복사(스냅샷)</b>해 둔다. 세션 중에 프로필을 고쳐도 AI 판단이 흔들리지 않게.
- AI에게 스킬 정보를 보낼 때는 이름을 빼고 "웹 화면 2명"처럼 <b>인원 수로만</b> 보낸다.

## 이 화면이 쓰는 API

| 언제 | API | 요약 |
|---|---|---|
| 화면 열 때 | `GET /meta/skills` | 역할·스킬 목록 |
| 프로필 저장 | `PUT /me/profile` | 내 프로필 저장 |

## API 상세

모든 경로 앞에 `/api/v1`가 붙어요. 공통 규칙(인증·에러 형식)은 [docs/02-API-공통-규칙.md](../../docs/02-API-공통-규칙.md).

### `GET /api/v1/meta/skills` — 역할·스킬 목록

- **API id**: `meta.skills` (프론트: `api.call('meta.skills', …)`)
- **누가 부를 수 있나**: 필요 없음
- **하는 일**: 프로필 화면의 칩 목록. 서버에서 내려주면 앱을 다시 배포하지 않고 스킬을 추가할 수 있다.

**응답** `200`

```json
{
  "roles": [
    "자료조사",
    "발표·기획",
    "문서정리",
    "개발·구현",
    "디자인"
  ],
  "skillGroups": [
    {
      "id": "dev",
      "title": "개발",
      "hint": null,
      "skills": [
        "프론트엔드",
        "백엔드",
        "데이터",
        "인프라",
        "AI/ML"
      ]
    },
    {
      "id": "design",
      "title": "디자인",
      "hint": "만드는 결과물 기준",
      "skills": [
        "PPT 디자인",
        "웹 디자인",
        "앱 디자인",
        "영상·모션",
        "브랜딩·그래픽"
      ]
    },
    {
      "id": "plan",
      "title": "기획",
      "hint": "무엇을 설계하는 기획인지 기준",
      "skills": [
        "비즈니스 모델 기획",
        "기술 설계 기획",
        "서비스 기획",
        "프로젝트 관리",
        "사업계획서·제안서"
      ]
    },
    {
      "id": "etc",
      "title": "발표·기타",
      "hint": null,
      "skills": [
        "발표·피칭",
        "마케팅·홍보",
        "리서치·사용자 조사",
        "문서 정리",
        "논문"
      ]
    }
  ]
}
```

### `PUT /api/v1/me/profile` — 내 프로필 저장

- **API id**: `profile.update` (프론트: `api.call('profile.update', …)`)
- **누가 부를 수 있나**: 회원 토큰
- **하는 일**: 닉네임·한 줄 강점·맡고 싶은 역할·할 수 있는 스킬을 저장한다. 진행 중인 세션에는 반영하지 않고 다음 세션부터 쓴다.

**요청 본문**

```json
{
  "nickname": "노형원",
  "strength": "발표 자료를 빠르게 잘 만들어요",
  "desiredRole": "개발·구현",
  "skills": [
    "프론트엔드",
    "백엔드",
    "PPT 디자인",
    "기술 설계 기획",
    "발표·피칭"
  ]
}
```

**응답** `200`

```json
{
  "nickname": "노형원",
  "strength": "발표 자료를 빠르게 잘 만들어요",
  "desiredRole": "개발·구현",
  "skills": [
    "프론트엔드",
    "백엔드",
    "PPT 디자인",
    "기술 설계 기획",
    "발표·피칭"
  ],
  "avatarUrl": null,
  "updatedAt": "2026-09-12T10:20:00+09:00"
}
```

**에러**

| code | HTTP | 언제 |
|---|---|---|
| `VALIDATION` | 400 | 닉네임 비어 있음 · 목록에 없는 스킬 |

**백엔드 메모**

- 세션에 들어갈 때 이 프로필을 "스냅샷"으로 복사해 둔다. 그래야 세션 중에 프로필을 바꿔도 AI 판단이 흔들리지 않는다.
