GET /api/v1/posts # 목록 조회
GET /api/v1/posts/{id} # 단건 조회
POST /api/v1/posts # 생성
PUT /api/v1/posts/{id} # 전체 수정
PATCH /api/v1/posts/{id} # 부분 수정
DELETE /api/v1/posts/{id} # 삭제
URL: 소문자 케밥케이스 (/api/v1/user-posts)
복수형 명사 사용 (/posts, /users)
버전 포함 (/api/v1/)
HTTP 상태코드
상황
코드
조회 성공
200 OK
생성 성공
201 Created
잘못된 요청
400 Bad Request
인증 실패
401 Unauthorized
권한 없음
403 Forbidden
리소스 없음
404 Not Found
서버 오류
500 Internal Server Error
컨트롤러 작성 규칙
@Controller
@RequestMapping("/board")
@RequiredArgsConstructor
public class BoardController {
private final BoardService boardService;
// 화면 반환 (Thymeleaf)
@GetMapping("/{id}")
public String detail(@PathVariable Long id, Model model) {
model.addAttribute("board", boardService.getBoard(id));
return "board/detail";
}
}
// REST API 컨트롤러
@RestController
@RequestMapping("/api/v1/boards")
@RequiredArgsConstructor
public class BoardApiController {
private final BoardService boardService;
@PostMapping
public ResponseEntity<ApiResponse<BoardDetailRes>> regBoard(
@RequestBody @Valid BoardCreateReq req) {
return ResponseEntity.status(201)
.body(ApiResponse.ok(boardService.regBoard(req)));
}
@GetMapping("/{id}")
public ResponseEntity<ApiResponse<BoardDetailRes>> getBoard(@PathVariable Long id) {
return ResponseEntity.ok(ApiResponse.ok(boardService.getBoard(id)));
}
}