Spring

Spring에서 REST

비뀨_ 2022. 4. 2. 03:46

스프링에서 REST 방식의 통신을 할 때는 간단하다.

@Controller 를 @RestController로 바꿔주기만 하면 된다.

 

@Controller 와 @RestController의 차이가 뭘까

기본적으로 Spring MVC에서는 Controller에서 할 일을 찾은 후 그 결과를 Model에 담고 호출할 View를 찾는다.

 

@Controller //@RestController
@RequestMapping("/member")
public class MemberController {
	private final IngredientRepository ingredientRepo;
	private TacoRepository tacoRepo;	
    
	@GetMapping("/")
	public String showIndex() {
		return "member";
	}
}

이런 코드가 있다고 생각해보면  localhost:8081/member/ 라는 주소를 받으면 실제적으로 반환형이 String이 아니라   

'member라는 페이지'를 보여주게 된다.

 

하지만 @RestController를 사용했을 때는 그냥 member라는 글자를 반환하게 된다.

@RestController는 반환한 객체를 알맞은 형식으로 변환해서 응답 데이터보내주게 된다.

REST 개념 참고

https://gmlwjd9405.github.io/2018/09/21/rest-and-restful.html

위의 링크에 REST의 개념을 참고하면 좋을 것 같다.

 

요약하자면

REST는 HTTP URI를 통해 자원을 명시하고, HTTP Method(POST, GET, PUT, DELETE)를 통해 해당 자원에 대한 CRUD Operation을 적용하는 것을 의미한다.

 

CRUD는 다음과 같다.

  • Create : POST (생성)
  • Read (조회)
    • GET : 데이터가 서버 -> 클라이언트로 전송. 데이터 조회
  • Update (수정)
    • PUT  : 데이터가  클라이언트 -> 서버로 전송. 데이터 전체를 교체
    • PATCH : 데이터 일부를 교체
  • Delete : DELETE (삭제)

 

CORS 적용하기

CORS(Cross-Origin Resource Sharing: 교차 출처 자원 공유)는

보안상의 이유로 다른 곳의 리소스를 요청할 때 브라우저가 서로 합의가 되었는지 검사한다고 이해했다.

 

스프링에서는 컨트롤러에 붙이는 @CrossOrigin 어노테이션이 있는데

다른 도메인의 클라이언트에서 해당 REST API를 사용할 수 있게 만들어주는 어노테이션이다.

 

@CrossOrigin(origins = "http://naver.com, http://localhost:8082/member/list")

이런식으로 origins에 허용할 url을 작성해준다. 여러개가 있다면 콤마로 구분한다.

 

테스트할 때에는 curl이나, HTTPie를 사용해도 됨.

 

HATEOAS 

  • HATEOAS란 REST Application Architecture의 Component 중 하나다.
  • 하이퍼미디어를 이용해 동적으로 정보를 주고 받을 수 있는 방법이다.
  • REST하게 Resource를 쉽게 제공해주기 위한 Library.

위키피디아의 예시

위를 보면 12345라는 계좌에 100달러가 있는 사람은 돈을 예금, 인출, 송금 할 수 있다.

이처럼 클라이언트와 서버 간 이 Resource의 rel로 어떠한 액션을 할 수 있는지 정리가 되어있다.

그리고 href를 통해서 '인출을 한다면 어디어디서 처리할거야' 라고 스스로 설명해 놓았다.

클라이언트는 href가 바뀌어도 rel에 정의된 행동을 보고 알기 때문에 상관이 없어진다.

 

Application의 상태의 변화에 따라 링크 정보가 바뀌어야 된다.

이게 HATEOAS이고, HATEOAS를 만족시켜야 진짜 REST API가 되는 것이다.

 

 

HATEOAS 사용하기

언제나 처럼 pom.xml에 의존성을 추가하면 된다.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-hateoas</artifactId>
</dependency>

2021년 11월 11일 부터 바뀐 명칭.

  • ResourceSupport -> RepresentationModel
  • Resource -> EntityModel
  • Resources -> CollectionModel
  • PagedResources -> PagedModel

 

HATEOAS의 모델

 

클래스 계층

하이퍼 미디어가 풍부한 표현을 쉽게 만들기 위해  HATEOAS는 RepresentationModel 루트에 클래스를 제공.

 

사용법

class PersonModel extends RepresentationModel<PersonModel> {
  String firstname, lastname;
}

// 컨트롤러에서 추가
PersonModel model = new PersonModel();
model.firstname = "Dave";
model.lastname = "Matthews";
model.add(Link.of("https://myhost/people/42"));

예제

EntityModel, CollectionModel

Entity는 단일 개체 , CollectionModel은 컬렉션 객체 

// EntityModel 표현
Person person = new Person("Dave", "Matthews");
EntityModel<Person> model = EntityModel.of(person);

// CollectionModel 표현
Collection<Person> people = Collections.singleton(new Person("Dave", "Matthews"));
CollectionModel<Person> model = CollectionModel.of(people);

// 링크 추가
model.add(
	WebMvcLinkBuilder.linkTo(컨트롤러이름.class)
    .slash("해당메서드의 주소")
    .withRel("지을 이름"));

return model;

 

이름 결합도 낮추기

@Relation을 사용하면 자바로 정의된 EntityModel 타입 클래스 이름과 JSON 필드 이름의 결합도를 낮출 수 있다.

이런식으로 지정하면 1개의 객체일 때는 taco. 여러개일 때는 tacos로 나온다.