- SpringBoot, JPA, H2 Database, Gradle, Junit4
- project : Gradle Project
- Language : Java
- Spring Boot : 2.7.2 version
- Packaging : Jar
- Java : 11
- Dependencies : SpringWeb, Spring Data JPA, H2 Database, Lombok, Validation
- GIT, JAVA, H2 database, Postman은 설치되어 있다고 가정한다.
- API Test는 Postman을 통해 하며 Header에 ContentType은 application/json으로 설정한다
$ H2 DataBase 실행시
url: jdbc:h2:tcp://localhost/~/insurance
username: sa
password:
driver-class-name: org.h2.Driver
$ git clone https://github.com/kakao-insurance-quiz/20220804-kms.git
$ cd 20220804-kms
$ ./gradlew clean build
$ java -jar build/libs/management-0.0.1-SNAPSHOT.jar
- 접속 Base URI:
http://localhost:8080
- Swagger API spec
http://localhost:8080/swagger-ui/
- 테이블의 경우 script.sql을 통해 미리 생성하며며 상품과 담보의 경우 data.sql을 통해 미리 insert하였다. (ddl-auto 기능은 위험할수 있으므로 사용하지 않고 직접 생성)
- 상품ID의 경우 1000 부터 생성할때마다 차례대로 증가, 담보ID의 경우 0부터 차례대로 증가 ,계약ID의 경우 202200000 부터 1씩 증가 (sequential 활용)
- 특정 계약에서 한 상품을 고르고 담보의 경우 여러개를 선택할수 있으므로 다대다 관계가 될수 있으므로 다대다 관계를 일대다 2개로 해소하기 위해 특정계약에 속한 담보들의 리스트를 따로 테이블로 관리하였다
- Service에서 @Transactional을 통해 transaction 처리를 해주었으며 조회해오는 기능만 포함된 경우 성능을 고려하여 readOnly = true 설정을 추가하였다
- (확장) 피보험자나 계약자 같은 경우 문제에서 명세 된것 처럼 고려하지 않았으나 만약 고려 할경우 계약관계자리스트, 관계자, 관계자를 상속받은 피보험자, 계약자 등의 Entity를 추가하는 방식으로 확장 가능하다
URI: (GET) http://localhost:8080/product/list
Response:
[
{
"prdtId": 1000,
"prdtNm": "여행자보험",
"minContDate": 1,
"maxContDate": 3,
"cvrData": [
{
"cvrId": 0,
"cvrNm": "상해치료비",
"registerPrice": 1000000.0,
"basePrice": 100.0
},
{
"cvrId": 1,
"cvrNm": "항공기 지연도착시 보상금",
"registerPrice": 500000.0,
"basePrice": 100.0
}
]
},
{
"prdtId": 1001,
"prdtNm": "휴대폰 보험",
"minContDate": 1,
"maxContDate": 12,
"cvrData": [
{
"cvrId": 2,
"cvrNm": "부분손실",
"registerPrice": 750000.0,
"basePrice": 38.0
},
{
"cvrId": 3,
"cvrNm": "전체손실",
"registerPrice": 1570000.0,
"basePrice": 40.0
}
]
},
.... 이하생략
}
]
URI: (GET) http://localhost:8080/product/{prdtId} (상품ID)
Response :
{
"prdtId": 1001,
"prdtNm": "휴대폰 보험",
"minContDate": 1,
"maxContDate": 12,
"cvrData": [
{
"cvrId": 2,
"cvrNm": "부분손실",
"registerPrice": 750000.0,
"basePrice": 38.0
},
{
"cvrId": 3,
"cvrNm": "전체손실",
"registerPrice": 1570000.0,
"basePrice": 40.0
}
]
}
URI: (POST) http://localhost:8080/contract/create
Request :
{
"prdtId" : 1000,
"cvrIds" : [0,1],
"contDate" : 1
}
Response :
{
"status": "OK",
"message": "SUCCESS",
"code": 200,
"data": {
"contId": 202200000
}
}
URI: (GET) http://localhost:8080/contract/{contId}
Response :
{
"contId": 202200000,
"contractStatus": "NORMAL",
"contBgDate": "2022-08-11T19:23:02.520659",
"contEndDate": "2022-09-11T19:23:02.520659",
"contDate": 1,
"contPrice": 15000.0,
"product": {
"prdtId": 1000,
"prdtNm": "여행자보험",
"minContDate": 1,
"maxContDate": 3,
"cvrData": [
{
"cvrId": 0,
"cvrNm": "상해치료비",
"registerPrice": 1000000.0,
"basePrice": 100.0
},
{
"cvrId": 1,
"cvrNm": "항공기 지연도착시 보상금",
"registerPrice": 500000.0,
"basePrice": 100.0
}
]
}
}
URI: (GET) http://localhost:8080/contract/list
Response :
[
{
"contId": 202200000,
"contractStatus": "NORMAL",
"contBgDate": "2022-08-11T19:23:02.520659",
"contEndDate": "2022-09-11T19:23:02.520659",
"contDate": 1,
"contPrice": 15000.0,
"product": {
"prdtId": 1000,
"prdtNm": "여행자보험",
"minContDate": 1,
"maxContDate": 3,
"cvrData": [
{
"cvrId": 0,
"cvrNm": "상해치료비",
"registerPrice": 1000000.0,
"basePrice": 100.0
},
{
"cvrId": 1,
"cvrNm": "항공기 지연도착시 보상금",
"registerPrice": 500000.0,
"basePrice": 100.0
}
]
}
},
{
"contId": 202200001,
"contractStatus": "NORMAL",
"contBgDate": "2022-08-11T19:33:51.730354",
"contEndDate": "2022-11-11T19:33:51.730354",
"contDate": 3,
"contPrice": 176960.52,
"product": {
"prdtId": 1001,
"prdtNm": "휴대폰 보험",
"minContDate": 1,
"maxContDate": 12,
"cvrData": [
{
"cvrId": 2,
"cvrNm": "부분손실",
"registerPrice": 750000.0,
"basePrice": 38.0
},
{
"cvrId": 3,
"cvrNm": "전체손실",
"registerPrice": 1570000.0,
"basePrice": 40.0
}
]
}
}
]
URI: (POST) http://localhost:8080/contract/coverage/delete
Request :
{
"contId" : 202200000,
"cvrId" : 1
}
#####생성된 계약ID(contId)가 SUCCESS 되었다는 CommonResponse와 함께 출력
Response :
{
"status": "OK",
"message": "SUCCESS",
"code": 200,
"data": {
"contId": 202200000
}
}
URI: (POST) http://localhost:8080/contract/coverage/add
Request :
{
"contId" : 202200000,
"cvrId" : 1
}
Response :
{
"status": "OK",
"message": "SUCCESS",
"code": 200,
"data": {
"contId": 202200000
}
}
URI: (POST) http://localhost:8080/contract/update/date
Request :
{
"contId" : 202200000,
"contDate" : 2
}
Response :
{
"status": "OK",
"message": "SUCCESS",
"code": 200,
"data": {
"contId": 202200000
}
}
URI: (POST) http://localhost:8080/contract/update/status
Request :
{
"contId" : 202200000,
"contStatus" : "EXPIRE"
}
Response :
{
"status": "OK",
"message": "SUCCESS",
"code": 200,
"data": {
"contId": 202200000
}
}
URI: (POST) http://localhost:8080/contract/calculate
Request :
{
"prdtId" : 1001,
"cvrIds" : [2,3],
"contDate" : 5
}
Response :
{
"status": "OK",
"message": "SUCCESS",
"code": 200,
"data": {
"contPrice": 294934.21
}
}
URI: (POST) http://localhost:8080/product/create
Request :
{
"prdtNm" : "생성한 첫 상품",
"minContDate" : 1,
"maxContDate" : 5,
"coverages" : [
{
"cvrNm": "1번담보",
"registerPrice" :6000000,
"basePrice" : 1000
},
{
"cvrNm": "2번담보",
"registerPrice" :30000000,
"basePrice" : 1000
},
{
"cvrNm": "3번담보",
"registerPrice" :40000000,
"basePrice" : 1000
}
]
}
Response :
{
"status": "OK",
"message": "SUCCESS",
"code": 200,
"data": {
"prdtId": 1004,
"cvrData": []
}
}
URI: (POST) http://localhost:8080/product/create
Request :
{
"prdtId" : 1000,
"cvrNm" : "추가할담보명",
"registerPrice" : 8000000,
"basePrice" :100
}
Response :
{
"status": "OK",
"message": "SUCCESS",
"code": 200,
"data": {
"prdtId": 1000,
"cvrData": []
}
}
Exception 목록
410(REQUIRED_PARAMETER_ERROR) : Request 호출시 @NotNull 설정된 parameter을 포함하지 않고 호출시
- 계약 관련 ErrorCode
411(WRONG_CONTRACT) : 계약ID 값을 잘못보내거나 하는 등의 오류로 계약이 존재하지 않을경우
412(EXPIRED_CONTRACT) : 만료된 계약의 변경업무를 수행하려 할경우
413(WRONG_CONTRACT_COVERAGE) : 특정 계약의 담보를 삭제하거나 할때 계약에 존재하지 않는 담보일 경우
414(WRONG_CONTRACT_DATE) : 계약기간 설정시 상품에 설정된 최소 계약기간보다 낮거나 최대 계약기간보다 높을 경우
- 상품 관련 ErrorCode
415(WRONG_PRODUCT_COVERAGE) : 이미 존재하는 계약에 담보를 추가하거나 할때 계약한 상품에 포함되지 않은 담보일경우
416(WRONG_PRODUCT) : 상품ID 값을 잘못보내거나 하는 등의 오류로 상품이 존재하지 않을경우
- 담보 관련 ErrorCode
417(WRONG_COVERAGE) : 담보ID 값을 잘못보내거나 하는 등의 오류로 담보가 존재하지 않을경우