REST 방식의 URI 요청은 일반적인 요청처럼 "/요청명/?데이터명='데이터값'..." 으로 하지 않는다. REST 방식의 URI 요청은 "/요청명/데이터값/데이터값/..." 처럼 데이터 값을 요청명으로 같이 쓴다. 그래서 REST 방식의 컨트롤러에서는 매핑을 할 때에 value를 "/요청명/{변수명}/{변수명}..." 으로 매핑을 해준다.이제 변수로서 컨트롤러에서 사용할 때에는 @PathVariable("boardnum")을 변수 앞에 붙여주고 변수를 사용하면 된다.
ResponseEntity<>
// ResponseEntity : 서버의 상태 코드, 응답 메시지, 데이터 등을 담을 수 있는 타입
// 응답으로 데이터를 보내야 할 때는 ResponseEntity<>로 타입을 설정해줘야 한다.
텍스트 형식(TEXT, JSON, XML) 형태는 굳이 안 써줘도 되지만 그 외에 꼭 써야 할 것들이 있다. 데이터 타입이 JSON이나 XML일 경우 {MediaType.APPLICATION_JSON_UTF8_VALUE, MediaType.APPLICATION_XML_VALUE}
데이터 타입이 String일 경우 MediaType.TEXT_PLAIN_VALUE
consumes와 @RequestBody
consumse : 메소드가 호출될 때 소비할 데이터의 타입(넘겨지는 body의 데이터 타입) --> 요청의 body
@RequestBody : 넘겨지는 body의 데이터 타입을 해석해서 해당 파라미터에 채워 넣기
즉, consumse는 요청을 할 때 넘어오는 데이터의 타입을 적는 것이고 @RequestBody는 넘겨오는 데이터 타입을 해석해서 자동으로 해당 파라미터에 채워서 넣어주는 역할을 한다.
요청 쪽에서 보낸 데이터가 JSON이면 "application/json"이라고 적어주는 것이고 이 JSON 객체를 우리가 설정한 DTO에 넣어서 사용하기 위해서는 @RequestBody를 원하는 DTO 변수 앞에 적어주면 자동으로 JSON 객체를 해석해서 파라미터에 넣어준다.
2. Create(생성) - POST 방식
- 회원가입을 하거나 게시판을 생성할 때에는 POST 방식을 이용해서 생성한다.
// reply:{boardnum:boardnum, userid:loginUser, replycontents:replycontents} - JS 객체
// JSON.stringify("객체") : 객체를 JSON 형태로 바꿔줌
// "application/json; charset=utf-8" : 내용의 타입을 JSON 객체의 타입으로 설정
function insert(reply, callback){
$.ajax({
type:"POST", // 생성이기에 POST 방식
url:"/reply/regist",
data:JSON.stringify(reply), // 생성을 위한 정보의 객체를 JSON으로 바꿔서 데이터로 보냄
contentType:"application/json; charset=utf-8", // JSON 객체로 보내기 때문에 타입 설정
success:function(result, status, xhr) {
if(callback){
callback(result); // 성공할 시의 결과를 callback 함수를 이용해 실행
}
},
error:function() {
}
})
}
- data : JSON.stringify(reply) : 생성을 위한 정보의 객체를 JSON 객체로 바꿔서 요청으로 데이터를 보냄
- contentType : "application/json; charset=utf-8" : JSON 객체로 보내기 때문에 타입 설정
// Ajax에서 POST 방식으로 데이터를 삽입하기 위해 JSON 객체로 바꿔서 보냈기 때문에
// consumes를 JSON으로 설정해줘야 하며 그 JSON 객체를 DTO에 파라미터로 넣어서
// 사용할 것이기 때문에 @RequestBody를 붙여준다.
// 결과값을 String으로 반환
@PostMapping(value = "/regist", consumes = "application/json")
public ResponseEntity<String> regist(@RequestBody ReplyDTO reply) {
boolean check = service.regist(reply);
int replynum = service.getMaxReplyNum(reply.getUserid());
return check ? new ResponseEntity<String>(replynum+"",HttpStatus.OK):new ResponseEntity<String>(HttpStatus.INTERNAL_SERVER_ERROR);
}
- Ajax에서 POST 방식으로 데이터를 삽입하기 위해 JSON 객체로 바꿔서 보냈기 때문에 consumes를 JSON으로 설정해줘야 하며 그 JSON 객체를 DTO에 파라미터로 넣어서 사용할 것이기 때문에 @RequestBody를 붙여준다.
3. Read(조회) - GET 방식
- 모든 게시판을 조회에서 뿌려줄 때는 GET 방식을 이용해서 조회를 한다.
// data:{boardnum:boardnum, pagenum:pagenum}
// 데이터를 조회해서 가져오는 것이기 때문에 Ajax인 getJSON을 사용
// 데이터를 공용어인 JSON 객체로 불러와서 callback 함수를 통해 화면에 뿌려줌
// JSON 객체로 가져오는 것이기 때문에 요청 URI에 .json을 붙여줌
function selectAll(data, callback){
let boardnum = data.boardnum;
let pagenum = data.pagenum;
// ajax인데 결과로 JSON을 받는 함수
// $.getJSON(요청URI, 성공시 호출할 함수).fail(실패시 호출할 함수)
$.getJSON(
// 요청의 응답을 json으로 받아온다. ".json"
"/reply/pages/"+boardnum+"/"+pagenum+".json",
// 위의 uri의 JSON을 정상적으로 읽어왔다면 아래에 있는 함수를 호출해준다.
// 그 때 매개변수 data에는 읽어온 json 내용이 담기게 된다.
function(data) {
// data : {replyCnt:댓글개수, list:[ReplyDTO, ...]}
if(callback) {
callback(data.replyCnt, data.list);
}
}
).fail(function() {})
}
- 데이터를 조회해서 가져오는 것이기 때문에 Ajax인 getJSON을 사용 - 데이터를 공용어인 JSON 객체로 불러와서 callback 함수를 통해 화면에 뿌려줌 - JSON 객체로 가져오는 것이기 때문에 요청 URI에 .json을 붙여줌
- 성공할 시 함수 매개변수에 읽어온 JSON 객체가 담기게 된다.
// REST 방식으로 요청을 했기 때문에 Mapping을 "/pages/{boardnum}/{pagenum}"로 해주고
// 함수 매개변수에 @PathVariable로 변수를 사용하면 된다.
// 그리고 이 메소드로 나올 결과가 JSON이기 때문에 produces를 작성해준다.
// 여러 개의 데이터를 조회하는 것이기 때문에 DTO 형식의 ResponseEntity 객체를 반환해주고
// 요청에서 getJSON으로 요청했기 때문에 JSON 객체로 변환되어서 결과로 돌아가게 된다.
@GetMapping(value = "/pages/{boardnum}/{pagenum}", produces = {MediaType.APPLICATION_JSON_UTF8_VALUE, MediaType.APPLICATION_XML_VALUE})
public ResponseEntity<ReplyPageDTO> getList(@PathVariable("boardnum")Long boardnum, @PathVariable("pagenum")int pagenum) {
Criteria cri = new Criteria(pagenum, 5);
// 객체로 만들어 성공을 돌려줘야 함으로 OK 사용
return new ResponseEntity<ReplyPageDTO>(service.getList(cri, boardnum),HttpStatus.OK);
}
- REST 방식으로 요청을 했기 때문에 Mapping을 "/pages/{boardnum}/{pagenum}"로 해주고 함수 매개변수에 @PathVariable로 변수를 사용하면 된다. - 그리고 이 메소드로 나올 결과가 JSON이기 때문에 produces를 작성해준다. - 여러 개의 데이터를 조회하는 것이기 때문에 DTO 형식의 ResponseEntity 객체를 반환해주고 요청에서 getJSON으로 요청했기 때문에 JSON 객체로 변환되어서 결과로 돌아가게 된다.
4. Update(수정) - PUT 또는 PATCH 방식
- 회원 정보 수정이나 게시판 수정은 PUT 또는 PATCH 방식을 이용하면 된다.
// {boardnum:boardnum, replycontents:replycontents, replynum:replynum, userid:loginUser} - JS 객체
// JSON.stringify("객체") : 객체를 JSON 형태로 바꿔줌
// "application/json; charset=utf-8" : 내용의 타입을 JSON 객체의 타입으로 설정
function update(reply, callback){
$.ajax({
type:"PUT", // 수정이기에 PUT 방식
url:"/reply/"+reply.replynum,
data:JSON.stringify(reply), // 데이터를 제이슨으로 자동으로 바꿔서 넘겨준다.
contentType:"application/json; charset=utf-8",
success:function(result) {
if(callback){
callback(result);
}
},
error:function() {
alert("에러발생 : "+err);
}
})
}
- data : JSON.stringify(reply) : 생성을 위한 정보의 객체를 JSON 객체로 바꿔서 요청으로 데이터를 보냄
- contentType : "application/json; charset=utf-8" : JSON 객체로 보내기 때문에 타입 설정
// 수정은 RequestMapping으로 하고 PUT 또는 PATCH로 요청을 받음(무엇으로 요청이 오는 지를 모르니 둘다 달아놓음)
// PUT : 모든 데이터들을 다 전달, 자원의 전체 수정, 자원 내의 모든 필드를 전달해야 함
// PATCH : 자원의 일부 수정을 의미, 수정한 필드만 전송
// Ajax에서 PUT 방식으로 데이터를 수정하기 위해 JSON 객체로 바꿔서 보냈기 때문에 consumes를 JSON으로 설정
// 결과 값은 String으로 반환
@RequestMapping(method = {RequestMethod.PUT, RequestMethod.PATCH}, value="/{reply}", consumes = "application/json")
public ResponseEntity<String> modify(@RequestBody ReplyDTO reply){
return service.modify(reply) ? new ResponseEntity<String>("success",HttpStatus.OK):new ResponseEntity<String>(HttpStatus.INTERNAL_SERVER_ERROR);
}
- 수정은 RequestMapping으로 하고 PUT 또는 PATCH로 요청을 받음(무엇으로 요청이 오는 지를 모르니 둘 다 달아놓음) - PUT : 모든 데이터들을 다 전달, 자원의 전체 수정, 자원 내의 모든 필드를 전달해야 함 - PATCH : 자원의 일부 수정을 의미, 수정한 필드만 전송 - Ajax에서 PUT 방식으로 데이터를 수정하기 위해 JSON 객체로 바꿔서 보냈기 때문에 consumes를 JSON으로 설정하고 그 JSON 객체를 DTO에 파라미터로 넣어서 사용할 것이기 때문에 @RequestBody를 붙여준다.
5. Delete(삭제) - DELETE 방식
- 회원 탈퇴나 게시판 삭제는 DELETE 방식을 이용한다.
// 데이터를 삭제하기 위해 숫자 하나만 보내면 되기 때문에
// REST 방식으로 숫자만 보내주고 따로 객체를 위해 JSON 객체를 보낼 필요 없다.
// 그래서 $.ajax에서 data와 contentType을 따로 안 적어줘도 된다.
function drop(replynum, callback, error){
$.ajax({
type:"DELETE", // 데이터를 삭제하는 것이기 때문에 DELETE 방식
url:"/reply/"+replynum,
success:function(result, status, xhr) {
if(callback){
callback(result);
}
},
error:function(xhr, status, err) {
if(error) {
error(err);
}
}
})
}
- 데이터를 삭제이기 때문에 DELETE 방식 사용
- 데이터를 삭제하기 위해 숫자 하나만 보내면 되기 때문에 REST 방식으로 숫자만 보내주고 따로 객체를 위해 JSON 객체를 보낼 필요 없다. - 그래서 $.ajax에서 data와 contentType을 따로 안 적어줘도 된다.
// @DeleteMapping : REST 방식 이용시 삭제 요청을 받을 떄 사용하는 매핑방식
// REST 방식으로 숫자 하나를 받으므로 Mapping을 "/{replynum}"로 해주고
// 함수 매개변수에 @PathVariable로 변수를 사용하면 된다.
// 그리고 이 메소드의 결과 값이 String이므로 produces를 TEXT로 설정해준다.
@DeleteMapping(value="/{replynum}", produces = MediaType.TEXT_PLAIN_VALUE)
public ResponseEntity<String> remove(@PathVariable("replynum")Long replynum) {
return service.remove(replynum)?new ResponseEntity<String>("success",HttpStatus.OK):new ResponseEntity<String>(HttpStatus.INTERNAL_SERVER_ERROR);
}
- @DeleteMapping : REST 방식 이용 시 삭제 요청을 받을 때 사용하는 매핑 방식 - REST 방식으로 숫자 하나를 받으므로 Mapping을 "/{replynum}"로 해주고 함수 매개변수에 @PathVariable로 변수를 사용하면 된다. - 그리고 이 메소드의 결과 값이 String이므로 produces를 TEXT로 설정해준다.