[스프링 부트] 21. RESTful API 백엔드 서버 만들기 - 웹 게시판 v4.0

KangHo Lee's avatar
Nov 24, 2024
[스프링 부트] 21. RESTful API 백엔드 서버 만들기 - 웹 게시판 v4.0

1. 프론트에 보내줄 Response 객체

Resp.java
@Data @AllArgsConstructor public class Resp<T> { private Boolean success; // 성공, 실패 구분 private String msg; private T body; // 보낼 데이터 public static <T> Resp<T> ok(T body) { return new Resp<>(true, "성공", body); } public static <T> Resp<T> fail(String msg) { return new Resp<>(false, msg, null); } }
💡
제네릭 메서드를 작성할 때에는 반환형 앞에 사용할 제네릭 타입 매개변수를 선언해야 합니다.
→ 반환형 Resp<T> 앞에 <T>를 작성해야 합니다.

2. RestControllerAdvice

MyControllerAdvice.java
@RestControllerAdvice public class MyControllerAdvice { @ExceptionHandler(Exception400.class) public ResponseEntity<?> err400(Exception400 e) { ResponseEntity rn = new ResponseEntity(Resp.fail(e.getMessage()), HttpStatus.BAD_REQUEST); // 400 return rn; } @ExceptionHandler(Exception404.class) public ResponseEntity<?> err404(Exception404 e) { ResponseEntity rn = new ResponseEntity(Resp.fail(e.getMessage()), HttpStatus.NOT_FOUND); // 404 return rn; } }
  • @RestControllerAdvice
    • JSON 또는 XML 형식의 응답을 반환합니다.
    • @ControllerAdvice는 View로 렌더링되는 응답을 반환합니다.
  • ResponseEntity
    • 응답 본문, HTTP 상태 코드, 헤더 등을 포함한 응답을 클라이언트에 보낼 수 있습니다.
    • new ResponseEntity<>( responseBody, HTTP 상태 코드 );

RestController

BoardController.java
@CrossOrigin @RequiredArgsConstructor @RestController public class BoardController { private final BoardService boardService; // 메인화면이자 전체 글 조회 // 객체를 반환하면 JSON으로 바꿔서 보내준다. @GetMapping("/api") public Resp<?> list() { List<BoardResponse.ReadDTO> boardList = boardService.게시글목록보기(); return Resp.ok(boardList); // return Resp.ok(boardService.게시글목록보기()); -> 1줄도 가능 } // 글 상세보기 만들기 @GetMapping("/api/board/{id}") public Resp<?> detail(@PathVariable("id") Integer id) { BoardResponse.DetailDTO boardDetail = boardService.게시글상세보기(id); return Resp.ok(boardDetail); } // 글 작성 폼으로 이동 -> 프론트에서 처리 가능 -> 필요없는 메서드 // 글 작성 @PostMapping("/api/board") // 주소에 동사(save)는 적지 않는다. post -> insert public Resp<?> save(@Valid @RequestBody BoardRequest.SaveDTO saveDTO, Errors errors) { boardService.게시글쓰기(saveDTO); return Resp.ok(null); } // 업데이트 폼으로 이동 -> 프론트에서 처리 가능 -> 필요없는 메서드 // 글 업데이트 @PutMapping("/api/board/{id}") public Resp<?> updateBoard(@PathVariable("id") Integer id, @Valid @RequestBody BoardRequest.UpdateDTO updateDTO, Errors errors) { // 주소에 걸린 id는 무조건 where절에 들어가는 변수다. boardService.게시글수정하기(id, updateDTO); return Resp.ok(null); } // 글 삭제 @DeleteMapping("/api/board/{id}") // 주소에 동사(delete)는 적지 않는다. public Resp<?> delete(@PathVariable Integer id) { boardService.게시글삭제(id); return Resp.ok(null); } }
💡
JSON으로 데이터를 주고 받을 경우 다양한 프론트엔드(웹, 모바일 앱 등)에 대응이 가능합니다.
  • @CrossOrigin
    • CORS(Cross-Origin Resource Sharing)는 웹 애플리케이션이 다른 도메인에 있는 리소스에 접근할 수 있도록 허용하는 메커니즘입니다
    • 웹 브라우저는 보안상의 이유로 스크립트가 자신이 로드된 것과 다른 도메인에서 리소스를 요청하는 것을 막습니다.
    • port번호가 달라서 상태 코드로 CROS error이 뜰 경우 이 어노테이션을 씁니다.
  • 데이터에 대한 CRUD 작업은 HTTP 메서드 (GET, POST, PUT, DELETE 등)로 표현해야 합니다.
    • GET: 데이터 요청, SELECT
    • POST: 데이터 생성, INSERT
    • PUT: 데이터 수정, UPDATE
    • DELETE: 데이터 삭제, DELETE
 
Share article

devleekangho