요즘 모바일 시대로 바뀌면서 WEB분야에서는 가장 큰 변화는 서버 역할의 변화입니다.
과거에는 서버의 데이터를 소비하는 주체가 브라우저 였지만
요즘은 앱이나 웹이 그러한 역할을 하게 됩니다.
스마트폰에서는 앱이라 불리는 어플리케이션을 이용하여 데이터를 소비하고
View도 자신만의 방식으로 서비스합니다.
앱에서 서버에 기대하는 것은 완성된 HTML이 아니라 자신에게 필요한 순수 데이터만을 요구합니다.
서버는 점점 더 순수 데이터에 대한 처리를 목적으로 하고 있습니다.
웹에서는 URI의 의미도 조금 다르게 변화합니다.
옛날에는 페이지 이동 시 브라우저 주소는 변하지 않았지만 요즘은 브라우저 내 주소 역시 같이 이동합니다.
REST는 "Representational State Transfer"의 약자입니다.
하나의 URI가 하나의 고유한 리소스를 대표하도록 하는 설계 개념과 전송 방식을 결합하여 원하는 작업을 지정한다는 겁니다.
즉 URI + GET/POST/PUT/DELETE ....
스프링에서는 어노테이션인 @RequestMapping이나 @ResponseBody로 REST 방식을 처리합니다.
@RestController : 컨트롤러가 REST 방식임을 명시
@ResponseBody : 일반적인 뷰,JSP로 전달되는 것이 아니라 순수 데이터 자체를 전달
@PathVariable : URL 경로에 있는 값을 파라미터로 추출
@CrossOrigin : AJAX의 크로스 도메인 문제를 해결
@RequestBody : JSON 데이터를 원하는 데이터로 바인딩
REST 방식에서 가장 중요한 개념은 서버에 전송하는 것이 순수 데이터 자체라는 것입니다.
뷰를 보여주기 위해 전달 하는 것이 아닌 데이터 말입니다.
이를 @RestController라는 어노테이션을 컨트롤러에 붙여주면 컨트롤러는 아! REST방식이구나!. 라고 할 겁니다.
간단하게 테스트를 하기위해서 Lombok을 사용했습니다.
객체를 반환하는 것을 보기 위해 SampleVO를 작성해줍니다.
아래와 같습니다.
package org.zerock.domain;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SampleVO {
private Integer mno;
private String firstName;
private String lastName;
}
이제 @RestController를 적용 시킨 컨트롤러를 봅시다.
package org.zerock.controller;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.zerock.domain.SampleVO;
import lombok.extern.log4j.Log4j;
@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 "안녕하세요";
}
@GetMapping(value="/getSample",
produces= {MediaType.APPLICATION_JSON_UTF8_VALUE,MediaType.APPLICATION_XML_VALUE})
public SampleVO getSample() {
return new SampleVO(112,"스타","로드");
}
//생략 가능
@GetMapping(value="/getSample2")
public SampleVO getSample2() {
return new SampleVO(113,"로켓","라쿤");
}
@GetMapping(value="/getList")
public List<SampleVO> getList(){
return IntStream.range(1,10).mapToObj(i->new SampleVO(i,i+"First",i+" Last")).collect(Collectors.toList());
}
@GetMapping(value="/getMap")
public Map<String,SampleVO> getMap(){
Map<String,SampleVO> map =new HashMap<>();
map.put("First", new SampleVO(111,"그루트","주니어"));
return map;
}
@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;
}
}
첫 번째 메소드는
@GetMapping(value="/getText",produces="text/plain; charset=UTF-8")
public String getText() {
log.info("MIME TYPE: "+MediaType.TEXT_PLAIN_VALUE);
return "안녕하세요";
}
단순 문자열을 반환해줍니다. 기존 @RestController를 적용 시키지 않을 경우 jsp 파일의 이름을 반환합니다.
@RestController를 적용 시켜주면 안녕하세요라는 문자열을 반환해 줍니다.
produces는 생략가능하지만 이는 MIME타입을 나타냅니다.
두 번째 메소드는
@GetMapping(value="/getSample",
produces= {MediaType.APPLICATION_JSON_UTF8_VALUE,MediaType.APPLICATION_XML_VALUE})
public SampleVO getSample() {
return new SampleVO(112,"스타","로드");
}
//생략 가능
@GetMapping(value="/getSample2")
public SampleVO getSample2() {
return new SampleVO(113,"로켓","라쿤");
}
getSample()은 SampleVO라는 객체를 반환 해줍니다.
물론 produces를 생략 가능합니다. 이는 getSample2 메서드 입니다.
세 번째 메소드는
@GetMapping(value="/getList")
public List<SampleVO> getList(){
return IntStream.range(1,10).mapToObj(i->new SampleVO(i,i+"First",i+" Last")).collect(Collectors.toList());
}
리스트 형식으로 컬렉션 타입의 객체를 반환해줍니다.
네 번째 메소드는
@GetMapping(value="/getMap")
public Map<String,SampleVO> getMap(){
Map<String,SampleVO> map =new HashMap<>();
map.put("First", new SampleVO(111,"그루트","주니어"));
return map;
}
Map으로 반환 해줍니다. 키와 값이겠죠.
마지막 메소드는
@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;
}
ResponseEntity 타입으로 요청한 쪽에서 정상적인 데이터의 여부를 가리기 위해서 사용합니다.
데이터와 함께 Http 헤더의 상태 메세지를 같이 전달해줍니다.
위에서 높이와 너비를 URL 파라미터로 전달 받는데 이 때 만약에 높이가 150보다 작으면 상태가 502이고
150보다 클 경우 상태는 200으로 정상입니다.
이들 모두 확인 방법은
URL에 입력 후 확인할 수 있으며 뒤에 .json을 붙이면 제이슨 형태로 반환 되는 것을 볼 수 있습니다.
'웹 > Spring' 카테고리의 다른 글
AOP 개념 (0) | 2019.05.03 |
---|---|
REST AJAX 댓글 등록 처리 (2) | 2019.04.28 |
Spring - UriComponentsBuilder의 사용 (0) | 2019.03.27 |
스프링프레임워크 게시글 Github (0) | 2019.03.26 |
RedirectAttributes의 addAttribute VS addFlashAttribute 차이점 (2) | 2019.03.24 |