[Spring] 29.SpringProject-댓글처리(2)
댓글처리 - RestController
저번 장에서 댓글처리 컨트롤러에 맞는 URI를 정해주고 영속 계층과 비즈니스 계층을 구현했습니다
이번 장에서는 댓글처리를 위한 컨트롤러를 구현해보도록 하겠습니다!
그 전에 컨트롤러에 데이터를 넣어주고 컨트롤러가 어떠한 값을 내보내는지 테스트하기 위해 ‘postman’ 이라는 툴을 다운받아보겠습니다!
VIEW를 설계하지 않았을 때 이러한 툴로 테스트를 하면 용이합니다!
www.getpostman.com/apps에서 다운 받으면 됩니다!
RestController
저희가 댓글 처리를 할 때 REST 방식으로 한다고 하였죠!
댓글처리를 위한 컨트롤러 ReplyController의 경우 @RestController를 이용해서 작성할 것입니다!
REST 방식의 처리에서 사용하는 특별한 애노테이션이 있는데 다음과 같습니다!
- @PathVariable : URI의 경로에서 원하는 데이터를 추출하는 용도
- @RequestBody : 전송된 JSON 데이터를 객체로 변환해 주는 애노테이션(매개변수로 JSON 데이터를 받는다고 생각)
- ResponseEntity
무조건 숙지해주시길 바랍니다!
등록 처리
일단 ReplyController를 만들고 댓글 등록을 위한 메소드 register를 만들어줍니다!
등록작업은 ‘/replies’ URI로 처리되고, POST 방식으로 전송됩니다~!
//ReplyController.java
package com.gguri.swp.controller;
...
@RestController
@RequestMapping("/replies")
public class ReplyController {
private static final Logger logger = LoggerFactory.getLogger(ReplyController.class);
@Inject
private ReplyService service;
@RequestMapping(value = "", method = RequestMethod.POST)
public ResponseEntity<String> register(@RequestBody ReplyVO reply){
logger.debug("ReplyRegister>>{}",reply);
try {
service.register(reply);
//제대로 등록되었으면 "ReplyRegisterOK" 문자열과 HTTP 상태 정상
return new ResponseEntity<>("ReplyRegisterOK", HttpStatus.OK);
} catch(Exception e) {
//제대로 등록 안 되었으면 예외메시지와 HTTP 상태 400
return new ResponseEntity<>(e.getMessage(), HttpStatus.BAD_REQUEST);
}
}
}
제대로 실행되나 확인해볼까요??
와우 제대로 등록되었다는 문자열이 나왔네요! 과연 mysql 서버에 있는 테이블에도 제대로 추가되었을까요?
역시 제대로 등록되었습니다!
수정처리
수정 처리를 위한 메소드 update를 ReplyController에 추가해주겠습니다~
수정 작업은 ‘/replies/{rno}’ URI로 처리되며, PUT 또는 PATCH 방식으로 전송됩니다!
//ReplyController.java
package com.gguri.swp.controller;
...
@RestController
@RequestMapping("/replies")
public class ReplyController {
private static final Logger logger = LoggerFactory.getLogger(ReplyController.class);
@Inject
private ReplyService service;
...
@RequestMapping(value = "/{rno}", method = {RequestMethod.PUT, RequestMethod.PATCH})
public ResponseEntity<String> update(@PathVariable("rno") Integer rno,
@RequestBody ReplyVO reply){
logger.debug("ReplyUpdate>>{}",rno, reply);
try {
reply.setRno(rno);
service.modify(reply);
return new ResponseEntity<>("ReplyUpdateOK", HttpStatus.OK);
} catch(Exception e) {
return new ResponseEntity<>(e.getMessage(), HttpStatus.BAD_REQUEST);
}
}
}
위의 코드에서 주목할 점은 매개변수에서 애노테이션 @PathVariable을 사용했는데, 만약 6번 댓글을 수정하기 위해 URI 를 PUT 방식으로 /replies/6 을 입력했을 때 6을 매개변수로 가져오기 위함입니다!
한 번 postman을 이용해서 테스트해보겠습니다!
제대로 처리되었습니다!
삭제처리
이번에는 삭제처리를 해보겠습니다~
삭제 처리를 위한 메소드 remove를 ReplyController에 추가해주겠습니다~
삭제 작업은 ‘/replies/{rno}’ URI로 처리되며, DELETE 방식으로 전송됩니다!
//ReplyController.java
package com.gguri.swp.controller;
...
@RestController
@RequestMapping("/replies")
public class ReplyController {
private static final Logger logger = LoggerFactory.getLogger(ReplyController.class);
@Inject
private ReplyService service;
...
@RequestMapping(value = "/{rno}", method = RequestMethod.DELETE)
public ResponseEntity<String> delete(@PathVariable("rno") Integer rno){
logger.debug("ReplyDelete>>{}", rno);
try {
service.remove(rno);
return new ResponseEntity<>("ReplyDeleteOK", HttpStatus.OK);
} catch(Exception e) {
return new ResponseEntity<>(e.getMessage(), HttpStatus.BAD_REQUEST);
}
}
...
}
역시 postman으로 테스트해보겠습니다!
댓글 목록 페이징 처리
마지막으로 댓글 목록을 보여주는 처리를 해보겠습니다!
목록 조회 처리를 위한 메소드 listPage를 ReplyController에 추가해주겠습니다~
목록조회 작업은 ‘/replies/all/{bno}/{page}’ URI로 처리되며, GET 방식으로 전송됩니다!
//ReplyController.java
package com.gguri.swp.controller;
...
@RestController
@RequestMapping("/replies")
public class ReplyController {
private static final Logger logger = LoggerFactory.getLogger(ReplyController.class);
@Inject
private ReplyService service;
...
@RequestMapping(value = "/all/{bno}/{page}", method = RequestMethod.GET)
public ResponseEntity<Map<String, Object>> listPage(@PathVariable("bno") Integer bno,
@PathVariable("page") Integer page){
logger.debug("ReplyList>>{}", bno);
try {
Map<String, Object> map = new HashMap<>();
Criteria cri = new Criteria();
cri.setPage(page);
PageMaker pagemaker = new PageMaker(cri);
//해당 게시물에 ? page에 있는 댓글을 조회해 옴
List<ReplyVO> list = service.listReplyPage(bno, cri);
map.put("list", list);
//뷰에서 페이지 번호를 그리기 위해 PageMaker 객체 이용
int replyCount = service.getTotalCount(bno);
pagemaker.setTotalCount(replyCount);
map.put("pageMaker", pagemaker);
return new ResponseEntity<>(map, HttpStatus.OK);
} catch(Exception e) {
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
}
}
}
위의 코드에서 주목할 점은 메서드 listPage는 댓글도 조회해서 반환해야하고, 페이지 번호를 뷰에 그리기위해서 PageMaker 객체도 반환해야합니다.
따라서 listPage는 조회해 온 결과 List<ReplyVO> list와 PageMaker 객체를 HashMap에 담아서 반환합니다!
postman을 이용해 테스트해보겠습니다~!
결과가 JSON 형태로 잘 반환되는 걸 볼 수 있습니다.