[Spring] 29.SpringProject-댓글처리(2)




댓글처리 - RestController




저번 장에서 댓글처리 컨트롤러에 맞는 URI를 정해주고 영속 계층과 비즈니스 계층을 구현했습니다


image




이번 장에서는 댓글처리를 위한 컨트롤러를 구현해보도록 하겠습니다!


그 전에 컨트롤러에 데이터를 넣어주고 컨트롤러가 어떠한 값을 내보내는지 테스트하기 위해 ‘postman’ 이라는 툴을 다운받아보겠습니다!

VIEW를 설계하지 않았을 때 이러한 툴로 테스트를 하면 용이합니다!

www.getpostman.com/apps에서 다운 받으면 됩니다!


image




RestController



저희가 댓글 처리를 할 때 REST 방식으로 한다고 하였죠!

댓글처리를 위한 컨트롤러 ReplyController의 경우 @RestController를 이용해서 작성할 것입니다!

REST 방식의 처리에서 사용하는 특별한 애노테이션이 있는데 다음과 같습니다!


  • @PathVariable : URI의 경로에서 원하는 데이터를 추출하는 용도



  • @RequestBody : 전송된 JSON 데이터를 객체로 변환해 주는 애노테이션(매개변수로 JSON 데이터를 받는다고 생각)



  • ResponseEntity : JSON 데이터와 HTTP 상태 메세지 반환




무조건 숙지해주시길 바랍니다!


등록 처리



일단 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);
		}
	}
}



제대로 실행되나 확인해볼까요??


image




와우 제대로 등록되었다는 문자열이 나왔네요! 과연 mysql 서버에 있는 테이블에도 제대로 추가되었을까요?


image




역시 제대로 등록되었습니다!


수정처리




수정 처리를 위한 메소드 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을 이용해서 테스트해보겠습니다!


image




제대로 처리되었습니다!


삭제처리




이번에는 삭제처리를 해보겠습니다~

삭제 처리를 위한 메소드 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으로 테스트해보겠습니다!


image




댓글 목록 페이징 처리




마지막으로 댓글 목록을 보여주는 처리를 해보겠습니다!

목록 조회 처리를 위한 메소드 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을 이용해 테스트해보겠습니다~!


image



결과가 JSON 형태로 잘 반환되는 걸 볼 수 있습니다.