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