과거의 웹 서비스
- 고정된 브라우저의 주소창
- 특정한 확장자를 이용하는 모델 2 방식(ex> *.do)
- 특정한 파라미터에 의한 분기 구조
현재의 웹 서비스
- URI + 식별데이터
- GET/POST외에 PUT/DELETE 등의 다양한 전송 방식 사용
- 서버에서는 순수한 데이터만을 서비스 하는 방식
REST방식
REST는 ‘Representational State Transfer’의 약어로 하나의 URI는 하나의 고유한 리소스(Resource)를 대표하도록 설계된다는 개념에 전송방식을 결합해서 원하는 작업을 지정
스프링에서는 다양한 어노테이션과 기능을 통해서 REST방식의 서비스를 간편하게 구축할 수 있음
어노테이션 | 기능 |
@RestController | Controller가 REST 방식을 처리하기 위한 것임을 명시합니다. |
@ResponseBody | 일반적인 JSP와 같은 뷰로 전달되는 게 아니라 데이터 자체를 전달하기 위한 용도 |
@PathVariable | URL 경로에 있는 값을 파라미터로 추출하려고 할 때 사용 |
@CrossOrigin | Ajax의 크로스 도메인 문제를 해결해주는 어노테이션 |
@RequestBoby | JSON 데이터를 원하는 타입으로 바인딩 처리 |
@RestController
•스프링 4에서부터는 @Controller 외에 @RestController라는 어노테이션을 추가해서 해당 Controller의 모든 메서드의 리턴 타입을 기존과 다르게 처리한다는 것을 명시
•@RestController는 메서드의 리턴 타입으로 사용자가 정의한 클래스 타입을 사용할 수 있고, 이를 JSON이나 XML로 자동으로 처리
•데이터의 처리는 XML과 JSON을 이용할 것이므로 pom.xml을 변경
•jackson-databind와 Jackson-dataformat-xml 라이브러리 활용
Java객체를 JSON으로 쉽게 변환할 수 있는 gson 라이브러리
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.6</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.9.6</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.2</version>
</dependency>
@RestController의 반환 타입
@RestController를 사용하는 컨트롤러에서는 다음과 같은 반환 타입들을 사용한다.
- String 혹은 Integer 등의 타입들
- 사용자 정의 타입
- ResponseEntity<> 타입
주로 ResponseEntity 타입을 이용하는 것이 일반적
JSON/XML의 테스트
SampleVO.java
package com.jcy.usedhunter.domain;
public class SampleVO {
private Integer mno;
private String firstName;
private String lastName;
public SampleVO() {}
public SampleVO(Integer mno, String firstName, String lastName) {
this.mno = mno;
this.firstName = firstName;
this.lastName = lastName;
}
public Integer getMno() {
return mno;
}
public void setMno(Integer mno) {
this.mno = mno;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
@Override
public String toString() {
return "SampleVO [mno=" + mno + ", firstName=" + firstName + ", lastName=" + lastName + "]";
}
}
@RestController
@RequestMapping("/sample")
public class SampleController {
@GetMapping(value="/getSample", produces= {MediaType.APPLICATION_JSON_UTF8_VALUE, MediaType.APPLICATION_XML_VALUE})
public SampleVO getSample() {
return new SampleVO(112, "스타", "로드");
}
}
Collection타입의 객체 반환-List
@RestController
@RequestMapping("/sample")
public class SampleController {
@GetMapping(value="/getList")
public List<SampleVO> getList() {
return IntStream.range(1, 10).mapToObj(i -> new SampleVO(i, i+"First", i+"Last"))
.collect(Collectors.toList());
}
}
Collection타입의 객체 반환-Map
@RestController
@RequestMapping("/sample")
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;
}
}
ResponseEnitity타입
@RestController
@RequestMapping("/sample")
public class SampleController {
@GetMapping(value="/check", params= {"height", "weight"})
public ResponseEntity<SampleVO> check(Double height, Double weight) {
SampleVO vo = new SampleVO(000, ""+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;
}
}
@RestController의 파라미터
- @PathVariable: 일반 컨트롤러에서도 사용이 가능하지만 REST 방식에서 자주 사용됩니다. URL 경로의 일부를 파라미터로 사용할 때 이용
- @RequestBody: JSON 데이터를 원하는 타입의 객체로 변환해야 하는 경우에 주로 사용
- 일반 <form>방식으로 처리된 데이터
@PathVariable
•URI경로 중간에 들어간 값을 얻기 위해서 사용
@RestController
@RequestMapping("/sample")
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};
}
}
@RequestBody
전송된 데이터가 JSON이고, 이를 컨트롤러에서는 사용자 정의 타입의 객체로 변환할때 사용
일반적으로 브라우저에서는 JSON형태의 데이터를 전송할 수 없으므로
별도의 REST관련 도구를 이용해서 테스트를 진행해야 함
package com.jcy.usedhunter.domain;
public class Ticket {
private int tno;
private String owner;
private String grade;
public Ticket() {
}
public Ticket(int tno, String owner, String grade) {
this.tno = tno;
this.owner = owner;
this.grade = grade;
}
public int getTno() {
return tno;
}
public void setTno(int tno) {
this.tno = tno;
}
public String getOwner() {
return owner;
}
public void setOwner(String owner) {
this.owner = owner;
}
public String getGrade() {
return grade;
}
public void setGrade(String grade) {
this.grade = grade;
}
}
@RestController
@RequestMapping("/sample")
public class SampleController {
@PostMapping("/ticket")
public Ticket convert(@RequestBody Ticket ticket) {
return ticket;
}
}
다양한 전송방식과 URI설계
•REST 방식의 데이터 교환에서 가장 특이한 점은 기존의 GET/POST 외에 다양한 방식으로 데이터를 전달한다는 점
작업 | 전송방식 |
Create | POST |
Read | GET |
Update | PUT |
Delete | DELETE |
작업 | 전송방식 | URI |
등록 | POST | /members/new |
조회 | GET | /members/{id} |
수정 | PUT | /members/{id} + body (json 데이터 등) |
삭제 | DELETE | /member/{id} |
'Spring' 카테고리의 다른 글
Spring - Apache tiles view 레이아웃 정의하기 (0) | 2022.12.30 |
---|---|
Spring - tomcat의 동작 원리 (1) | 2022.11.22 |
Spring - MyBatis 연동 시 sqlSessionFactory 오류 (0) | 2022.10.01 |
Spring - Application Context (0) | 2022.09.26 |
Spring - pom.xml (0) | 2022.09.14 |