-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
95 additions
and
109 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,165 +1,151 @@ | ||
# fast-crud | ||
Automatic creation of simple CRUD API of Spring boot and JPA project. | ||
매번 반복되는 Spring boot & JPA 의 기본적인 CRUD API 를 자동화 할 수 있지 않을까? | ||
|
||
<br> | ||
latest version : 1.0.1 | ||
|
||
## How to use | ||
## 기능들 | ||
- 어노테이션 표시로 엔티티의 Create, Read, Update, Delete API 가 생성된다. | ||
- 자동 생성된 API의 Root path 를 설정할 수 있다. | ||
- CRUD 중 추가할, 또는 제외할 기능을 선택할 수 있다. | ||
|
||
#### Step 1. Add the dependency. | ||
## 미리보기 | ||
``` java | ||
@CRUD(repositoryType = SampleRepository.class) | ||
@Entity | ||
class Sample { | ||
} | ||
``` | ||
|
||
<details> | ||
<summary>Gradle (build.gradle)</summary> | ||
Entity 의 @CRUD 를 읽어, 아래의 API가 자동 생성된다. | ||
|
||
``` groovy | ||
``` | ||
[POST] /sample | ||
[GET] /sample | ||
[GET] /sample/{id} | ||
[PUT] /sample | ||
[DELETE] /sample/{id} | ||
``` | ||
|
||
## 사용 방법 | ||
|
||
### build.gradle | ||
|
||
라이브러리 의존성을 추가한다. | ||
``` | ||
repositories { | ||
maven { url 'https://jitpack.io' } | ||
} | ||
``` | ||
``` groovy | ||
dependencies { | ||
implementation 'com.github.ecsimsw:fast-crud:0.0.2' | ||
implementation 'com.github.ecsimsw:api-shutdown:1.0.1' | ||
} | ||
``` | ||
</details> | ||
|
||
<details> | ||
<summary>Maven (pom.xml)</summary> | ||
|
||
``` xml | ||
<repositories> | ||
<repository> | ||
<id>jitpack.io</id> | ||
<url>https://jitpack.io</url> | ||
</repository> | ||
</repositories> | ||
``` | ||
``` xml | ||
<dependency> | ||
<groupId>com.github.ecsimsw</groupId> | ||
<artifactId>fast-crud</artifactId> | ||
<version>0.0.2</version> | ||
</dependency> | ||
``` | ||
### @EnableCrud 추가 | ||
|
||
@EnableCrud 로 라이브러리 사용을 활성화한다. | ||
|
||
</details> | ||
``` java | ||
@EnableCrud | ||
@SpringBootApplication | ||
public class MyApplication {} | ||
``` | ||
|
||
<br> | ||
### @CRUD 표시 | ||
|
||
#### Step 2. Put @CRUD on your entity class. | ||
CRUD 를 적용할 Entity에 @CRUD와 엔티티 Repository type 를 표시한다. | ||
|
||
``` java | ||
@CRUD | ||
@CRUD(repositoryType = SampleRepository.class) | ||
@Enity | ||
class Sample { | ||
} | ||
``` | ||
|
||
<br> | ||
|
||
#### Step 3. Declare JpaRepository with entity name. | ||
|
||
``` java | ||
public interface SampleRepository extends JpaRepository<Sample, Long> {} | ||
interface SampleRepository extends JpaRepository<Sample, Long> { | ||
} | ||
``` | ||
|
||
<br> | ||
### API 명세 | ||
|
||
#### Step 4. That's it. You just made basic CRUD http api bellow. | ||
아래 CRUD api 가 자동 생성된다. | ||
생성과 수정의 Request body 에는 Entity 의 프로퍼티 키와 값이 포함된다. | ||
|
||
| |HttpMethod|Path|RequestBody (Json)| | ||
|----|------|----|-----| | ||
|save|POST|/{entityName}|O| | ||
|findAll|GET|/{entityName}|X| | ||
|findById|GET|/{entityName}/{id}|X| | ||
|update|PUT|/{entityName}/{id}|O| | ||
|delete|DELETE|/{entityName}/{id}|X| | ||
#### 생성 | ||
``` | ||
[POST] /sample | ||
{ | ||
"name" : "ecsimsw" | ||
} | ||
``` | ||
|
||
<br> | ||
#### 조회 | ||
|
||
#### Step 5. Example | ||
``` java | ||
@CRUD | ||
@Entity | ||
public class Sample { | ||
|
||
@GeneratedValue | ||
@Id | ||
private Long id; | ||
private String name; | ||
|
||
public Sample() { | ||
} | ||
|
||
public Sample(String name) { | ||
this.name = name; | ||
} | ||
|
||
public Long getId() { | ||
return id; | ||
} | ||
|
||
public String getName() { | ||
return name; | ||
} | ||
} | ||
``` | ||
[GET] /sample/{id} | ||
``` | ||
|
||
``` java | ||
public interface SampleRepository extends JpaRepository<Sample, Long> {} | ||
#### 전체 조회 | ||
``` | ||
[GET] /sample | ||
``` | ||
|
||
``` | ||
[POST] localhost:8080/sample | ||
{ | ||
"name" : "ecsimsw" | ||
} | ||
[PUT] localhost:8080/sample/1 | ||
#### 수정 | ||
|
||
``` | ||
[PUT] /sample/{id} | ||
{ | ||
"name" : "new_name" | ||
"name" : "new_name" | ||
} | ||
[GET] localhost:8080/sample | ||
[GET] localhost:8080/sample/1 | ||
[DELETE] localhost:8080/sample/1 | ||
``` | ||
|
||
<br> | ||
|
||
## Additional features | ||
|
||
#### Repository name | ||
|
||
You can set your repository bean name in @CRUD with `repositoryBean` parameter. | ||
#### 삭제 | ||
|
||
``` java | ||
@CRUD(repositoryBean = "anotherName") | ||
``` | ||
|
||
``` java | ||
public interface AnotherName extends JpaRepository<Sample, Long> {} | ||
[DELETE] /sample/{id} | ||
``` | ||
|
||
<br> | ||
### Root path 설정 | ||
|
||
#### API root path | ||
|
||
You can set your api `root path` | ||
기본 API 기본 경로는 Entity 이름이다. @CRUD 어노테이션의 rootPath 값으로 API 기본 경로를 변경할 수 있다. | ||
아래 예시의 경우 `/api/sample` 으로 API 경로가 생성된다. | ||
|
||
``` java | ||
@CRUD(rootPath = "anotherRoot") | ||
@CRUD(rootPath = "api/sample") | ||
@Entity | ||
class Sample {} | ||
``` | ||
|
||
### 제외 기능 설정 | ||
|
||
CRUD 중 제외할 기능을 명시할 수 있다. | ||
아래 예시의 겨우 엔티티의 수정과 삭제 기능없이, 생성과 조회 API 만 자동 생성된다. | ||
|
||
``` | ||
/anotherRoot | ||
/anotherRoot/{id} | ||
@CRUD(excludeType = {CrudType.DELETE, CrudType.UPDATE}) | ||
@Entity | ||
class Sample { | ||
``` | ||
|
||
<br> | ||
## 변경 사항 | ||
|
||
#### Exclude method | ||
### v1.0.0 | ||
|
||
Method can be excluded in @CRUD with `exclude` parameter. | ||
Spring boot 2.6 이상부터 MVC 핸들러 매핑 경로 매칭 기본 전략이 AntPathMatcher -> PathPatternParser 로 수정되었다. RequestMappingHandlerMapping 에 추가되는 RequestMappingInfo 에 PathMatcher 를 설정하는 것으로, 기본 전략은 유지한 채 라이브러리에서 자동 생성하는 RequestMapping 정보만 AntPathMatcher를 따르도록 수정한다. | ||
|
||
``` java | ||
@CRUD(exclude = {CrudMethod.UPDATE, CrudMethod.DELETE}) | ||
public HandlerInfo(CrudRequestHandler handlerInstance, RequestMethod httpMethod, String requestPath) { | ||
this.handler = handlerInstance; | ||
var buildConfig = new RequestMappingInfo.BuilderConfiguration(); | ||
buildConfig.setPathMatcher(new AntPathMatcher()); | ||
buildConfig.setPatternParser(new PathPatternParser()); | ||
this.requestMappingInfo = RequestMappingInfo | ||
.paths(requestPath) | ||
.methods(httpMethod) | ||
.options(buildConfig) | ||
.build(); | ||
} | ||
``` | ||
|
||
|