주석 수정

This commit is contained in:
2026-02-03 15:05:28 +09:00
parent 0c72a603b3
commit 5869b8fe14
47 changed files with 1383 additions and 251 deletions

View File

@@ -10,34 +10,58 @@ import org.springframework.security.core.annotation.AuthenticationPrincipal
import org.springframework.security.core.userdetails.User
import org.springframework.web.bind.annotation.*
/**
* [일반 사용자용 댓글 API]
*
* 게시글에 대한 사용자 참여(Social Interaction)를 담당하는 컨트롤러입니다.
* 사용자 경험(UX)을 고려하여, 회원가입 없이도 자유롭게 소통할 수 있도록
* 회원(Member)과 비회원(Guest)의 접근을 동시에 허용하는 하이브리드 로직을 수행합니다.
*/
@RestController
@RequestMapping("/api/comments")
class CommentController(
private val commentService: CommentService
) {
// 댓글 목록 조회
/**
* 특정 게시글의 전체 댓글 목록을 조회합니다.
*
* 단순 리스트가 아닌, 대댓글(Nested Comments) 구조를 유지한 상태로 반환하여
* 클라이언트가 별도의 재귀 로직 구현 없이 트리 형태로 즉시 렌더링할 수 있도록 지원합니다.
*/
@GetMapping
fun getComments(@RequestParam postSlug: String): ResponseEntity<ApiResponse<List<CommentResponse>>> {
return ResponseEntity.ok(ApiResponse.success(commentService.getComments(postSlug)))
}
// 댓글 작성 (회원 or 비회원)
/**
* 댓글을 작성합니다 (회원/비회원 공용).
*
* 참여 장벽을 낮추기 위해 로그인 여부를 강제하지 않습니다.
* Security Context의 User 객체가 null일 경우 비회원으로 간주하며,
* 이 경우 RequestBody에 포함된 닉네임과 비밀번호를 사용하여 임시 신원을 생성합니다.
*/
@PostMapping
fun createComment(
@RequestBody request: CommentSaveRequest,
@AuthenticationPrincipal user: User? // 비회원이면 null이 들어옴
@AuthenticationPrincipal user: User? // 비회원 접근 시 null (Optional Principal)
): ResponseEntity<ApiResponse<Long>> {
val email = user?.username // null이면 비회원
val email = user?.username // 인증된 사용자라면 email 추출
val commentId = commentService.createComment(request, email)
return ResponseEntity.ok(ApiResponse.success(commentId, "댓글이 등록되었습니다."))
}
// 댓글 삭제
/**
* 댓글을 삭제합니다.
*
* 작성자 유형(회원/비회원)에 따라 검증 전략(Strategy)이 달라집니다.
* - 회원: 현재 로그인한 사용자의 ID와 댓글 작성자 ID의 일치 여부를 검증
* - 비회원: 댓글 작성 시 설정한 비밀번호(Guest Password)의 일치 여부를 검증
*/
@DeleteMapping("/{id}")
fun deleteComment(
@PathVariable id: Long,
@RequestBody(required = false) request: CommentDeleteRequest?, // 비회원용 비밀번호 바디
@RequestBody(required = false) request: CommentDeleteRequest?, // 비회원일 경우에만 바디가 필요함
@AuthenticationPrincipal user: User?
): ResponseEntity<ApiResponse<Nothing>> {
val email = user?.username