요약

도메인기능MethodURL (Base: /api/v1)설명
인증로그인POST/auth/signin이메일/비번으로 토큰 발급
회원가입POST/auth/signup신규 유저 등록 및 자동 로그인
학습세션 생성POST/sessions주제/난이도 설정 후 방 생성
세션 정보GET/sessions/{sessionId}현재 진행 중인 세션 상태 조회
질문 조회GET/sessions/{sessionId}/questions현재 풀어야 할 문제 조회
답변 제출POST/sessions/{sessionId}/answers답안 제출 및 다음 문제 트리거
아카이브기록 목록GET/users/{userId}/questions내가 푼 문제 리스트 (최신순)
상세 기록GET/users/{userId}/questions/{questionId}/answers특정 문제의 내 풀이 히스토리

프론트 라우팅

페이지 이름프론트 URL연결된 API 기능비고
로그인/auth/signinPOST /auth/signin로그인 성공 시 메인(/)으로 이동
회원가입/auth/signupPOST /auth/signup가입 성공 시 메인(/)으로 이동
메인 홈/(추후 유저 정보 조회 등)사이드바 포함된 기본 화면
세션 설정/interview/setupPOST /sessions주제, 난이도 선택 화면
실전 인터뷰/interview/:sessionIdGET /sessions/{id}/questions
POST /sessions/{id}/answers
핵심 화면. 질문 표시 및 답변 입력
결과 화면/interview/:sessionId/result(추후 결과 조회 API 필요 가능성 있음)모든 질문 종료 후 이동
문제 목록/archiveGET /users/{myId}/questions푼 문제 리스트 (카드 형태 등)
히스토리 상세/archive/:questionIdGET /users/{myId}/questions/{qid}/answers특정 문제 클릭 시 이동. 과거 내 답변 내역 확인

인증

로그인 API

1. 기본 정보

  • URL: /api/v1/auth/signin
  • Method: POST
  • 설명: 사용자의 이메일과 비밀번호를 받아 액세스 토큰을 발급합니다.

2. 요청 (Request)

Headers

  • Content-Type: application/json

Body

파라미터타입필수설명
emailStringY사용자 이메일
passwordStringY사용자 비밀번호

예시 코드

{
  "email": "user@example.com",
  "password": "password123"
}

3. 응답 (Response)

성공 (200 OK)

{
  "success": true,
  "data": {
    "accessToken": "eyJhbGciOiJIUz..."
	}
}

실패 (400 Bad Request)

  • message: “비밀번호가 일치하지 않습니다.”

회원가입 API

1. 기본 정보

  • URL: /api/v1/auth/signup
  • Method: POST
  • 설명: 신규 사용자를 등록하고 초기 포인트를 지급합니다.

2. 요청 (Request)

Body

파라미터타입필수설명
emailStringY사용자 이메일
passwordStringY사용자 비밀번호 (최소 8자)
nicknameStringY사용자 닉네임

예시 코드

{
  "email": "newuser@example.com",
  "password": "password123",
  "nickname": "코딩하는고양이"
}

3. 응답 (Response)

성공 (201 Created)

{
  "success": true,
  "data": {
    "userId": 1,
    "email": "newuser@example.com",
    "accessToken": "eyJhbGciOiJIUz...", // 바로 로그인 처리
    "message": "회원가입이 완료되었습니다."
  }
}

실패 (400 Bad Request)

  • message: “이미 존재하는 이메일입니다.”

2. 학습세션

면접 생성 API

1. 기본 정보

  • URL: /api/v1/sessions
  • Method: POST
  • 설명: 주제와 난이도, 배팅 포인트를 설정하여 새로운 면접 세션을 생성합니다.

2. 요청 (Request)

Headers

  • Authorization: Bearer {accessToken}

Body

파라미터타입필수설명
categoryStringY면접 주제 (예: “CS”, “Frontend”)
difficultyStringY난이도 (“EASY”, “NORMAL”, “HARD”)
bettingPointNumberN걸고 싶은 포인트 (기본값: 0)

예시 코드

{
  "category": "CS",             // DB: category
  "mode": "STUDY",          // DB: mode ('STUDY' or 'BATTLE')
  "difficulty": "NORMAL",       // DB: difficulty (질문 필터링용)
  "targetQuestionCount": 10,    // DB: target_question_count
  "bettingPoint": 10,
  "autoPass": true,
  "timerSetting": 60,           // DB: timer_setting
  "opponentId": null,            // (선택) 배틀일 경우 상대방 ID
}

3. 응답 (Response)

성공 (201 Created)

{
  "success": true,
  "data": {
    "sessionId": 105, // DB: study_sessions.id 
    "message": "세션이 생성되었습니다."
  }
}

실패 (400 Bad Request)

  • message: “보유 포인트가 부족하여 배팅할 수 없습니다.”

면접 정보 조회 API

1. 기본 정보

  • URL: /api/v1/sessions/{sessionId}
  • Method: GET
  • 설명: 면접 세션 정보를 가져옵니다.

2. 요청 (Request)

Headers

  • Authorization: Bearer {accessToken}

3. 응답 (Response)

성공 (201 Created)

{
  "success": true,
  "data": {
    "sessionId": 105,
    "category": "OS", 
    "difficulty": "NORMAL",
    "mode": "STUDY",
	"bettingPoint": 10,
	"targetQuestionCount": 10,
	"currentSequence": 3,
	"autoPass": true,
	"timerSetting": 60,
	"opponentId": null
  }
}

실패 (400 Bad Request)

  • message: “존재하지 않는 면접 세션입니다.”

질문 요청 API

1. 기본 정보

  • URL: /api/v1/sessions/{sessionId}/questions
  • Method: GET
  • 설명: 현재 인터뷰에 해당하는 질문을 정보를 조회합니다.

2. 요청 (Request)

Headers

  • Authorization: Bearer {accessToken}

3. 응답 (Response)

성공 (200 OK) - 질문이 남았을 때

{
  "success": true,
  "data": {
    "status": "ONGOING",
    "questionId": 105,
    "question": "멀티 스레드 환경의 문제점은?",
    "type": "SHORT_ANSWER",              // DB: questions.type
    "details": null,                     // 객관식이면 보기 배열 포함
    
    // 진행 상황 표시용
    "currentSequence": 3,                // solved_question_count + 1
    "targetQuestionCount": 10,
    "timer": 60
  },
  "error": null
}

성공 (200 OK) - 면접 종료 시

{
  "success": true,
  "data": {
    "status": "COMPLETED",
    "resultSessionId": 105, // 결과 페이지로 이동시키기 위함
    "message": "모든 질문이 완료되었습니다."
  }
}

실패 (400 Bad Request)

  • message: “존재하지 않는 면접 세션입니다.”

답변 제출 API

1. 기본 정보

  • URL: /api/v1/sessions/{sessionId}/answers
  • Method: POST
  • 설명: 사용자의 답변(텍스트/음성)을 저장하고 AI의 다음 질문을 받아옵니다.

2. 요청 (Request)

Headers

  • Authorization: Bearer {accessToken}

Body

파라미터타입필수설명
questionIdNumberY질문 id
answerContentStringY사용자의 답변 텍스트
currentSequenceNumberY현재 몇 번째 질문인지 (1, 2…)

예시 코드

{
  "questionId": 201,
  "content": "데드락이 발생할 수 있습니다.", // 사용자가 쓴 답
  "elapsedTime": 15,                     // 사용자가 쓴 시간 (초 단위)
  "currentSequence": 3,
}

3. 응답 (Response)

**성공 (200 OK)

{
  "success": true,
  "data": {
    "message":  "답변이 완료 되었습니다."   
    "score": 0 // (면접은 Async라 0일 수 있고, 배틀은 즉시 100/0 나옴)
  }
}

3. 기록 보관소 (Archive)

기록 목록 조회 API

1. 기본 정보

  • URL: `/api/v1/users/{userId}/questions?answered=true
  • Method: GET
  • 설명: 사용자가 완료한 과거 질문 리스트를 최신순으로 조회합니다.

2. 요청 (Request)

Headers

  • Authorization: Bearer {accessToken}

Query Parameter

  • page: 페이지 번호 (기본: 1)

3. 응답 (Response)

성공 (200 OK)

{
  "success": true,
  "data": {
    "list": [
      {
        "questionId": 105,           // 클릭 시 이 ID를 들고 상세 페이지로 이동
        "category": "CS",
        "questionContent": "프로세스와 스레드의 차이는?",
        "mode": "STUDY",
        "difficulty": "NORMAL",
		"type": "LONG_ANSWER",
		"details": null,
        
        // [최신 풀이 정보 요약]
        "lastAnswerId": 505,         // 가장 최근 답변 ID
        "lastScore": 90,             // 가장 최근 점수 (성장했는지 확인용)
        "lastAnsweredAt": "2026-01-23T18:00:00",
        
        // [핵심] 몇 번 도전했는지 표시 (UX 포인트!)
        "attemptCount": 3            // "3번의 풀이 기록이 있습니다" 배지 표시용
      },
      {
        "questionId": 102,
        "category": "NETWORK",
        "questionContent": "TCP와 UDP의 차이?",
        "mode": "STUDY",
        "difficulty": "NORMAL",
        "type": "LONG_ANSWER",
        "details": null
    
        "lastAnswerId": 501,
        "lastScore": 50,             // 아직 점수가 낮음 (복습 필요)
        "lastAnsweredAt": "2026-01-22T10:00:00",
        "attemptCount": 1
      }
    ],
    "totalCount": 2 // 유니크한 질문 개수
  }
}

질문에 대한 답변 조회 API

1. 기본 정보

  • URL: /api/v1/users/{userId}/questions/{questionsId}/answers
  • Method: GET
  • 설명: 특정 면접의 질문, 내 답변, 그리고 AI 피드백을 상세 조회합니다.

2. 요청 (Request)

Headers

  • Authorization: Bearer {accessToken}

3. 응답 (Response)

성공 (200 OK)

{
  "success": true,
  "data": {
    "question": {
	    "id": 105,
        "category": "CS",
        "questionContent": "프로세스와 스레드의 차이는?",
        "mode": "STUDY",
        "difficulty": "NORMAL",
		"type": "LONG_ANSWER",
		"details": null,
    },
    "history": [ // 최신순 정렬
      {
        "answerId": 505,
        "content": "프로세스는 독립적이고 스레드는 공유합니다...",
        "score": 90,
        "feedbackContent": "완벽합니다! 저번보다 훨씬 좋아졌네요.",
        "elapsedTime": 30,
        "answeredAt": "2026-01-23T18:00:00" // 오늘 푼 것
      },
      {
        "answerId": 402,
        "content": "프로세스는 실행 중인 프로그램입니다.",
        "score": 50,
        "feedbackContent": "스레드에 대한 설명이 누락되었습니다.",
        "elapsedTime": 15,
        "answeredAt": "2026-01-20T14:00:00" // 3일 전 푼 것 (과거 기록)
      },
      {
        "answerId": 301,
        "content": "잘 모르겠습니다.",
        "score": 0,
        "feedbackContent": "학습이 필요합니다.",
        "elapsedTime": 5,
        "answeredAt": "2026-01-10T09:00:00" // 처음 푼 것
      }
    ]
  }
}