7월 29일
1.Rest방식
과거에는 웹만 있어서 HTML형태로 전달 하면 브라우져는 이를 화면에 보여주는 역할만함. 현재 앱이란게 등장했고, 앱은 순수한 데이터만을 필요로 하게됨.
점점 서버는 순수하게 데이터만 처리 목적으로 변화해가고 브라우져와 앱은 서버에서 전달하는 데이터를 이용하여 브라우져와 앱의 내부에서 별도의 방식을 통해서 소비하는 형태로 전환 되었음.
Rest(Representational State Transfer) 하나의 URI는 하나의 고유한 리소스를 대표하도록 설계된다는 개념에 전송방식을 결합하여 원하는 작업을 지정 하도록 합니다.
예를들어 'boards/123'+post/get/put/delete....
boards게시물중 123번 이라는 고유의 URI와 post등의 정보처리방식이 합쳐진 개념이다.
(1)@RestController
Rest방식에서 중요한 부분은 서버에 전송하는 것이 순수한 데이터 라는 것이다!
@RestController는 메서드의 리턴 타입으로 사용자가 정의한 클래스 타입을 사용할 수 있고, 이를 JSON 이나 XML로 자동으로 처리할수 있다.
(2)Poom.xml추가
jackson-databind 라이브러리는 나중에 브라우저에 객체를 json이라는 포맷의 문자열로 변환시켜 전송 할때 필요함.
gson 라이브러리는 직접 java인스턴스를 json 타입의 문자열로 변환할때 필요함.
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.dataformat/jackson-dataformat-xml -->
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.13.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
2.@RestController의 반환타입
@RestController는 JSP와 달리 순수한 데이터를 반환하는 형태이므로 다양한 포맷의 데이터를 전송할 수 있습니다.
(1)SampleController 클래스에 문자열 반환하기
package com.keduit.controller;
@RestController
@RequestMapping("/sample")
@Log4j
public class SampleController {
@GetMapping(value="/getText", produces = "text/plain; charset=UTF-8")
public String getText() {
log.info("MIME TYPE:"+MediaType.TEXT_PLAIN_VALUE);
return "안녕하세요";
}
}
기존의 @Controller는 문자열을 반환하는 경우에는 JSP 파일의 이름으로 처리되지만,
@RestController 는 순수한 데이터가 됨.
@GetMapping에 사용된 produces속성은 해당 메서드가 생산하는 MIME타입을 의미함.
위와 같이 MediaType 이라는 클래스를 이용하여,MIME TYPE을 지정할수도 있다.
(2)객체 반환하기
(2-1) SampleVO 클래스 작성
package com.keduit.domain;
@Data
@AllArgsConstructor //비어있는 생성자를 만들기 위함
@NoArgsConstructor //모든속성을 사용하는 생성자를 만들기 위함
public class SampleVO {
private Integer mno;
private String firstName;
private String lastName;
}
(2-2) SampleController 클래스 작성
package com.keduit.controller;
@RestController
@RequestMapping("/sample")
@Log4j
public class SampleController {
@GetMapping(value="/getSample",
produces = {MediaType.APPLICATION_JSON_UTF8_VALUE,
MediaType.APPLICATION_XML_VALUE})
public SampleVO getSample() {
return new SampleVO(112,"스타","로드");
}
}
getSample()은 xml과 json 방식의 데이터를 생성함.
@GetMapping, @RequestMapping의 produces속성은 반드시 지정해야 하는것은 아님
지정안하면 xml 타입으로 반환타입이 지정됨
'.json'확장자를 붙이면 JSON타입으로 출력됨
(3)컬렉션 타입의 객체 반환
경우에 따라 여러데이터를 한번에 전송하기 위해서 배열이나 리스트, 맵 타입의 객체들을 전송하는 경우가 발생할때 컬렉션 타입으로 넘김
package com.keduit.controller;
@RestController
@RequestMapping("/sample")
@Log4j
public class SampleController {
@GetMapping(value="/getList")
public List<SampleVO> getList(){
return IntStream //for문과 같이 지정 횟수만큼 loop를 돌때 사용
.range(1, 10) //loop돌때 범위
.mapToObj//mapToObj() 사용해서 IntStream을 Stream<String>으로 변환
(i -> new SampleVO(i,i+"First",i+"Last"))
.collect(Collectors.toList());
}
}
(4)Map의 형태로 반환
Map의 경우에는 '키'와 '값'을 가지는 하나의 객체로 간주함.
Map을 반환하는 경우 '키'에 속하는 데이터는 xml로 변환되는 경우에는 태그의 이름이 되기때문에 문자열로 지정함.
package com.keduit.controller;
@RestController
@RequestMapping("/sample")
@Log4j
public class SampleController {
@GetMapping(value="/getMap")
public Map<String,SampleVO> getMap(){
Map<String,SampleVO> map=new HashMap<>();
map.put("First",new SampleVO(111,"그루트","주니어"));
return map;
}
}
(5)ResponseEntity 타입
ResponseEntity는 데이터와 함께 HTTP헤더의 상태 메세지 등을 같이 전달하는 용도로 사용, HTTP 상태메세지와 함께전달을 받기때문에 확실하게 결과를 알수 있다.
package com.keduit.controller;
@RestController
@RequestMapping("/sample")
@Log4j
public class SampleController {
@GetMapping(value = "/check", params= {"height","weight"})
public ResponseEntity<SampleVO> check(Double height,Double weight){
SampleVO vo= new SampleVO(0,""+height,""+weight);
ResponseEntity<SampleVO> result=null;
if(height<150) {
result=ResponseEntity.status(HttpStatus.BAD_GATEWAY).body(vo);
}else {
result=ResponseEntity.status(HttpStatus.OK).body(vo);
}
return result;
}
}
3.@RestController 에서 파라미터
(1)PathVariable
쿼리스트링 형태로 파라미터를 이용해서 전달되던 데이터들을 REST방식에서는 경로의 일부분으로 대체해서 사용하기도 한다.
package com.keduit.controller;
@RestController
@RequestMapping("/sample")
@Log4j
public class SampleController {
@GetMapping("/product/{cat}/{pid}")
public String[] getPath(
@PathVariable("cat")String cat,
@PathVariable("pid")Integer pid) {
return new String[] {"category: "+cat,"productid: "+pid};
}
}
(2)@RequestBody
@RequestBody는 전달된 요청의 내용을 이용해서 해당 파라미터의 타입으로 변환을 요구한다.
대부분의 경우에는 JSON데이터를 서버에 보내서 원하는 타입의 객체로 변환하는 용도로 사용됨.
package com.keduit.domain;
import lombok.Data;
@Data
public class Ticket {
private int tno;
private String owner;
private String grade;
}
package com.keduit.controller;
@RestController
@RequestMapping("/sample")
@Log4j
public class SampleController {
public Ticket convert(@RequestBody Ticket ticket) {
log.info("ticket: "+ticket);
return ticket;
}
}