
질문 수정("/api/v1/qna/questions/{question_id}")
- 웹사이트 이용자 중 수강생 권한을 가진 로그인 유저는 질의응답 메뉴로 접속하여
- 질의응답 상세 페이지 내에 위치한 수정하기 버튼을 클릭하여 해당 질문 내용을 수정 가능
- 수정하기 버튼은 작성자 본인외에 노출되지 않아야 함
수정 가능한 항목
- 제목
- 질문 내용 ( 마크다운 문법 사용 가능, 이미지 첨부 가능 )
- 카테고리
- 내용에 첨부된 이미지들"
Error Response Example
{
"400": {
"error_detail": "유효하지 않은 질문 수정 요청입니다."
},
"401": {
"error_detail": "로그인한 사용자만 질문을 수정할 수 있습니다."
},
"403": {
"error_detail": "본인이 작성한 질문만 수정할 수 있습니다."
},
"404": {
"error_detail": "해당 질문을 찾을 수 없습니다."
}
}
Request Body
{
"title": str,
"content": str,
"category_id": bigint,
"image_urls": [str]
}
Success Response Schema
{
"question_id": bigint,
"updated_at": str
}
특이사항
service
if question.author_id != author_id:
raise PermissionDenied(
EMS.E403_OWNER_ONLY_EDIT("질문")["error_detail"]
)
서비스에서 403 처리를 하는 이유
- DRF 공식 기준에서 Permission은 “이 요청을 이 View에 대해 수행할 수 있는가?”를 판단
| 구분 | 판단 주체 |
|---|
| 로그인 여부 | Permission |
| 역할(ST/AD 등) | Permission |
| 이 객체의 소유자인가 | ❌ 상황에 따라 다름 |
객체 권한을 Permission에서 처리하기 위해서는 아래의 조건 충족 필요
- View가 객체를 조회하고
- self.check_object_permissions(request, obj)를 호출하고
- has_object_permission()을 구현해야 함
- Permission 단계에서는 question 객체가 존재하지 않음
- 즉, “이 질문의 작성자인가?”를 판단할 정보가 없다
| 상황 | 정석 |
|---|
| 로그인 안 함 | Permission (401) |
| 역할이 안 맞음 | Permission (403) |
| 이 리소스의 소유자인가 | ✅ Service 또는 Object Permission |
| 데이터 상태 기반 제약 | Service |
| 도메인 규칙 | Service |
요약
- “작성자 여부는 질문 객체가 필요한 도메인 규칙이라 Service에서 검증하도록 했고,
- Permission은 인증과 역할만 담당하게 분리했습니다.”
- “수정 권한은 Service에서 도메인 규칙으로 검증하고,
- Permission은 인증·역할만 담당하도록 책임을 분리했습니다.”
구현 상태
이미지 처리
- “수정 요청에 image_urls가 포함된 경우에만” 기존 이미지가 전부 삭제된다.
- 단순히 수정을 시작했다고 해서 자동으로 지워지지는 않는다.
- 수정중 "image_urls" 키를 빈 리스트로 보내면 기존 이미지 전부 삭제 됨