티스토리 뷰

반응형

1. Controller의  리턴 타입

  • String : jsp를 이용하는 경우에는 jsp 파일의 경로와 파일이름을 나타내기 위해 사용
  • void : 호출하는 URL과 동일한 이름의 jsp를 의미
  • VO, DTO 타입 : 주로 JSON 타입의 데이터를 만들어서 반환하는 용도로 사용
  • ResponseEntity 타입 : response 할 때 Http 헤더 정보와 내용을 가공하는 용도로 사용
  • Model, ModelAndView : Model로 데이터를 반환하거나 화면까지 같이 지정하는 경우에 사용(많이사용안함)
  • HttpHeaders : 응답에 내용 없이 Http 헤더 메시지만 전달하는 용도로 사용

2. 객체 타입

  • VO, DTO 타입 등 복합적인 데이터가 들어간 객체 타입으로 지정할 수 있음
  • 주로 JSON 데이터를 만들어 내는 용도로 사용함

jackson-databind 라이브러리 추가

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<!-- json 라이브러리 -->
<dependency>
	<groupId>com.fasterxml.jackson.core</groupId>
	<artifactId>jackson-databind</artifactId>
	<version>2.5.4</version>
</dependency>
@RequestMapping(value = "doJson1", method = RequestMethod.GET)
public @ResponseBody String doJson1() { //@ResponseBody : 돌아가는 데이터를 json으로 바꿈
	return "test";
}

@RequestMapping(value = "doJson2", method = RequestMethod.GET)
public @ResponseBody ProductVo doJson2() {
	ProductVo vo = new ProductVo();
	vo.setName("다이제");
	vo.setPrice(3000);
	return vo;
}

3. ResponseEntity 타입

  • 스프링 MVC의 사상은 HttpServletRequest나  HttpServletResponse를 직접 핸들링하지 않아도 HTTP 프로토콜의  헤더를  다루는 작업이 가능하도록 작성되었다.
  • 이러한 처리를 위해 ResonseEntity를 통해 원하는 헤더 정보나 데이터를 전달
//예시
@GetMapping("/ex07")
public ResponseEntity<String> ex07() {
	log.info("/ex07......");
    
    //{"name": "홍길동"}
    String msg = "{\"name\": \"홍길동\" "}";
    
    HttpHeaders header = new HttpHeaders();
    header.add("Content-Type", "application/json;charset=UTF-8");
    
    return new ResponseEntity<>(msg, header, HttpStatus.OK);
}

 

<예시 - 댓글 (ajax)>

1. jsp - JavaScript

$("#btnAdd").click(function() {
  //댓글 등록
  var bno = $("#bno").val();
  var replyer = $("#replyer").val();
  var text = $("#replytext").val();

  //서버 주소 : /replies/

  // get 파라메타 형식으로 json 객체임
  //data: {"bno":bno, "replyer":replyer, "replytext":text}, 

  // @RequestBody 서버에서 사용시
  // 1. headers - "Content-Type" : "application/json"
  // 2. 보내는 data는 json string으로 변형해서 보내야 됨
  //    - "{bno:bno}"

  var json = JSON.stringify({"bno":bno, "replyer":replyer, "replytext":text}); // json객체를 json스트링으로 변환
  $.ajax({
    url: "replies/",
    type: "post", 
    headers:{"Content-Type":"application/json"}, //약속된 이름이기 때문에 오타나면 안됨
    data:json,
    dataType : "text",// String: text / 객체 : json으로 데이터 전송됨
    success:function(res){
      console.log(res);
      if(res == "SUCCESS"){
        alert("댓글이 등록되었습니다.");
        //리스트 갱신
        getPageList(1);
      }
    }
  })
})

2. Controller

@RestController
@RequestMapping("/replies/*")
public class ReplyController {
	@Autowired
	private ReplyService service;

    // String: text / 객체 : json으로 데이터 전송됨
    //@RequestBody : body에 실려오는 json 데이터를 class 객체에 알맞게 주입을 시킴 ({객체}). 
    @RequestMapping(value = "", method = RequestMethod.POST)
    public ResponseEntity<String> register(@RequestBody ReplyVO vo) {
      System.out.println(vo);
      ResponseEntity<String> entity = null;

      try {
        service.insert(vo);
        entity = new ResponseEntity<String>("SUCCESS", HttpStatus.OK);
      } catch (Exception e) {
        e.printStackTrace();
        entity = new ResponseEntity<String>("FAIL", HttpStatus.BAD_REQUEST); // 400 error
      }

      return entity;
    }
}

 

* 두개 이상의 값을 전달할 때는 map을 사용

// /replies/4098/1
@RequestMapping(value = "/{bno}/{page}", method = RequestMethod.GET)
//@PathVariable : 주소줄에 있는 값을 가져옴, 여러개 가져올 수 있음, method get말고도고 다 됨
public ResponseEntity<Map<String, Object>> listPage(@PathVariable("bno") int bno, @PathVariable("page") int page){
		
	ResponseEntity<Map<String, Object>> entity = null;
		
	try {
		Criteria cri = new Criteria();
		cri.setPage(page);
		PageMaker pageMaker = new PageMaker();
		pageMaker.setCri(cri);
		pageMaker.setTotalCount(service.totalCount(bno));
		
		List<ReplyVO> list = service.listPageTest(bno, cri);
	
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("list", list);
		map.put("pageMaker", pageMaker);
			
		entity = new ResponseEntity<Map<String, Object>>(map, HttpStatus.OK);
	} catch (Exception e) {
		e.printStackTrace();
		entity = new ResponseEntity<Map<String, Object>>(HttpStatus.BAD_REQUEST); // 400 err / null 없어 처리를 해도 됨
	}
		
	return entity;
}

 

반응형
댓글