API Table - green-room-app/GreenRoom_Server Wiki

Index

  1. 공통사항
대분류 기능 method URI
서버 상태 체크 서버 상태 체크 GET /api/health
인증 관련 로그인 POST /api/auth/login
로그아웃 POST /api/auth/logout
토큰갱신 POST /api/auth/reissue
유저 관련 회원가입 POST /api/users/join
회원정보 조회 GET /api/users
회원정보 수정 PUT /api/users
프로필 이미지 수정 PUT /api/users/profile-image
닉네임 중복 체크 GET /api/users/name
회원탈퇴 DELETE /api/users
그린룸 질문 관련 그린룸질문 생성 POST /api/green-questions
최근 그린룸질문 목록 조회 GET /api/green-questions/recent-questions
특정 직무카테고리 그린룸질문 목록 조회 GET /api/green-questions
인기 그린룸질문 목록 조회 GET /api/green-questions/popular-questions
그린룸질문 답변 생성 POST /api/green-questions/answer
그린룸질문 상세정보 조회 GET /api/green-questions/{id}
그린룸질문에 달린 답변 목록 조회 GET /api/green-questions/{id}/answers
그린룸질문 답변 1건 조회 GET /api/green-questions/answer/{id}
그린룸질문 그룹에 담기 POST /api/green-questions/group
그린룸질문 스크랩 POST /api/green-questions/scrap
스크랩한 그린룸질문 목록 조회 GET /api/green-questions/scrap
스크랩한 그린룸질문 삭제 POST /api/green-questions/delete-scrap
자신이 생성한 그린룸질문 조회 GET /api/green-questions/create-questions
참여한 그린룸질문 목록 조회 GET /api/green-questions/involve-questions
그린룸질문 삭제 DELETE /api/green-questions/{id}
인기 검색어 조회 GET /api/public-questions/popular-search-words
마이질문(나만 볼 수 있는 질문) 관련 마이질문 생성 POST /api/my-questions
마이질문 목록 조회 GET /api/my-questions
마이질문 1건 조회 GET /api/my-questions/{id}
마이질문 질문 수정 PUT /api/my-questions/{id}
마이질문 답변/키워드 등록/수정 PUT /api/my-questions/answer/{id}
마이질문 삭제 DELETE /api/my-questions/{id}
그룹 관련 그룹 생성 POST /api/groups
그룹 목록 조회 GET /api/groups
그룹 수정 PUT /api/groups/{id}
그룹 삭제 DELETE /api/groups/{id}
그룹에 속한 면접 질문 조회 GET /api/groups/{id}/questions
그룹에 속한 질문을 다른 그룹으로 변경 POST /api/groups/move-questions
그룹에 속한 질문 삭제 POST /api/groups/delete-questions
키워드 연습 관련 면접 연습용 질문 조회 GET /api/interview-questions
면접 연습용 질문 담기 POST /api/interview-questions

공통사항

API 사용시 유의점

  • request 시 application/json 사용
  • response 시 마찬가지로 content-type 을 application/json 으로 응답함

Request header 형식

  • 회원 인증이 필요한 API의 경우 추가해야함(비회원 제외)

    key type value
    Authorization string Bearer {jwt}
  • Authorization value의 예시

    Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJuaWNrTmFtZSI6ImtldmluX3N1Z28iLCJyb2xlcyI6WyJST0xFX1VTRVIiXSwiaXNzIjoiYWxnb3JpdGhtX3F1aXpfY3VyYXRvciIsImV4cCI6MTYyNzE5ODQwNSwiaWF0IjoxNjI3MTk0ODA1LCJ1c2VySWQiOiJ6b3JvXzI4MjUiLCJ1c2VyS2V5IjoyOH0.Ahl9IuevGfDTxxVlowf9RWAPPFcXKAsJuGLpXNTGYFxTlmWCBGl0Otgjn3LKslEynv8wo6yxuOZ1vvrJCWo-kw
    

Response body 형식

  • 데이터 예시 (성공 응답)

    {
        "응답 내용(스트링이 아니라 객체)"
    }
  • 데이터 예시 (실패 응답)

    {
        "message": "에러 내용"
    }
  • 데이터 예시 (실패 응답)

    • Request param에서 Required true인 필드를 제외하고 요청을 하거나, 올바르지 않은 값을 요청한 경우 잘못된 필드에 대해 아래와 같이 응답을 준다..

      {
          "message": {
              "question": "question 값은 필수입니다."
          }
      }
      {
          "message": {
              "question": "question 값은 필수입니다.",
              "categoryId": "categoryId 값은 필수입니다."
          }
      }

중요사항

  • 회원 인증이 필요하지 않은 API는 별도로 회원 인증이 필요하지 않은 API라고 기입합니다.
    • API 명세에 '회원 인증이 필요하지 않은 API'라는 내용이 없다면 회원 인증이 필요한 API로 Request Header에 Jwt 추가가 필요
  • API 응답으로 실패 케이스를 정의할 때, Request 필드 중에 Required true인 필드를 제외하고 요청을 하거나, 올바르지 않은 값을 요청한 경우는 따로 명시하지 않습니다.

서버 상태 체크

  • 회원 인증이 필요하지 않은 API
  • 서버 상태 체크 API

URL

  • API 서버: GET /api/health

Request

Request 예시

Response

  • 성공(200)
    • 현재 timestamp를 리턴한다.
{
    1650430789815
}

Login

  • 회원 인증이 필요하지 않은 API
  • 회원가입을 한 사용자는 로그인을 할 수 있다.

URL

  • POST /api/auth/login

Request

param body/param Type Description Required
accessToken request body String 플랫폼별 로그인 API access_token true
oauthType request body Integer 플랫폼 코드. (0: 카카오, 1: 네이버, 2: 애플) true

Request 예시

{
    "accessToken": "S_dZsYZBTR9_y4H438pzY_Vv4zasdfasdfUNyugmIYy2Ofi5Cie4gYcQZsM0wAAAYJ0OqFI",
    "oauthType": 0
}
{
    "accessToken": "AAAANyNIre4gYcQZwWGGtFOasdfAV6Rce4gYcQZY9REksE_IwFfMhw4sMQf1jmbSvqVHeasdfasdf5BlPO2e9Kqi2sKRvjxpsyq5WaFTRL2qh0",
    "oauthType": 1
}

Response

  • 성공(200)
{
    "accessToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJvYXV0aElkIjoiMjM3NzMyNTM3NCIsInJvbGVzIjpbIlJPTEVfVVNFUiJdLCJpc3MiOiJsb2NhbCIsImlkIjoxLCJvYXV0aFR5cGUiOjAsImV4cCI6MTY1OTgxNTk4NSwiaWF0IjoxNjU5ODA4Nzg1e4gYcQZfQ.UyhQs1jDhiymv9MJozxPmeoFmdguIWBt3ZHcRAligUEUyKAKA8CK4pXW4FJ8Hq1qmn3E-tYMhnxqnG7QXZ3T6g",
    "refreshToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJe4gYcQZ9.eyJpc3MiOiJsb2NhbCIsImV4cCI6MTY1OTg5NTE4NSwiaWF0IjoxNjU5ODA4Nzg1fQ.an6QBrX_1zjTWmLPk08jbEQwl2UdD3NmxlmfmkdAoEayAZnGtCELJLhVr3-VfR33UUfBducYdP6KrurOqtFa7g",
    "expiresIn": 7200,
    "refreshTokenExpiresIn": 86400
}
  • 실패(400)
    • 회원가입하지 않은 사용자가 로그인 시도를 한 경우
{
    "message": "Could not found 'User' with query values (oauthId = 1238912839, oauthType = kakao)"
}
  • 실패(400)
    • 탈퇴하고 한 달이 지나지 않은 회원이 회원가입을 시도한 경우
{
    "message": "탈퇴한 계정입니다."
}
  • 실패(401)
    • 유효하지 않은 토큰으로 요청 시
{
    "message": "401 Unauthorized: \"{\"msg\":\"this access token does not exist\",\"code\":-401}\""
}

Logout

  • 로그인한 사용자는 로그아웃을 할 수 있다.

URL

  • POST /api/auth/logout

Request

  • None

Response

  • 성공(200)
{
}

토큰갱신

  • 회원 인증이 필요하지 않은 API
  • 사용자는 리프래시 토큰을 사용하여 api 토큰을 갱신할 수 있다.

URL

  • POST /api/auth/reissue

Request

param body/param Type Description Required
accessToken request body String 로그인 시 발급받았던 accessToken true
refreshToken request body String 리프래시 토큰 true

Request 예시

{
    "accessToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJvYXV0aElkIjoibGFfZXRMelF4RVcxRllTOWlwWjRUd051cnZWSkN5TmhhVXZ0TnAzejVQNCIsInJvbGVzIjpbIlJPTEVfVVNFUiJdLCJpc3MiOiJsb2NhbCIsImlkIjoyLCJvYXV0e4gYcQZaFR5cGUiOjEsImV4cCI6MTY1OTgxNjc4MywiaWF0IjoxNjU5ODA5NTgzfQ.MHaaiTkZhTLo9eLbSvFrXKU9Z15P-yp5OQp6CEVkGnJCJP2T8_uTQo9ggcq2rE5EX8eAa1ku6MRDPmKho40W6Q",
    "refreshToken": "eyJ0eXAiOiJKV1QiLCJhbGe4gYcQZciOiJIUzUxMiJ9.eyJpc3MiOiJsb2NhbCIsImV4cCI6MTY1OTg5NTk4MywiaWF0IjoxNjU5ODA5NTgzfQ.xLYTN7slUeWdbgMNJdqwUE6ZYCg0ap_ksN7F6P-3qg1vUG5j_ETvJVU5MO744IP6aAGLr4VRRFwKB0ffQOFSOQ"
}

Response

  • 성공(200)
{
    "accessToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJvYXV0aElkIjoibGFfZXRMelF4RVcxRllTOWlwWjRUd051cnZWSkN5TmhhVXZ0TnAzejVQNCIsInJvbGVzIjpbIlJPTEVfVVNFUiJdLCJpc3MiOiJsb2NhbCIsImlkIjoyLCe4gYcQZJvYXV0aFR5cGUiOjEsImV4cCI6MTY1OTgxNjk4MiwiaWF0IjoxNjU5ODA5NzgyfQ.9_tDxXu7XXhys4EUxmdFTPqk6O8HpukO5Wq2v0Sg6imDvmXUgcYuiwHjyaysl2ZYa8KAQYA5af5P3aSB19sotA",
    "refreshToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJpc3MiOiJsb2e4gYcQZNhbCIsImV4cCI6MTY1OTg5NjE4MiwiaWF0IjoxNjU5ODA5NzgyfQ.4TDWB6UxT4X7to7jekPfb5pmlNLeJqT9Ular2tgB1_w8R1b4Mh2l97QfGZxL8rHiX_cST5mZz4hzI_dDfL9wgA",
    "expiresIn": 7200,
    "refreshTokenExpiresIn": 86400
}
  • 실패(403)
    • 유효하지 않은 토큰으로 요청 시
{
    "message": "Authority error: (cause: Invalid refreshToken)"
}
  • 실패(403)
    • 마지막으로 갱신한 리프래시 토큰이 아닐 시
    • 요청한 토큰 자체는 유효하지만, 서버에게 마지막으로 받은 리프래시 토큰이 아닌 경우
{
    "message": "Authority error: (cause: Mismatched refreshToken)"
}

User

회원가입

  • 회원 인증이 필요하지 않은 API
  • 사용자는 회원가입을 할 수 있다.

URL

  • POST /api/users/join

Request

param body/param Type Description Required
accessToken request body String 플랫폼별 로그인 API access_token true
oauthType request body Integer 플랫폼 코드. (0: 카카오, 1: 네이버, 2: 애플) true
categoryId request body Integer 카테고리 id. (1~12 사이의 숫자) true
name request body String 닉네임 (8자 이하만 가능) true

Request 예시

{
    "accessToken": "yz6123kepyF2qasdfe4gYcQZkar1234dGvQ321asdfasfHrSasdfx0I2341PDZYigqe_04E40w",
    "oauthType": 0,
    "categoryId": 1,
    "name": "테스트 닉네임"
}
{
    "accessToken": "AAAAN7OrQMRzvV60awxBTP7u5mlDgeVfpsH11qnQyIp0B7mv05MQ5oWXuBZw8nttb9H8xJ9kw3KmKmpidWO7X1N9jN4",
    "oauthType": 1,
    "categoryId": 1,
    "name": "테스트 닉네임"
}

Response

  • 성공(200)
{
    "id": 1
}
  • 실패(400)
    • 탈퇴하고 한 달이 지나지 않은 회원이 회원가입을 시도한 경우
{
    "message": "탈퇴한 회원은 한 달동안 재가입할 수 없습니다."
}
  • 실패(401)
    • 유효하지 않은 토큰으로 요청 시
{
    "message": "401 Unauthorized: \"{\"msg\":\"this access token does not exist\",\"code\":-401}\""
}

회원정보 조회

  • 사용자는 자신의 회원정보를 조회할 수 있다.

URL

  • GET /api/users

Request

  • None

Response

field_name description
categoryId 직무 카테고리 id
category 직무 카테고리명
name 닉네임
profileImage 프로필 이미지 presigned URL(프로필 이미지가 없을 시 빈 스트링(""))
  • 성공(200)
{
    "categoryId": 1,
    "category": "공통",
    "name": "테스트유저",
    "profileImage": ""
}

회원정보 수정

  • 사용자는 회원정보를 수정할 수 있다.

URL

  • PUT /api/users

Request

param body/param Type Description Required
name request body String 닉네임 (8자 이하만 가능) false
categoryId request body Long 관심 직무 카테고리 false

Request 예시

{
    "categoryId": 1
}
{
    "name": "테스트"
}
{
    "categoryId": 2,
    "name": "테스트"
}

Response

  • 성공(200)
  • 실패(400)
    • namecategoryId 필드가 모두 비어있는 경우
{
    "message": "name과 categoryId 필드 중 적어도 하나는 있어야 합니다."
}

프로필 이미지 수정

  • 사용자는 프로필 이미지를 수정할 수 있다.

URL

  • PUT /api/users/profile-image

Request

param body/param Type Description Required
profileImage request body String 프로필 이미지(.png, .jpeg, .jpg 확장자만 가능) true

Request 예시

{
    "profileImage": "user-profile-image.png"
}

Response

  • 성공(200)
    • 응답으로 내려온 profileImage은 PUT URL이므로, 해당 PresignedUrl을 이용해서 직접 이미지를 등록해야 한다. (조회용 URL X)
{
    "profileImage": "https://S3-BUCKET-URL/green-room-user-image/1/profile_image.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20220817T070707Z&X-Amz-SignedHeaders=host&X-Amz-Expires=599&X-Amz-Credential=AKIA4EAIYFA4UNFHSYQQ%2F20220817%2Fap-northeast-2%2Fs3%2Faws4_request&X-Amz-Signature=460031e66bd1c54a0dc5a2275436aa85d30c79363d11c7881827fef137c1ce71"
}
  • 실패(400)
    • png, jpeg, jpg 이외의 확장자 파일을 등록한 경우
{
    "message": "png, jpeg, jpg에 해당하는 파일만 업로드할 수 있습니다."
}

닉네임 중복 체크

  • 회원 인증이 필요하지 않은 API
  • 사용중인 닉네임 여부를 확인할 수 있다.

URL

  • GET /api/users/name

Request

param body/param Type Description Required
name query string String 중복 여부를 확인할 닉네임 true

Request 예시

  • GET /api/users/name?name=테스트닉네임
  • GET /api/users/name?name=hello

Response

  • 성공(200)
    • 존재하지 않는 닉네임인 경우
{
    true
}
  • 성공(200)
    • 이미 존재하는 닉네임인 경우
{
    false
}

회원탈퇴

  • 사용자는 서비스 회원탈퇴를 할 수 있다.

URL

  • DELETE /api/users

Request

  • None

Response

  • 성공(200)
{
}

그린룸질문

그린룸질문 생성

  • 사용자는 그린룸질문을 생성할 수 있다.

URL

  • POST /api/green-questions

Request

param body/param Type Description Required
categoryId request body Long 카테고리 id. (1~12 사이의 숫자) true
question request body String 질문 true
expiredAt request body datetime 질문 만료 시간(형식: yyyy-MM-dd'T'HH:mm:ss) true

Request 예시

{
    "categoryId": 3,
    "question": "살면서 가장 창의적인 경험은 무엇인가요??",
    "expiredAt": "2022-09-25T14:34:20"
}

Response

  • 성공(200)
{
    "id": 1
}
  • 실패(400)
    • expiredAt 필드 시간이 현재시간보다 이전 시간일 때
{
    "message": "마감 기한은 현재시간보다 앞선 시간일 수 없습니다."
}
  • 실패(400)
    • expiredAt 필드 시간이 현재시간보다 24시간을 초과하는 시간일 때
{
    "message": "마감 기한은 현재시간보다 24시간을 초과할 수 없습니다."
}
  • 실패(400)
    • question 필드 50자 입력 초과 시
{
    "message": "question 값은 50자 이하여야 합니다."
}
  • 실패(404)
    • 올바르지 않은 카테고리 id 입력 시
{
    "message": "Could not found 'Category' with query values (id = 13)"
}

최근 그린룸질문 목록 조회

  • 사용자는 최근 그린룸질문 목록을 조회할 수 있다.

URL

  • GET /api/green-questions/recent-questions

Request

  • None

Response

field_name description
id 그린룸질문 id
categoryName 질문 직무 카테고리
profileImage 질문 작성자의 프로필 이미지 presigned URL(프로필 이미지가 없을 시 빈 스트링(""))
question 질문
expiredAt 마감시간
participated 참여여부
expired 마감여부
  • 성공(200)
[
    {
        "id": 5,
        "categoryName": "공통",
        "profileImage": "",
        "question": "살면서 가장 창의적인 경험은 무엇인가요??",
        "expiredAt": "2022-09-25T14:34:20",
        "participated": false,
        "expired": false
    },
    {
        "id": 4,
        "categoryName": "공통",
        "profileImage": "",
        "question": "살면서 가장 창의적인 경험은 무엇인가요??",
        "expiredAt": "2022-09-25T14:34:20",
        "participated": false,
        "expired": false
    },
    {
        "id": 3,
        "categoryName": "공통",
        "profileImage": "",
        "question": "살면서 가장 창의적인 경험은 무엇인가요??",
        "expiredAt": "2022-09-25T14:34:20",
        "participated": false,
        "expired": false
    },
    {
        "id": 2,
        "categoryName": "공통",
        "profileImage": "",
        "question": "살면서 가장 창의적인 경험은 무엇인가요??",
        "expiredAt": "2022-09-25T14:34:20",
        "participated": false,
        "expired": false
    },
    {
        "id": 1,
        "categoryName": "공통",
        "profileImage": "",
        "question": "테스트 그린룸 질문입니다",
        "expiredAt": "2022-09-25T14:34:20",
        "participated": false,
        "expired": false
    }
]

특정 직무카테고리 그린룸질문 목록 조회

  • 사용자는 '직무(1개)'와 관련된 그린룸질문 목록을 조회할 수 있다.
    • 정렬기준: 1st.마감시간 기준 내림차순, 2nd.그린룸 id 기준 오름차순 (먼저 등록한 그린룸질문이 상단)

URL

  • GET /api/green-questions

Request

param body/param Type Description Required
categoryId request param Long 카테고리 id. (1~12 사이의 숫자) true
  • 예시 URL
    • GET /api/green-questions?categoryId=3

Response

field_name description
id 그린룸질문 id
categoryName 질문 직무 카테고리
profileImage 질문 작성자의 프로필 이미지 presigned URL(프로필 이미지가 없을 시 빈 스트링(""))
name 질문 작성자의 닉네임(탈퇴했거나 닉네임이 없을시 빈 스트링(""))
participants 질문에 참여한 사람 수
question 질문
answer 질문에 작성한 답변(참여안한 질문인 경우 빈 스트링(""))
expiredAt 마감시간
participated 나의 참여여부
  • 성공(200)
[
    {
        "id": 1,
        "categoryName": "대외활동",
        "profileImage": "",
        "name": "라이는코뿔소",
        "participants": 0,
        "question": "주변엔서 본인을 뭐라고 부르나요?",
        "answer": "",
        "expiredAt": "2022-09-27T14:34:20",
        "participated": false
    },
    {
        "id": 2,
        "categoryName": "대외활동",
        "profileImage": "",
        "name": "라이는코뿔소",
        "participants": 1,
        "question": "왜 이 직무를 지원했나요?",
        "answer": "그린룸 답변 입니다",
        "expiredAt": "2022-09-27T14:34:20",
        "participated": true
    },
    {
        "id": 3,
        "categoryName": "대외활동",
        "profileImage": "",
        "name": "라이는코뿔소",
        "participants": 1,
        "question": "본인 성격의 장단점은?",
        "answer": "그린룸 답변 입니다",
        "expiredAt": "2022-09-27T14:34:20",
        "participated": true
    }
]

인기 그린룸질문 목록 조회

  • 사용자는 인기 그린룸질문 목록을 조회할 수 있다.
    • 정렬기준: 1st.참여자수 기준 내림차순, 2nd. 마감시간 기준 오름차순

URL

  • GET /api/green-questions/popular-questions

Request

  • None

Response

field_name description
id 그린룸질문 id
categoryName 질문 직무 카테고리
profileImage 질문 작성자의 프로필 이미지 presigned URL(프로필 이미지가 없을 시 빈 스트링(""))
name 질문 작성자의 닉네임(탈퇴했거나 닉네임이 없을시 빈 스트링(""))
participants 질문에 참여한 사람 수
question 질문
expiredAt 마감시간
  • 성공(200)
[
    {
        "id": 2,
        "categoryName": "인턴",
        "profileImage": "",
        "name": "라이는코뿔소",
        "participants": 1,
        "question": "꿈이 무엇인가요?",
        "expiredAt": "2022-09-27T14:34:20"
    },
    {
        "id": 3,
        "categoryName": "대외활동",
        "profileImage": "",
        "name": "라이는코뿔소",
        "participants": 0,
        "question": "학점이 왜 이렇게 낮나요?",
        "expiredAt": "2022-09-27T14:34:20"
    }
]

그린룸질문 답변 생성

  • 사용자는 그린룸질문에 대한 답변을 생성할 수 있다.

URL

  • POST /api/green-questions/answer

Request

param body/param Type Description Required
id request body Long 그린룸질문 id true
answer request body String 답변 true
keywords request body String[] 답변 키워드 false

Request 예시

  • 답변만 등록
{
    "id": 1,
    "answer": "그린룸 답변 입니다"
}
  • 답변, 키워드 같이 등록
{
    "id": 3,
    "answer": "그린룸 답변 입니다",
    "keywords": ["그린룸","답변"]
}

Response

  • 성공(200)
{
    "id": 205
}
  • 실패(400)
    • answer 필드 500자 입력 초과 시
{
    "message": "answer 값은 500자 이하여야 합니다."
}
  • 실패(400)
    • 존재하지 않는 그린룸 질문 id를 입력한 경우
{
    "message": "Could not found 'GreenRoomQuestion' with query values (id = 7)"
}

그린룸질문 상세정보 조회

  • 사용자는 그린룸질문의 상세 정보를 조회할 수 있다.

URL

  • GET /api/green-questions/{id}

Request

  • None

Response

field_name description
id 그린룸질문 id
categoryName 질문 직무 카테고리
question 질문
participants 참여자 수
participated 해당 그린룸 질문 참여여부
scrap 스크랩 여부
writer 그린룸질문 개설자 여부
expired 질문 만료여부
expiredAt 마감시간
  • 성공(200)
{
    "id": 1,
    "participants": 0,
    "expiredAt": "2022-09-27T14:34:20",
    "question": "살면서 가장 창의적인 경험은 무엇인가요??",
    "categoryName": "대외활동",
    "participated": false,
    "scrap": false,
    "writer": true,
    "expired": false
}

그린룸질문에 달린 답변 목록 조회

  • 그린룸 답변에 참여한 사용자는 마감시간이 지난 그린룸질문의 답변자들의 답변 목록을 조회할 수 있다.

URL

  • GET /api/green-questions/{id}/answers

Request

  • None

Response

field_name description
id 답변 id
profileImage 답변 작성자의 프로필 이미지 presigned URL(프로필 이미지가 없을 시 빈 스트링(""))
answer 답변
  • 성공(200)
[
    {
        "id": 1,
        "profileImage": "",
        "answer": "그린룸 답변 입니다"
    }
]
  • 실패(403)
    • 권한이 없는 사용자(질문 참여자가 아닌 사용자)가 API를 호출한 경우
{
    "message": "질문 참여자만 다른 사람이 남긴 답변을 조회할 수 있습니다."
}

그린룸질문 답변 1건 조회

  • 그린룸 답변에 참여한 사용자는 그린룸질문에 달린 답변 1건을 조회할 수 있다.

URL

  • GET /api/green-questions/answer/{id}

Request

  • None

Response

field_name description
id 답변 id
profileImage 답변 작성자의 프로필 이미지 presigned URL(프로필 이미지가 없을 시 빈 스트링(""))
name 답변 작성자 닉네임
answer 답변
keywords 키워드
  • 성공(200)
{
    "id": 1,
    "profileImage": "",
    "name": "라이는코뿔소",
    "answer": "그린룸 답변 입니다",
    "keywords": []
}
  • 실패(403)
    • 권한이 없는 사용자(질문 참여자가 아닌 사용자)가 API를 호출한 경우
{
    "message": "질문 참여자만 다른 사람이 남긴 답변을 조회할 수 있습니다."
}

그린룸질문 그룹에 담기

  • 사용자는 그린룸질문을 그룹에 담을 수 있다.

URL

  • POST /api/green-questions/group

Request

param body/param Type Description Required
groupId request body Long 그룹 id true
questionId request body Long 그린룸질문 id true

Request 예시

{
    "groupId": 1,
    "questionId": 1
}

Response

  • 성공(200)
{
    "id": 1
}
  • 실패(400)
    • 존재하지 않는 그룹 id를 입력한 경우
{
    "message": "Could not found 'QuestionGroup' with query values (id = 10)"
}
  • 실패(400)
    • 존재하지 않는 그린룸 질문 id를 입력한 경우
{
    "message": "Could not found 'GreenRoomQuestion' with query values (id = 10)"
}

그린룸질문 스크랩

  • 사용자는 그린룸질문을 스크랩할 수 있다.

URL

  • POST /api/green-questions/scrap

Request

param body/param Type Description Required
id request body Long 그린룸질문 id true

Request 예시

{
    "id": 1
}

Response

  • 성공(200)
{
    "id": 1
}
  • 실패(400)
    • 존재하지 않는 그린룸 질문 id를 입력한 경우
{
    "message": "Could not found 'GreenRoomQuestion' with query values (id = 7)"
}

스크랩한 그린룸질문 목록 조회

  • 사용자는 자신이 스크랩한 그린룸질문 목록을 조회할 수 있다.

URL

  • GET /api/green-questions/scrap

Request

  • None

Response

field_name description
id 스크랩 id
categoryName 질문 직무 카테고리
profileImage 질문 작성자의 프로필 이미지 presigned URL(프로필 이미지가 없을 시 빈 스트링(""))
question 질문
expiredAt 마감시간
participated 해당 그린룸 질문 참여여부
expired 질문 만료여부
  • 성공(200)
[
    {
        "id": 3,
        "categoryName": "대외활동",
        "profileImage": "",
        "question": "살면서 가장 창의적인 경험은 무엇인가요??",
        "expiredAt": "2022-09-25T14:34:20",
        "participated": false,
        "expired": true
    },
    {
        "id": 2,
        "categoryName": "대외활동",
        "profileImage": "",
        "question": "살면서 가장 창의적인 경험은 무엇인가요??",
        "expiredAt": "2022-09-25T14:34:20",
        "participated": false,
        "expired": true
    },
    {
        "id": 1,
        "categoryName": "대외활동",
        "profileImage": "",
        "question": "살면서 가장 창의적인 경험은 무엇인가요??",
        "expiredAt": "2022-09-25T14:34:20",
        "participated": false,
        "expired": true
    }
]

스크랩한 그린룸질문 삭제

  • 사용자는 자신이 스크랩한 그린룸질문을 삭제할 수 있다.

URL

  • POST /api/green-questions/delete-scrap

Request

param body/param Type Description Required
ids request body List 삭제할 스크랩 id List (최대 10개) true

Request 예시

{
    "ids": [208,207,209]
}

Response

  • 성공(200)
{
}
  • 실패(400)
    • ids 배열 길이가 10을 초과하는 경우
{
    "message": {
        "ids": "크기가 0에서 10 사이여야 합니다"
    }
}

자신이 생성한 그린룸질문 조회

  • 사용자는 자신이 생성한 그린룸질문을 조회할 수 있다

URL

page는 0부터 시작

  • GET /api/green-questions/create-questions
  • GET /api/green-questions/create-questions?page=1
  • GET /api/green-questions/create-questions?page=2
  • GET /api/green-questions/create-questions?page=3
  • GET /api/green-questions/create-questions?page=4

Request

  • None

Response

field_name description
id 그린룸질문 id
participants 질문에 참여자 수
profileImages 질문 작성자의 프로필 이미지 presigned URL 리스트, (프로필 이미지가 없을 시 빈 스트링(""))
question 질문
existed 생성한 그린룸질문 존재 유무
hasPrev 이전 데이터 존재 유무
hasNext 다음 데이터 존재 유무
  • 성공(200)
    • 생성한 그린룸 질문이 없는 경우, 또는 page 범위를 벗어난 데이터를 요청한 경우
      • existed 필드가 false
{
    "id": null,
    "participants": 0,
    "question": null,
    "profileImages": null,
    "existed": false,
    "hasPrev": false,
    "hasNext": false
}
  • 성공(200)
    • 맨처음 데이터(hasPrev: false, hasNext: true)
{
    "id": 5,
    "participants": 0,
    "question": "살면서 가장 창의적인 경험은 무엇인가요??",
    "profileImages": [],
    "existed": true,
    "hasPrev": false,
    "hasNext": true
}
  • 성공(200)
    • 중간 데이터(hasPrev: true, hasNext: true)
{
    "id": 4,
    "participants": 0,
    "question": "살면서 가장 창의적인 경험은 무엇인가요??",
    "profileImages": [],
    "existed": true,
    "hasPrev": true,
    "hasNext": true
}
  • 성공(200)
    • 마지막 데이터(hasPrev: true, hasNext: false)
{
    "id": 1,
    "participants": 0,
    "question": "살면서 가장 창의적인 경험은 무엇인가요??",
    "profileImages": [],
    "existed": true,
    "hasPrev": true,
    "hasNext": false
}

참여한 그린룸질문 목록 조회

  • 사용자는 자신이 참여한 그린룸질문 목록을 조회할 수 있다

URL

  • GET /api/green-questions/involve-questions
  • GET /api/green-questions/involve-questions?category=1
  • GET /api/green-questions/involve-questions?category=1,2,3

Request

param body/param Type Description Required
category request param String 직무 카테고리 id. (1~12 사이의 숫자) false
직무 카테고리 1건 조회 시 - category=1
직무 카테고리 2건 이상 조회 시 - category=1,2,3,4,5

Response

field_name description
id 그린룸질문 id
categoryName 질문의 직무카테고리
profileImage 질문 작성자의 프로필 이미지 presigned URL(프로필 이미지가 없을 시 빈 스트링(""))
question 질문
  • 성공(200)
    • 기본질문
[
    {
        "id": 3,
        "categoryName": "대외활동",
        "profileImage": "",
        "question": "살면서 가장 창의적인 경험은 무엇인가요??"
    },
    {
        "id": 2,
        "categoryName": "인턴",
        "profileImage": "",
        "question": "살면서 가장 창의적인 경험은 무엇인가요??"
    },
    {
        "id": 1,
        "categoryName": "공통",
        "profileImage": "",
        "question": "살면서 가장 창의적인 경험은 무엇인가요??"
    }
]

그린룸질문 삭제

  • 사용자는 그린룸질문을 삭제할 수 있다.

URL

  • DELETE /api/green-questions/{id}

Request

  • None

Response

  • 성공(200)
{
}
  • 실패(400)
    • 그린룸 질문에 답변을 단 사용자가 있는 경우 삭제 불가능
{
    "message": "질문에 답변을 단 참여자가 있는 경우 삭제할 수 없습니다."
}
  • 실패(403)
    • 권한이 없는 사용자(본인 질문이 아닌 경우)가 API를 호출한 경우
{
    "message": "그룹 생성자만 그룹을 삭제할 수 있습니다"
}

인기 검색어 조회

  • 사용자는 현재 인기 검색어를 조회할 수 있다.
    • 현재 인기 검색어의 정의는 한글만 가능하도록 했습니다.
      • 단어 내 띄어쓰기 포함 가능
      • 자음이 포함되어 있는 경우 식별X(ex. 인턴ㅇ)
      • 영어 포함되있는 경우 식별X(ex. 인턴 hello)

URL

  • GET /api/public-questions/popular-search-words

Request

  • None

Response

  • 성공(200)
    • 현재시간 기준 '누적 조회 수'가 높은 최대 5개(0개~5개)의 검색어를 반환
[
    "인턴",
    "갈등",
    "힘든 경험",
    "전공 학점",
    "최근에"
]
  • 성공(200)
    • 현재시간 기준 인기 검색어가 없는 경우 빈 리스트 반환
[
]

마이질문(나만 볼 수 있는 질문)

마이질문 생성

  • 사용자는 마이질문(나만 볼 수 있는 질문)를 생성할 수 있다.

URL

  • POST /api/my-questions

Request

param body/param Type Description Required
categoryId request body Long 카테고리 id. (1~12 사이의 숫자) true
question request body String 질문 true

Request 예시

{
    "categoryId": 1,
    "question": "살면서 가장 창의적인 경험은 무엇인가요??"
}

Response

  • 성공(200)
{
    "id": 1
}
  • 실패(400)
    • question 필드 50자 입력 초과 시
{
    "message": "question 값은 50자 이하여야 합니다."
}
  • 실패(404)
    • 올바르지 않은 카테고리 id 입력 시
{
    "message": "Could not found 'Category' with query values (id = 13)"
}

마이질문 목록 조회

  • 사용자는 자신이 작성한 마이질문(나만 볼 수 있는 질문) 목록을 조회할 수 있다.

URL

  • GET /api/my-questions

Request

  • None

Response

field_name description
id 마이질문 id
groupName 그룹명(그룹이 없을 시 빈 스트링(""))
groupCategoryName 그룹의 직무 카테고리(그룹이 없을 시 빈 스트링(""))
categoryName 질문의 직무 카테고리
question 질문
  • 성공(200)
[
    {
        "id": 209,
        "groupName": "삼성전자 면접 준비",
        "groupCategoryName": "공통",
        "categoryName": "공통",
        "question": "갈등을 해결해본 경험이 있나요??"
    },
    {
        "id": 208,
        "groupName": "삼성전자 면접 준비",
        "groupCategoryName": "공통",
        "categoryName": "공통",
        "question": "살면서 가장 창의적인 경험은 무엇인가요??"
    },
    {
        "id": 207,
        "groupName": "",
        "groupCategoryName": "",
        "categoryName": "공통",
        "question": "살면서 가장 창의적인 경험은 무엇인가요??"
    },
    {
        "id": 206,
        "groupName": "",
        "groupCategoryName": "",
        "categoryName": "공통",
        "question": "본인 성격의 장단점은??"
    },
    {
        "id": 205,
        "groupName": "",
        "groupCategoryName": "",
        "categoryName": "공통",
        "question": "왜 이 직무에 지원했나요??"
    }
]

마이질문 1건 조회

  • 사용자는 자신이 작성한 마이질문(나만 볼 수 있는 질문)를 조회할 수 있다.

URL

  • GET /api/my-questions/{id}

Request

  • None

Response

field_name description
id 마이질문 id
groupCategoryName (그룹에 포함된 마이 질문이라면) 그룹명, 그룹이 없을 시 빈 스트링(""))
categoryName 마이질문 직무 카테고리
question 질문
answer 질문에 대한 답변
keywords 답변에 대한 키워드
  • 성공(200)

그룹X, 질문O, 답변X, 키워드X

{
    "id": 205,
    "groupCategoryName": "",
    "categoryName": "공통",
    "question": "마이 질문입니다",
    "answer": null,
    "keywords": []
}

그룹X, 질문O, 답변O, 키워드X

{
    "id": 205,
    "groupCategoryName": "",
    "categoryName": "인턴",
    "question": "살면서 가장 후회하는 일은 무엇인가요?",
    "answer": "변경된 답변입니다.",
    "keywords": []
}

그룹X, 질문O, 답변O, 키워드O

{
    "id": 205,
    "groupCategoryName": "",
    "categoryName": "인턴",
    "question": "살면서 가장 후회하는 일은 무엇인가요?",
    "answer": "살면서 가장 후회하는 일은 어학연수를 가지 않은 것입니다",
    "keywords": [
        "살면서",
        "가장",
        "후회"
    ]
}
  • 실패(400)
    • 마이 질문 유형이 아닌 질문을 해당 API로 호출 시
{
    "message": "해당 질문은 마이 질문이 아닙니다."
}
  • 실패(404)
    • 올바르지 않은 questionId 입력 시
{
    "message": "Could not found 'UserQuestionAnswer' with query values (userQuestionId = 3, userId = 1)"
}

마이질문 질문 수정

  • 사용자는 마이질문(나만 볼 수 있는 질문)를 수정할 수 있다.

URL

  • PUT /api/my-questions/{id}

Request

param body/param Type Description Required
categoryId request body Long 카테고리 id. (1~12 사이의 숫자) true
question request body String 질문 true

Request 예시

{
    "categoryId": 2,
    "question": "살면서 가장 후회하는 일은 무엇인가요?"
}

Response

  • 성공(200)
{
    "id": 205
}
  • 실패(400)
    • question 필드 50자 입력 초과 시
{
    "message": "question 값은 50자 이하여야 합니다."
}
  • 실패(404)
    • 올바르지 않은 카테고리 id 입력 시
{
    "message": "Could not found 'Category' with query values (id = 13)"
}

마이질문 답변/키워드 등록/수정

  • 사용자는 마이질문(나만 볼 수 있는 질문)에 대한 답변/키워드를 등록/수정할 수 있다.

URL

  • PUT /api/my-questions/answer/{id}

Request

param body/param Type Description Required
answer request body String 답변 false
keywords request body String[] 답변 false

Request 예시

  • 답변만 등록
{
    "answer": "변경된 답변입니다."
}
  • 키워드만 등록
{
    "keywords": ["살면서","가장","후회"]
}
  • 답변, 키워드 같이 등록
{
    "answer": "살면서 가장 후회하는 일은 어학연수를 가지 않은 것입니다",
    "keywords": ["후회","어학연수"]
}

Response

  • 성공(200)
{
    "id": 205
}
  • 실패(400)
    • answer 필드 500자 입력 초과 시
{
    "message": "answer 값은 500자 이하여야 합니다."
}
  • 실패(403)
    • 권한이 없는 사용자(본인 질문이 아닌 경우)가 API를 호출한 경우
{
    "message": "질문 생성자만 질문을 수정할 수 있습니다"
}

마이질문 삭제

  • 사용자는 마이질문(나만 볼 수 있는 질문)를 삭제할 수 있다.

URL

  • DELETE /api/my-questions/{id}

Request

  • None

Response

  • 성공(200)
{
}
  • 실패(403)
    • 권한이 없는 사용자(본인 질문이 아닌 경우)가 API를 호출한 경우
{
    "message": "질문 생성자만 질문을 삭제할 수 있습니다"
}

그룹

그룹 생성

  • 사용자는 그룹을 생성할 수 있다.

URL

  • POST /api/groups

Request

param body/param Type Description Required
categoryId request body Long 카테고리 id. (1~12 사이의 숫자) true
name request body String 그룹명(최대 10자) true

Request 예시

{
    "categoryId": 1,
    "name": "삼성전자 면접 준비"
}

Response

  • 성공(200)
{
    "id": 1
}
  • 실패(400)
    • name 필드 10자 입력 초과 시
{
    "message": "name 길이는 10자 이하여야 합니다."
}
  • 실패(404)
    • 올바르지 않은 카테고리 id 입력 시
{
    "message": "Could not found 'Category' with query values (id = 13)"
}

그룹 목록 조회

  • 사용자는 자신이 생성한 그룹 목록을 조회할 수 있다.

URL

  • GET /api/groups

Request

  • None

Response

field_name description
id 그룹 id
name 그룹명
categoryName 그룹 직무 카테고리
questionCnt 그룹에 들어있는 면접 질문 개수
  • 성공(200)
[
    {
        "id": 4,
        "name": "구글 면접 준비",
        "categoryName": "디자인",
        "questionCnt": 0
    },
    {
        "id": 3,
        "name": "네이버 면접 준비",
        "categoryName": "대외활동",
        "questionCnt": 0
    },
    {
        "id": 2,
        "name": "카카오 면접 준비",
        "categoryName": "인턴",
        "questionCnt": 0
    },
    {
        "id": 1,
        "name": "삼성전자 면접 준비",
        "categoryName": "공통",
        "questionCnt": 0
    }
]

그룹 수정

  • 사용자는 그룹 정보(그룹명, 그룹 카테고리)를 수정할 수 있다.

URL

  • PUT /api/groups/{id}

Request

param body/param Type Description Required
categoryId request body Long 카테고리 id. (1~12 사이의 숫자) true
name request body String 그룹명(최대 10자) true

Request 예시

{
    "categoryId": 3,
    "name": "SKT 면접 준비"
}

Response

  • 성공(200)
{
    "id": 205
}
  • 실패(400)
    • name 필드 10자 입력 초과 시
{
    "message": "name 길이는 10자 이하여야 합니다."
}
  • 실패(404)
    • 올바르지 않은 카테고리 id 입력 시
{
    "message": "Could not found 'Category' with query values (id = 13)"
}

그룹 삭제

  • 사용자는 그룹을 삭제할 수 있다.

URL

  • DELETE /api/groups/{id}

Request

  • None

Response

  • 성공(200)
{
}
  • 실패(403)
    • 권한이 없는 사용자(본인 질문이 아닌 경우)가 API를 호출한 경우
{
    "message": "그룹 생성자만 그룹을 삭제할 수 있습니다"
}

그룹에 속한 면접 질문 조회

  • 사용자는 그룹에 속한 면접 질문을 조회할 수 있다.

URL

  • GET /api/groups/{id}/questions

Request

  • None

Response

field_name(1 depth) field_name(2 depth) description
id 그룹 id
name 그룹명
categoryName 그룹 직무 카테고리
questionCnt 그룹에 들어있는 면접 질문 개수
groupQuestions 그룹에 들어있는 면접 질문 List
id 면접 질문 id
categoryName 면접 질문 직무 카테고리
question 질문
register 키워드 등록 여부
  • 성공(200)
{
    "id": 1,
    "name": "삼성전자 면접 준비",
    "categoryName": "공통",
    "questionCnt": 3,
    "groupQuestions": [
        {
            "id": 208,
            "categoryName": "공통",
            "question": "살면서 가장 창의적인 경험은 무엇인가요??",
            "register": false
        },
        {
            "id": 207,
            "categoryName": "연구개발(R&D)",
            "question": "팀으로 일하는 것과 혼자 일하는 것 중 어떤 것이 본인과 더 잘 맞나요?",
            "register": false
        },
        {
            "id": 206,
            "categoryName": "연구개발(R&D)",
            "question": "인생에서 가장 어려웠던 선택은 무엇이었나요?",
            "register": false
        }
    ]
}

그룹에 속한 질문을 다른 그룹으로 변경

  • 사용자는 그룹에 속한 질문을 다른 그룹으로 변경할 수 있다.

URL

  • POST /api/groups/move-questions

Request

param body/param Type Description Required
groupId request body Long 옮길 그룹 id(목적지) true
ids request body List 옮길 면접 질문 id List (최대 10개) true

Request 예시

{
    "groupId": 2,
    "ids": [208,207,209]
}

Response

  • 성공(200)
{
}
  • 실패(400)
    • ids 배열 길이가 10을 초과하는 경우
{
    "message": {
        "ids": "크기가 0에서 10 사이여야 합니다"
    }
}

그룹에 속한 질문 삭제

  • 사용자는 그룹에 속한 질문을 삭제할 수 있다.

URL

  • POST /api/groups/delete-questions

Request

param body/param Type Description Required
groupId request body Long 그룹 id true
ids request body List 삭제할 면접 질문 id List (최대 10개) true

Request 예시

{
    "groupId": 2,
    "ids": [3,4]
}

Response

  • 성공(200)
{
}
  • 실패(400)
    • ids 배열 길이가 10을 초과하는 경우
{
    "message": {
        "ids": "크기가 0에서 10 사이여야 합니다"
    }
}

키워드 연습

면접 연습용 질문 조회

  • 사용자는 면접 연습용 질문을 조회할 수 있다

URL

  • GET /api/interview-questions
  • GET /api/interview-questions?title=살면서
  • GET /api/interview-questions?category=1,2,3
  • GET /api/interview-questions?title=살면서&category=1

Request

param body/param Type Description Required
category request param String 직무 카테고리 id. (1~12 사이의 숫자) false
직무 카테고리 1건 조회 시 - category=1
직무 카테고리 2건 이상 조회 시 - category=1,2,3,4,5
title request param String 질문 제목 false

Response

field_name description
id 질문 id
categoryName 질문의 직무카테고리
questionTypeCode 질문 코드. 0 또는 1(기본 질문: 0, 마이 질문: 1)
questionType 화면표시용 기본질문/마이질문
question 질문
  • 성공(200)
    • 기본질문
[
    {
        "id": 206,
        "categoryName": "영업",
        "questionTypeCode": 1,
        "questionType": "마이질문",
        "question": "본인의 장점은 무엇인가요?"
    },
    {
        "id": 202,
        "categoryName": "연구개발(R&D)",
        "questionTypeCode": 0,
        "questionType": "기본질문",
        "question": "팀으로 일하는 것과 혼자 일하는 것 중 어떤 것이 본인과 더 잘 맞나요?"
    },
    {
        "id": 199,
        "categoryName": "연구개발(R&D)",
        "questionTypeCode": 0,
        "questionType": "기본질문",
        "question": "본인의 부족한 역량은? 어떻게 보완할 예정인가요?"
    },
    {
        "id": 189,
        "categoryName": "연구개발(R&D)",
        "questionTypeCode": 0,
        "questionType": "기본질문",
        "question": "팀 프로젝트 수행 시 본인은 주로 어떤 역할을 맡았었나요?"
    },
    {
        "id": 188,
        "categoryName": "연구개발(R&D)",
        "questionTypeCode": 0,
        "questionType": "기본질문",
        "question": "10년 후 본인의 모습은 어떤 모습일까요?"
    },
    {
        "id": 186,
        "categoryName": "연구개발(R&D)",
        "questionTypeCode": 0,
        "questionType": "기본질문",
        "question": "본인의 전공이 지원한 직무에 어떻게 적용이 될 수 있나요?"
    },
    {
        "id": 163,
        "categoryName": "영업",
        "questionTypeCode": 0,
        "questionType": "기본질문",
        "question": "본인은 남다른 승부욕을 가지고 있나요?"
    },
    {
        "id": 162,
        "categoryName": "영업",
        "questionTypeCode": 0,
        "questionType": "기본질문",
        "question": "신규 영업 오더에서 본인만의 신규 영업 전략은?"
    },
    {
        "id": 161,
        "categoryName": "영업",
        "questionTypeCode": 0,
        "questionType": "기본질문",
        "question": "본인만의 설득 능력이 있다면 어떤 게 있나요?"
    },
    {
        "id": 158,
        "categoryName": "영업",
        "questionTypeCode": 0,
        "questionType": "기본질문",
        "question": "본인의 주량은 얼마나 되나요?"
    },
    {
        "id": 151,
        "categoryName": "영업",
        "questionTypeCode": 0,
        "questionType": "기본질문",
        "question": "영업관리를 위한 본인만의 핵심 역량은 무엇인가요?"
    }
]

면접 연습용 질문 담기

  • 사용자는 면접 연습용 질문을 그룹에 담을 수 있다

URL

  • POST /api/interview-questions

Request

param body/param Type Description Required
groupId request body Long 그룹 id true
questionId request body Long 면접 연습 질문 id true
questionTypeCode request body Integer 0 또는 1 (기본 질문:0, 마이 질문: 1) true

Request 예시

{
    "groupId": 1,
    "questionId": 205,
    "questionTypeCode": 0
}
{
    "groupId": 1,
    "questionId": 205,
    "questionTypeCode": 1
}

Response

  • 성공(200)
{
    "id": 206
}
  • 실패(400)
    • 마이질문을 그룹에 등록하면서 questionTypeCode 값을 0(기본질문)을 사용한 경우
{
    "message": "기본 질문이 아닙니다"
}
  • 실패(400)
    • 기본질문을 그룹에 등록하면서 questionTypeCode 값을 1(마이질문)을 사용한 경우
{
    "message": "그룹이 없는 마이질문이 아닙니다"
}
⚠️ **GitHub.com Fallback** ⚠️