스프링부트학원,Spring Data REST를 이용한 스프링 REST API 실습소스및 동영상(Spring Data JPA, 스프링교육학원, JPA교육, 스프링오라클연동 RESTAPI)
.zip
0.06MB

스프링부트(Spring Boot) Spring Data REST를 이용한REST API 실습(JPA, 오라클) n RESTful 웹 서비스란 HTTP Method(POST, GET, PUT, DELETE)를 통해 해당 자원에 대한 CRUD Operation을 적용하는 것을 의미합니다. n Spring 또는 Spring Boot 기반으로 RESTful 웹 서…
ojc.asia
n RESTful 웹 서비스란 HTTP Method(POST, GET, PUT, DELETE)를 통해 해당 자원에 대한 CRUD Operation을 적용하는 것을 의미합니다.
n Spring 또는 Spring Boot 기반으로 RESTful 웹 서비스를 만들려면 @RestController로 스프링 컨트롤러를 만들어야 하지만 본 실습에서는 Spring Data REST를 이용하여 별도의 컨트롤러 작성하지 않고 Entity인 Emp.java와 Repository 인터페이스 EmpRepository.java 두개의 파일만 만들어 RestController 없이 REST API를 테스트 합니다.
n pom.xml의 spring-boot-starter-data-rest로 정의된 Spring Data REST는 도메인 모델(Emp.java)과 Repository(EmpRepository.java)를 분석해서 RESTful API를 제공해 줍니다.
n 또한 Spring Data REST는 Spring HATEOAS와 Spring Data JPA의 기능을 자동으로 결합합니다.
n Spring HATEOAS(Hypermedia As The Engine Of Application State)는 Hypermedia를 REST API의 상태 정보를 관리하기 위한 엔진으로 활용하는 것을 말합니다.
n Spring HATEOAS는 서버에서 클라이언트로 응답 리소스를 보낼 때 link로 사용 가능한 URL을 같이 전달하고 클라이언트는 제공된 link 정보를 바탕으로 리소스에 접근할 수 있도록 하는 것 입니다. 즉 클라이언트가 서버에 REST 요청시 서버는 응답에 각각의 자원들을 참조할 수 있는 URI를 link에 포함시켜 반환 합니다.

[실습]
n Springbootrest 라는 이름으로 Spring Starter Project를 생성하자.
n File >> new >> Spring Stater Project
n package : com.exemple.demo

n 다음 화면에서 Developer Tools의 Lombok, SQL의 Spring Data Jpa, oracle driver, WEB의 Rest Repositories 선택
n 1. pom.xml
ü spring-boot-starter-parent : 종속성 관리를위한 부모 POM.
ü spring-boot-starter-data-jpa : Spring Data JPA 사용을 위한 설정
ü spring-boot-starter-rest : Spring Data REST 사용을 위한 설정
ü spring-boot-maven-plugin : 응용 프로그램의 실행 가능한 JAR을 만들기 위한 Plug-In
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>springbootrest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springbootrest</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
n 2. src/main/resources/application.properties
# DataSource(오라클12.2) 설정
spring.datasource.driver-class_name=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:orcl
spring.datasource.username=scott
spring.datasource.password=tiger
spring.datasource.tomcat.max-wait=20000
spring.datasource.tomcat.max-active=50
spring.datasource.tomcat.max-idle=20
spring.datasource.tomcat.min-idle=15
# 응용프로그램 시작시 마다 DROP 후 테이블 생성
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
spring.jpa.properties.hibernate.id.new_generator_mappings=false
spring.jpa.properties.hibernate.format_sql=true
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
n 2. Model/Entity 클래스(Emp.java)
package com.example.demo.model;
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import lombok.Data;
@Entity
@Table(name = "restemp")
@Data
public class Emp implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long empno;
private String ename;
private Integer sal;
}
n 4. Repository 클래스(EmpRepository.java)
package com.example.demo.repository;
import java.util.List;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
import com.example.demo.model.Emp;
/**
* PagingAndSortingRepository는 페이징과 정렬을 위한 기능을 제공하는데
* CrudRepository를 상속받았으며 CrudRepository는
* Repository 인터페이스를 상속 받았는데
* 엔티티(테이블)를 다룰 수 있는 다양한 CRUD 메소드들이 구현되어 있습니다.
*
* Spring Data REST는 PagingAndSortingRepository
* 인터페이스의 구현을 자동으로 생성해 줍니다.
* 즉 기본적인 CRUD는 제공되므로 구현하지 않아도 됩니다.
* (예를들면 findAll, findById, save, deleteById, count 등등)
*
* 아래의 findByEname 메소드 역시 개발자가 구현을 하지 않았으며 JPA에서
* 메소드 이름을 가지고 내부적으로 자동으로 SELECT 쿼리를 만들어 줍니다.
*
* @RepositoryRestResource 어노테이션은
* Spring MVC가 “/emp” 형태로 RESTful End-Point를 생성하도록 지시.
*/
@RepositoryRestResource(collectionResourceRel = "emp", path = "emp")
public interface EmpRepository
extends PagingAndSortingRepository<Emp, Long> {
List<Emp> findByEname(@Param("ename") String ename);
}
n [실행 화면, Google Advanced Rest client]
Ename:“가길동”, sal : “1000” 사원 추가
(POST localhost:8080/emp/)

사진 설명을 입력하세요.
두명의 사원을 더 추가하자.
Ename:“나길동”, sal : “2000” 사원 추가
(POST localhost:8080/emp/)
Ename:“다길동”, sal : “3000” 사원 추가
(POST localhost:8080/emp/)

전체 사원조회(GET, localhost:8080/emp)
아래 _links는 HATEOAS를 구현하기 위해 스프링 부트에서 생성한 JSON name입니다. 그리고 그 뒤의 self는 자기 참조를 뜻하는 것을 JSON을 통해서 나타낸 것입니다.

30번 사원 조회(localhost:8080/emp/30)

Ename이 “나길동”인 사원 조회
(localhost:8080/emp/search/findByEname?ename=나길동)

30번 가길동 사원의 데이터를 ename:이종철, sal:9999로 수정
PUT, localhost:8080/emp/30

사진 설명을 입력하세요.
30번 사원 삭제(DELETE, localhost:8080/emp/30)
#스프링REST, #스프링부트, #스프링강좌, #SpringDataRest, #Spring동영상, #스프링부트동영상, #Spring, #스프링프레임워크, #스프링동영상, #스프링강의, #SpringHATEOAS, 스프링REST, 스프링부트, 스프링강좌, SpringDataRest, Spring동영상, 스프링부트동영상, Spring, 스프링프레임워크, 스프링동영상, 스프링강의, SpringHATEOAS