Spring) Ajax / @RestController / @ResponseBody / @RequestBody

이지우·2022년 10월 19일
0

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);
	}
profile
IT개발 입문합니다.

0개의 댓글