SlideShare a Scribd company logo
Booting Spring Data REST
for SLiPP 17.06.14
이경원(woniper)
leekw3747@gmail.com
http://blog.woniper.net
 REST API
 Spring Web MVC
 Spring Data JPA 또는 Java ORM
 를 사용해 봤거나, 무엇인지 알고있어야합니다.
Spring Data REST
REST API를 쉽게 만들기 위한 기술
 Repository 인터페이스 정의만으로 REST API 제공
특징
 Repository 인터페이스 정의만으로 REST API 제공
 Query Method : 메소드 선언으로 검색 API 지원
특징
 Repository 인터페이스 정의만으로 REST API 제공
 Query Method : 메소드 선언으로 검색 API 지원
 Projection : 데이터 표현 방식을 다양하게 정의/표현 가능
특징
 Repository 인터페이스 정의만으로 REST API 제공
 Query Method : 메소드 선언으로 검색 API 지원
 Projection : 데이터 표현 방식을 다양하게 정의/표현 가능
 HATEOAS : MetaData 표현 (Model, Link, Resource)
특징
Spring Data
Spring Data REST
Spring Data REST
게시판을 만들어 볼까요?
회원만
게시글 작성이
가능합니다.
@Entity
public class Board {
@Id @GeneratedValue
private Long boardId;
@Embedded
private Contents contents;
@ManyToOne(optional = false) // 매핑 필수
private Member member;
}
@Embeddable
public class Contents {
@Column(name = "title", nullable = false)
private String title; // 제목
@Lob
@Column(name = "body", nullable = false)
private String body; // 본문 내용
}
@Entity
public class Member {
@Id @GeneratedValue
private Long memberId;
@Column(name = "username", unique = true, nullable = false)
private String username;
@Column(name = "first_name", nullable = false)
private String firstName;
@Column(name = "last_name", nullable = false)
private String lastName;
@OneToMany(cascade = CascadeType.ALL)
private List<Board> boards = new ArrayList<>();
}
Spring MVC
@Controller
@RequestMapping("/boards")
public class BoardController {
@ResponseBody // 생성
@RequestMapping(method = RequestMethod.POST)
public Board post(@RequestBody Board board) {};
@ResponseBody // 조회
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public Board get(@PathVariable("id") Long boardId) {};
@ResponseBody // 수정
@RequestMapping(value = "/{id}", method = RequestMethod.PUT)
public Board put(@PathVariable("id") Long boardId,
@RequestBody Contents contents) {};
@ResponseBody // 삭제
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
public void post(@PathVariable("id") Long boardId) {};
}
Controller
@Service
@Transactional
public class BoardService {
public Board new(Board board){}; // 생성
public Board get(Long boardId){}; // 조회
public Board update(Board board){}; // 수정
public void remove(Long boardId){}; // 삭제
}
Service
@Repository
interface BoardRepository
extends CrudRepository<Board, Long> {
Board save(Board board); // insert, update
Board findOne(Long boardId); // select
void delete(Long boardId); // delete
}
Repository
반복되고
단순한 코드
이제 우리가 할 것.
@RepositoryRestResource
interface BoardRepository
extends CrudRepository<Board, Long> {}
@RepositoryRestResource
interface BoardRepository
extends CrudRepository<Board, Long> {}
나는 REST API 입니다.
@RepositoryRestResource
interface BoardRepository
extends CrudRepository<Board, Long> {}
/{entity}s/{id}
@RepositoryRestResource
interface BoardRepository
extends CrudRepository<Board, Long> {}
/boards/1
@RepositoryRestResource
interface BoardRepository
extends CrudRepository<Board, Long> {}
메소드가 곧 API
POST : /boards
PUT | PATCH : /boards/{id}
GET : /boards/{id}
POST : /boards
PUT | PATCH : /boards/{id}
GET : /boards/{id}
POST : /boards
PUT | PATCH : /boards/{id}
GET : /boards
GET : /boards/{id}
POST : /boards
PUT | PATCH : /boards/{id}
DELETE : /boards/{id}
GET : /boards
검색 API도 만들고 싶어요.
@RepositoryRestResource
interface BoardRepository
extends CrudRepository<Board, Long> {
@RestResource(path = "starts-title")
List<Board> findByContentsTitleStartsWith(
@Param("title") String title);
}
@RepositoryRestResource
interface BoardRepository
extends CrudRepository<Board, Long> {
@RestResource(path = "starts-title")
List<Board> findByContentsTitleStartsWith(
@Param("title") String title);
}
/boards/search/starts-title
@RepositoryRestResource
interface BoardRepository
extends CrudRepository<Board, Long> {
@RestResource(path = "starts-title")
List<Board> findByContentsTitleStartsWith(
@Param("title") String title);
} ?title={}
/boards/search/starts-title
@RepositoryRestResource
interface BoardRepository
extends CrudRepository<Board, Long> {
@RestResource(path = "starts-title")
List<Board> findByContentsTitleStartsWith(
@Param("title") String title);
}
제목이 h로 시작하는
게시글 리스트를 조회하고 싶어요.
@RepositoryRestResource
interface BoardRepository
extends CrudRepository<Board, Long> {
@RestResource(path = "starts-title")
List<Board> findByContentsTitleStartsWith(
@Param("title") String title);
} /boards/search/starts-title?title=h
제목이 h로 시작하는
게시글 리스트를 조회하고 싶어요.
@RepositoryRestResource
interface BoardRepository
extends CrudRepository<Board, Long> {
@RestResource(path = "starts-title")
List<Board> findByContentsTitleStartsWith(
@Param("title") String title);
}
SELECT *
FROM board
WHERE title LIKE h%
LiveCoding!?
Deep Dive Spring Data REST
Spring Web MVC
Booting spring data rest for SLiPP
Booting spring data rest for SLiPP
Booting spring data rest for SLiPP
Booting spring data rest for SLiPP
@RepositoryRestController
Booting spring data rest for SLiPP
RepositoryController
OPTIONS : /
HEAD : /
GET : /
RepositoryEntityController
OPTIONS : /{entity}
HEAD : /{entity}, /{entity}/{id}
GET : /{entity}, /{entity}/{id}
POST : /{entity}
PUT : /{entity} /{id}
PATCH : /{entity} /{id}
DELETE : /{entity} /{id}
RepositoryPropertyReferenceController
GET : /{entity}/{id}/{property}, /{entity}/{id}/{property}/{propertyId}
DELETE : /{entity}/{id}/{property}, /{entity}/{id}/{property}/{propertyId}
PATCH: /{entity}/{id}/{property}
PUT : /{entity}/{id}/{property}
POST : /{entity}/{id}/{property}
RepositorySearchController
OPTIONS : /{entity}/search, /{entity}/search/{search}
HEAD : /{entity}/search, /{entity}/search/{search}
GET : /{entity}/search, /{entity}/search/{search}
소스 까보기
 extends HandlerMapping, HandlerAdapter
 extends @RepositoryRestController
 extends HandlerMethodArgumentResolver
장점
 빠르게 REST API 개발 가능
 확장이 쉽다.
 표준을 알 수 있다.
보이는게 다가 아니다.
REST API
DDD
(ORM + Database)
Spring
WEB
DATA
DATA REST
예상 질문
 DTO는 어떻게 쓰나요?
 HATEOAS는 반드시 써야되나요?
 보안은 어떻게 하죠?
 Spring Boot에서만 동작하나요?
적용!!!
적용!!!
의존성이 낮은 도메인
적용!!!
의존성이 낮은 도메인
사내 시스템
적용!!!
의존성이 낮은 도메인
사내 시스템
조회만 적용
적용!!!
의존성이 낮은 도메인
사내 시스템
조회만 적용
prototype
Q & A
끗.

More Related Content

PPTX
Booting Spring Data REST
PPTX
유니티 REST API를 사용한 파이어 베이스의 데이터 베이스 사용.
PDF
Perl Script Document
PDF
자바모델 클래스에 날개를달자_롬복(Lombok)
PPTX
MyBatis에서 JPA로
PDF
Ryu with OpenFlow 1.3, REST API
PDF
JSP 프로그래밍 #03 서블릿
PDF
IT 일반기술 강의자료_ed10
Booting Spring Data REST
유니티 REST API를 사용한 파이어 베이스의 데이터 베이스 사용.
Perl Script Document
자바모델 클래스에 날개를달자_롬복(Lombok)
MyBatis에서 JPA로
Ryu with OpenFlow 1.3, REST API
JSP 프로그래밍 #03 서블릿
IT 일반기술 강의자료_ed10

Similar to Booting spring data rest for SLiPP (20)

PPTX
Srping data rest
PPTX
Ksug 세미나 (윤성준) (20121208)
PDF
진짜기초 Node.js
PDF
#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
PDF
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
PPTX
스프링프레임워크 & 마이바티스 ☆ 무.료 강의자료 제공 中
PDF
overview of spring4
PDF
스프링 3.0 & RESTful
PDF
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
PDF
자바 웹 개발 시작하기 (3주차 : 스프링 웹 개발)
PDF
Ksug2015 jpa5 스프링과jpa
PDF
[162] jpa와 모던 자바 데이터 저장 기술
PDF
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
KEY
vine webdev
PDF
(IT실무교육/국비지원교육/자바/스프링교육추천)#15.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
PPT
Daejeon IT Developer Conference Hibernate3
PPTX
One-day-codelab
PDF
GraphQL 적용기
PDF
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 자바8 람다 나머지 이야기 (박성철)
PDF
Realm은 어떻게 효율적인 데이터베이스를 만들었나?
Srping data rest
Ksug 세미나 (윤성준) (20121208)
진짜기초 Node.js
#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
스프링프레임워크 & 마이바티스 ☆ 무.료 강의자료 제공 中
overview of spring4
스프링 3.0 & RESTful
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
자바 웹 개발 시작하기 (3주차 : 스프링 웹 개발)
Ksug2015 jpa5 스프링과jpa
[162] jpa와 모던 자바 데이터 저장 기술
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
vine webdev
(IT실무교육/국비지원교육/자바/스프링교육추천)#15.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
Daejeon IT Developer Conference Hibernate3
One-day-codelab
GraphQL 적용기
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 자바8 람다 나머지 이야기 (박성철)
Realm은 어떻게 효율적인 데이터베이스를 만들었나?
Ad

Booting spring data rest for SLiPP

Editor's Notes

  • #2: 안녕하세요. Booting Spring DATA REST 발표를하게된 이경원입니다. 저는 올해로 개발 경력 4년차가 됐구요. 현재는 우아한형제들에서 배민프레시라는 서비스를 개발하고있습니다.
  • #3: 발표 시작하기 전에 이 발표를 듣기 위해서 REST API가 무엇인지, Spring MVC를 사용해 봤고, Spring Data JPA 또는 Java ORM을 사용해보셨거나 무엇인지 아셔야 듣기에 수월하실거 같습니다. 발표 시작하겠습니다.
  • #4: 오늘의 주제 아키텍처
  • #5: 써보신분?
  • #6: 다음은 Spring Data REST에 몇 가지 특징을 보겠습니다. Spring Data에서 제공하는 Repository 인터페이스 정의만으로 REST API를 만들 수 있습니다.
  • #7: Spring Data Query Method 검색 API
  • #8: 다양한 Response Body
  • #9: HATEOAS는 Hypermedia As The Engine Of Application State의 약자입니다. 메타 데이터 표현
  • #10: 다양한 영속화 기술 데이터 레이어 추상화 대표적으로 JPA(jdbc -> hibernate -> JPA -> Data JPA)
  • #11: Spring Data + Spring MVC 영속화된 데이터를 그대로 REST API로 표현
  • #12: 지원 가능한 영속화 기술
  • #13: Spring MVC 게시판 Spring Data REST 게시판 비교
  • #14: 회원 Member 게시판 Board 본문 Contents
  • #15: Member entity는 필수 매핑
  • #16: Contents 클래스는 제목을 표현하는 title 변수와 본문 내용을 표현하는 body 변수가 선언되어있습니다.
  • #18: 그러면 이 엔티티를 기준으로 Spring MVC에서 REST API를 어떻게 만드는지 보겠습니다.
  • #19: 생성, 조회, 수정, 삭제 API 익숙한 코드
  • #20: 그리고 BoardRepository를 의존해 생성, 조회, 수정, 삭제할 수 있는 BoardService 클래스입니다.
  • #21: 게시글을 데이터베이스에 insert, update, select, delete할 수 있는 BoardRepository 입니다.
  • #22: 생성, 조회, 수정, 삭제(CRUD)는 대부분 반복 쿼리도, API도
  • #23: Spring Data REST는? 놀라지마라!
  • #24: 끝! 비교 데모 시연
  • #25: BoardRepository를 자세히 설명드리겠습니다. RepositoryRestResource 애노테이션을 붙이면 BoardRepository 인터페이스는 REST API로 설정하는 것입니다.
  • #26: Entity 복수명 == URL 식별 타입 == resource
  • #27: 이런식으로 URL 매핑이 됩니다.
  • #28: CrudRepository interface만 상속받았는데 어떻게 REST API가 만들어졌을까요??
  • #29: Method == API로 표현
  • #30: Save == 저장, 수정 Save == POST, PUT, PATCH
  • #31: findOne 메소드는 id로 조회 가능한 API를 제공하고요.
  • #32: findAll == get list
  • #33: Delete 메소드는 게시글 삭제 API를 제공합니다.
  • #34: Query method로 검색 API
  • #35: findByContentsTitleStartsWith == query method Query method == 검색 API 검색 API == 게시글 제목이 특정 문자열로 시작하는 리스트
  • #36: RestResource 애노테이션에 path를 starts-title로 설정하면 /boards/search/starts-title로 url 매핑이됩니다.
  • #37: 그리고 Param 애노테이션에 설정된 title이 url 파라미터로 제공됩니다.
  • #38: 그러면 제목이 h로 시작하는 게시글 리스트를 검색하는 요구사항이 있다고 가정하고 URL을 만들어보겠습니다.
  • #39: 그러면 /boards/search/starts-title url에 title 파라미터로 h로 URL을 만들어 요청하면
  • #40: findByContentsTitleStartsWith 메소드는 Title 컬럼을 like 검색 쿼리로 데이터를 조회한 후에 API로 데이터를 표현합니다. 제가 지금까지 구현체를 하나도 만들지 않고 API를 만들었죠? 여기까지가 Spring Data REST에 기본 사용법이였습니다.
  • #41: 그래서 Spring Data REST를 어떻게 어디에 활용할 수 있을지는 조금 뒤에 이야기하기로 하고 라이브 코딩을 하며 사용법을 더 알아보겠습니다.
  • #42: 스프링 캠프는 라이브 코딩까지. Deep Dive는 추가 Spring Data REST의 아키텍처 설명
  • #43: 스프링 캠프는 라이브 코딩까지. Deep Dive는 추가 Spring Data REST의 아키텍처 설명
  • #44: 다들 아는 내용 DispatcherServlet == FrontController pattern ViewResolver는 제외
  • #45: 설명
  • #46: Default 추천서 : 스프링 MVC 프로그래밍 (빨간책)
  • #47: Data REST 책 없음
  • #48: 이미 구현된 Contorller 다른 형태의 Controller @RepositoryRestController 종류
  • #49: @RepositoryRestController Diagram
  • #55: 장점입니다. 단순한 생성, 조회, 수정, 삭제에 대한 API를 빠르게 개발할 수 있고 확장이 쉽습니다. 그리고 Spring Data를 사용하는 경우에 쉽게 붙여서 사용할 수 있습니다.
  • #56: 하지만! 보이는게 다가 아닙니다.
  • #57: 제가 장점만 써 놓고 단점은 써놓지 않았는데요. 제가 생각했을때 Data REST는 알아야할 기술이 많습니다. KSUG 큰 일꾼인 박용권님과 이야기 할때 Spring Data REST를 종합 예술이라고 표현했는데요. 사용하기 쉽고 보기엔 좋지만, 이렇게 알아야할 기술이 많다는 뜻입니다.
  • #59: Spring Data REST를 어디에 적용할 수 있을지 생각을 해봤습니다.
  • #60: 첫 번째는 의존성이 낮은 도메인에 적합하다고 생각합니다. 예를 들어 커머스 주문 도메인은 상품, 결제, 포인트, 쿠폰 등 다양한 타 도메인에 의존성이 높은 반면 쿠폰이나 포인트는 타 도메인에 의존성이 낮기 때문에 더 적합하다고 생각합니다.
  • #61: 두 번째는 사내 시스템입니다. Spring Data REST는 data 레이어를 그대로 REST로 표현할 수 있는 기술이라고 말씀드렸는데요. 사내 시스템에서 데이터베이스를 조회하거나 조작해야되는 시스템에 적용해보면 좋을거 같습니다. 그리고 Spring Data REST는 HAL browser라는 REST Client 툴을 디펜던시 추가만으로 제공합니다.
  • #62: 마지막으로 조회만 적용을 해보는건데요. 라이브코딩을 하면서 봤던 ReadOnlyPagingAndSortingRepository를 만들어서 사용하면 될거 같습니다.
  • #63: 마지막으로 조회만 적용을 해보는건데요. 라이브코딩을 하면서 봤던 ReadOnlyPagingAndSortingRepository를 만들어서 사용하면 될거 같습니다.
  • #64: 끝까지 발표 들어주셔서 감사합니다.
  • #65: 끝까지 발표 들어주셔서 감사합니다.