본문 바로가기
Java & Kotlin/Spring

[Spring] REST Controller 댓글 기능 Rest방식 구현

by heekng 2021. 5. 23.
반응형

[Spring] REST Controller 댓글 기능 Rest방식 구현

Spring에서 대표적으로 사용하는 데이터 전송 방식에는 REST가 있다.

게시판 페이지의 게시글 상세보기의 경우 댓글을 불러올 때에 페이징을 이용하는 경우가 있기 때문에, ajax를 이용해 JSON데이터를 REST로 받아오는 식으로 설계한다.


REST Controller

package com.heekng.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.heekng.domain.BoardVO;
import com.heekng.domain.Criteria;
import com.heekng.domain.ReplyVO;
import com.heekng.service.ReplyService;

import lombok.Setter;
import lombok.extern.log4j.Log4j;

@RestController
@RequestMapping("/replies/")
@Log4j
public class ReplyController {
	@Setter(onMethod_ = @Autowired)
	private ReplyService service;
	
	//댓글 등록
	@PostMapping(value="/new", consumes = "application/json", produces = {MediaType.TEXT_PLAIN_VALUE})
	public ResponseEntity<String> create(@RequestBody ReplyVO reply){
		int insertCnt = 0;
		log.info("ReplayVO : " + reply);
		insertCnt = service.register(reply);
		log.info("reply Insert Count : "+ insertCnt);
		return insertCnt == 1 ? new ResponseEntity<String>("success", HttpStatus.OK) : 
			new ResponseEntity<String>(HttpStatus.INTERNAL_SERVER_ERROR);
	}
	
	//게시글 댓글 페이징 조회
	@GetMapping(value="/pages/{bno}/{page}", produces = {MediaType.APPLICATION_JSON_UTF8_VALUE, MediaType.APPLICATION_XML_VALUE})
	public ResponseEntity<List<ReplyVO>> getList(@PathVariable("bno") Long bno, @PathVariable("page") int page){
		log.info("bno : " + bno);
		log.info("page : " + page);
		return new ResponseEntity<List<ReplyVO>>(service.getListWithPaging(new Criteria(page, 10), bno), HttpStatus.OK);
	}
	
	//댓글 조회
	@GetMapping(value="/{rno}", produces = {MediaType.APPLICATION_JSON_UTF8_VALUE, MediaType.APPLICATION_XML_VALUE})
	public ResponseEntity<ReplyVO> get(@PathVariable("rno") Long rno){
		log.info("rno : "+rno);
		
		return new ResponseEntity<ReplyVO>(service.get(rno), HttpStatus.OK);
	}
	
	//댓글 수정
	@RequestMapping(method = {RequestMethod.PUT, RequestMethod.PATCH}, value="/{rno}", consumes = "application/json", produces=MediaType.TEXT_PLAIN_VALUE)
	public ResponseEntity<String> modify(@RequestBody ReplyVO reply, @PathVariable("rno") Long rno){
		reply.setRno(rno);
		
		log.info("rno : "+rno);
		log.info("reply : " + reply);
		
		return service.modify(reply) ? new ResponseEntity<String>("success", HttpStatus.OK) : 
			new ResponseEntity<String>(HttpStatus.INTERNAL_SERVER_ERROR);
	}
	
	//댓글 삭제
	@DeleteMapping(value="/{rno}", produces=MediaType.TEXT_PLAIN_VALUE)
	public ResponseEntity<String> remove(@PathVariable("rno") Long rno){
		log.info("remove rno : " + rno);
		return service.remove(rno) ? new ResponseEntity<String>("success", HttpStatus.OK) : 
			new ResponseEntity<String>(HttpStatus.INTERNAL_SERVER_ERROR);
	}

}

위 예시는 Rest방식으로 JSON데이터를 전송해주는 컨트롤러다.

  • @Controller 어노테이션이 아닌 @RestController 어노테이션 사용.
    @RestController어노테이션이 사용된 컨트롤러는 각 메소드의 리턴이 ViewResolver로 가지 않는다.
    따라서 리턴을 내 맘대로 할 수 있고, .jsp가 붙지 않는다.
  • 각 메소드의 Mapping은 @GetMapping, @PostMapping, @PatchMapping, @PutMapping, @DeleteMapping 등이 있다.
    각각의 요청 방식에 따라 다르게 이용한다.
    꼭 하나의 방식이 아닌 여러 개의 방식을 이용할 때에는 @RequestMapping을 이용하는 경우도 있는데 이 때에는 method={RequeestMethod.[요청방식], ...}의 형식으로 작성하여 이용한다.
    PUT : 자원 전체 수정, 자원 내 모든 필드를 전달해야 한다. 일부만 전달할 경우 전달되지 않은 필드는 모두 초기화 처리가 된다.
    PATCH : 자원 일부 수정, 수정할 필드만 전송한다.
  • consumes : 외부에서 전달받는 것. Ajax를 통해 전달받은 데이터의 타입.
    Ajax의 contentType과 같은 것을 뜻한다.
    consumes = "application/json"의 경우 json형식의 데이터를 전달받는다는 것을 뜻한다.
  • produces : 해당 메소드를 통해 응답할 데이터 형식.
    Ajax의 success:function(result)에 있는 result로 전달할 데이터의 타입.
    MediaType.[응답 타입] 형식으로 작성하여 이용한다.
    TEXT_PLAIN_VALUE : 텍스트형식
    APPLICATION_XML_VALUE : xml형식
    APPLICATION_JSON_UTF8_VALUE : JSON형식
  • value : 메소드와 연결될 URL
    value 속 중괄호 {} 는 변수의 선언이며, PATH이다.
  • ResponseEntity : 응답할 값과 상태 코드까지 보내준다. 서버의 상태코드, 응답 메세지 등을 담을 수 있는 타입이다.
    브라우저에서 JSON타입으로 데이터를 전송하고 서버에서는 댓글의 처리 결과에 따라 문자열로 결과를 리턴한다.
    new ResponseEntity<T>([정보], HttpStatus.[상태]) 또는 new ResponseEntity(HttpStatus.[상태]) 로 작성하여 이용한다.
    HttpStatus.OK : status 200, OK
    HttpStatus.INTERNAL_SERVER_ERROR : status 500, Server Error
  • @PathVariable("key") : value에 중괄호{} 로 데이터를 받아온 경우에 해당 파라미터를 매개변수에 매칭시킨다.
    {키}과 @PathVariable("키")의 키는 일치해야 한다.

**@RestController 어노테이션을 이용하지 않고 ViewResolver로 이동하지 않게 하는 방법에는 @ResponseBody 어노테이션을 사용하는 방법이 있다.

@ResponseBody어노테이션은 바디를 응답하겠다는 것이며, 컨트롤러에서 Body를 응답하기 위해서 (ViewResolver을 가지 않게 하기 위해서) 사용한다.

반응형

'Java & Kotlin > Spring' 카테고리의 다른 글

[Spring] 파일첨부  (0) 2021.05.28
[Spring] 트랜잭션  (0) 2021.05.26
[Spring] AOP  (0) 2021.05.26
[Spring] 게시판 프로젝트 (2)  (0) 2021.05.23
[Spring] root-context.xml 구성  (0) 2021.05.22
[Spring] pom.xml 구성  (0) 2021.05.22