Spring Data Rest
RESTFul 웹서비스는 HTTP Method를 통해 해당 자원에 대한 CRUD Operation을 적용하는 것을 의미합니다.
기존에 Spring web을 사용하면 @RestController로 컨트롤러를 작성해서 사용해야하지만 Spring Data REST를 사용하면 별도의 컨트롤러없이 Entity와 Repository인터페이스를 보고 분석해서 자동으로 RESTful API를 제공해 줍니다 (짱좋음)
그리고 Spring Data REST는 Spring HATEOAS와 Spring Data JPA의 기능을 자동으로 결합합니다.
Spring HATEOAS?
Spring HATEOAS는 서버에서 클라이언트로 응답 리소스를 보낼 때 link로 사용가능한 URI를 같이 전달하고 클라이언트는 제공된 link정보를 바탕으로 리소스에 접근할 수 있도록 하는것입니다.즉 클라이언트가 서버에 REST 요청시 서버는 응답에 각각의 자원들을 참조할 수 있는 URI를 link에 포함시켜 반환 합니다.
사용 예시
- doc에 가이드 참조함
의존성
Spring Data Jpa,
h2
Rest REpositories
이렇게 세개를 했다.
package com.study.practicespringboothateoas.accessingdatarest;
import javax.persistence.*;
@Entity
@Table(name = "person")
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", nullable = false)
private Long id;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
위와같이 entity를 정의하고
package com.study.practicespringboothateoas.accessingdatarest;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
import java.util.List;
@RepositoryRestResource(collectionResourceRel = "people",path="people")
public interface PersonRepository extends PagingAndSortingRepository<Person,Long> {
List<Person> findByLastName(@Param("name") String name);
List<Person> findByFirstName(@Param("first") String first);
}
하면 해당 entity의 crud에 대한 컨트롤러가 내부적으로 자동생성해준다
Test
이렇게 바로 데이터를 insert할수 있고
아래에 보면 hal타입의 링크도 제공되며 해당 insert된 데이터의 자원 주소가 자동 생성된것을 볼 수 있다
링크를타고 가면 생성된 데이터가 select된다.
그리고 위에 repository에 정의된 List findByLastName(@Param("name") String name);를 사용하려면 다음과같이 파라미터 값으로 넘겨준다.
그렇다면 update 와 delete또한 해당 자원으로 가서 데이터를 넘겨주기만 하면 자동으로 실행된다.
이와같이 Data REST를 사용하면 너무나 빠르고 편리하게 컨트롤러와 서비스 작성없이 기본적인 CRUD를 제공해 준다.
더 공부해봐야 할 내용
- 그렇다면 복잡한 쿼리를 날리는 경우에는 어떡하지?
- 벨리데이션체크는? AOP는 어떻게 적용시키지?
- 뷰와 어떻게 통신하지?
- 예외처리같은 로직은 어디다 넣어야할까
- 시큐리티적용은?
위의문점 말고도 수많은 의문점이 생겼다 좀 더 파봐야겠다.
'Springboot' 카테고리의 다른 글
@Transactional원리 (0) | 2023.08.14 |
---|---|
Spring boot AOP (0) | 2023.08.14 |
@Aspect Springboot AOP 시작 (0) | 2023.08.14 |
빈 후처리기 (0) | 2023.08.14 |
프록시 팩토리 (0) | 2023.08.14 |