https://kookyungmin.github.io/server/2018/08/29/spring_27/
https://focus-on-my.tistory.com/134
https://m.blog.naver.com/nsqfrnidzb/222437153414
https://okky.kr/articles/497982
Ajax
Ajax를 이용하는 이유는 특정 데이터를 전달, 반환받을 때 JSP 페이지 전제를 로딩하지 않고 일부분만을 비동기 연결을 통해 변경하기 위함
REST(Representational State Transfer) 방식
특정 URI는 상응하는 데이터 자체를 의미하는 방식
ex) /board/3은 3번 게시물이라는 고유 의미 가지도록 설계하고, 그 처리 방식은 GET, POST 등의 추가적 정보를 통해 결정하는 것
-. 이때 REST방식은 비동기식이냐 동기식이냐와는 무관한 개념. 단순히 URI 주소만 보고 직관적으로 어떠한 자원(데이터)에 대한 행위인지를 알 수 있다면 이를 RESTful하다고 할 수 있는 것.
그러므로 Ajax를 이용해 REST방식을 구현한다거나, Ajax가 REST의 한 방법이라는 생각은 잘못된 것.
REST 방식을 통해 JSP 페이지가 아닌 데이터 자체를 전달, 반환받을 수 있으므로 이를 Ajax에서 이용하는 것.
@ResponseBody - @Controller
Spring 3버전 이후부터 REST방식 처리를 지원
자바 객체(Map 등)를 String, Json, XML 타입의 데이터로 반환해줌
(@RequestBody는 반대로 String, Json, XML 타입을 원하는 자바객체로 변환)
@Controller 하위의 메서드 또는 그 리턴타입에 추가하여 사용.
@RestController
Spring 4버전 이후부터 지원해 특정 Controller의 하위 모든 메서드를 REST방식으로 처리할 것을 선언하는 역할. 즉 @ResponseBody를 모든 메서드에 일일이 작성할 필요 없는 것
-. @PathVariable
일반 컨트롤러에서도 사용 가능하지만 REST방식에서 자주 사용
URI 경로의 일부를 파라미터로 사용할 때 이용
-. ResponseEntity 타입
REST방식은 별도의 View(JSP)가 아닌 데이터만을 전송하기 때문에 전송 결과에 대한 정보를 받기가 어렵다.
이때 ResponseEntity 타입을 Return타입으로 지정하여 데이터와 그에 따른 HTTP 상태(status) 코드를 직접 지정해 함께 전송할 수 있다.
// 코멘트 조회 - commentCd
@GetMapping(value = "/rest/comments/{commentCd}",
produces = {
MediaType.APPLICATION_ATOM_XML_VALUE,
MediaType.APPLICATION_JSON_UTF8_VALUE
})
public ResponseEntity<CommentVO> get(@PathVariable("commentCd") Long commentCd){
log.info("get... : " + commentCd);
return new ResponseEntity<CommentVO>(service.get(commentCd), HttpStatus.OK);
}
// 코멘트 수정
@RequestMapping(method = {RequestMethod.PUT, RequestMethod.PATCH},
value = "/rest/comments/{commentCd}",
consumes = "application/json",
produces = {MediaType.TEXT_PLAIN_VALUE})
public ResponseEntity<String> modify(
@RequestBody CommentVO vo,
@PathVariable("commentCd") Long commentCd){
log.info("modify before: " + vo);
vo.setCommentCd(commentCd); // {"movieCd":"20000006", "userCd":4, "contents":"코멘트4 수정2"} 와 같이 데이터 전달하므로 commentCd null인상태
log.info("commentCd: " + commentCd);
log.info("modify: " + vo);
return service.modify(vo) == 1
? new ResponseEntity<String>("success", HttpStatus.OK)
: new ResponseEntity<String>(HttpStatus.INTERNAL_SERVER_ERROR);
}