Sangwon Coding
Spring Boot - 상품 API CRUD 본문
Item.java
package com.example.study.model.entity;
import com.example.study.model.enumclass.ItemStatus;
import lombok.*;
import lombok.experimental.Accessors;
import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedBy;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@ToString(exclude = {"orderDetailList","partner"})
@EntityListeners(AuditingEntityListener.class)
@Builder
@Accessors(chain = true)
public class Item {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Enumerated(EnumType.STRING)
private ItemStatus status; // 등록 / 해지 / 검수중(등록대기중)
private String name;
private String title;
private String content;
private BigDecimal price;
private String brandName;
private LocalDateTime registeredAt;
private LocalDateTime unregisteredAt;
@CreatedDate
private LocalDateTime createdAt;
@CreatedBy
private String createdBy;
@LastModifiedDate
private LocalDateTime updatedAt;
@LastModifiedBy
private String updatedBy;
// Item N : 1 Partner
@ManyToOne
private Partner partner;
// Item 1 : N OrderDetail
@OneToMany(fetch = FetchType.LAZY, mappedBy = "item")
private List<OrderDetail> orderDetailList;
}
CrudController.java
package com.example.study.controller;
import com.example.study.ifs.CrudInterface;
import com.example.study.model.network.Header;
import com.example.study.service.BaseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.*;
@Component
public abstract class CrudController<Req,Res,Entity> implements CrudInterface<Req,Res> {
@Autowired(required = false)
protected BaseService<Req,Res,Entity> baseService;
@Override
@PostMapping("")
public Header<Res> create(@RequestBody Header<Req> request) {
return baseService.create(request);
}
@Override
@GetMapping("{id}")
public Header<Res> read(@PathVariable Long id) {
return baseService.read(id);
}
@Override
@PutMapping("")
public Header<Res> update(@RequestBody Header<Req> request) {
return baseService.update(request);
}
@Override
@DeleteMapping("{id}")
public Header delete(@PathVariable Long id) {
return baseService.delete(id);
}
}
ItemApiController.java
package com.example.study.controller.api;
import com.example.study.controller.CrudController;
import com.example.study.ifs.CrudInterface;
import com.example.study.model.entity.Item;
import com.example.study.model.network.Header;
import com.example.study.model.network.request.ItemApiRequest;
import com.example.study.model.network.response.ItemApiResponse;
import com.example.study.service.ItemApiLogicService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.annotation.PostConstruct;
@RestController
@RequestMapping("/api/item")
public class ItemApiController extends CrudController<ItemApiRequest, ItemApiResponse, Item> {
}
ItemApiRequest.java
package com.example.study.model.network.request;
import com.example.study.model.enumclass.ItemStatus;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class ItemApiRequest {
private Long id;
private ItemStatus status;
private String name;
private String title;
private String content;
private BigDecimal price;
private String brandName;
private LocalDateTime registeredAt;
private LocalDateTime unregisteredAt;
private Long partnerId;
}
ItemApiResponse.java
package com.example.study.model.network.response;
import com.example.study.model.enumclass.ItemStatus;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class ItemApiResponse {
private Long id;
private ItemStatus status;
private String name;
private String title;
private String content;
private BigDecimal price;
private String brandName;
private LocalDateTime registeredAt;
private LocalDateTime unregisteredAt;
private Long partnerId;
}
BaseService.java
package com.example.study.service;
import com.example.study.ifs.CrudInterface;
import com.example.study.model.network.Header;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Component;
@Component
public abstract class BaseService<Req,Res,Entity> implements CrudInterface<Req,Res> {
@Autowired(required = false)
protected JpaRepository<Entity,Long> baseRepository;
// JpaRepository<Item,Long>
}
ItemApiLogicService.java
package com.example.study.service;
import com.example.study.ifs.CrudInterface;
import com.example.study.model.entity.Item;
import com.example.study.model.network.Header;
import com.example.study.model.network.request.ItemApiRequest;
import com.example.study.model.network.response.ItemApiResponse;
import com.example.study.repository.ItemRepository;
import com.example.study.repository.PartnerRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.Optional;
@Service
public class ItemApiLogicService extends BaseService<ItemApiRequest, ItemApiResponse, Item> {
@Autowired
private PartnerRepository partnerRepository;
@Override
public Header<ItemApiResponse> create(Header<ItemApiRequest> request) {
return Optional.ofNullable(request.getData())
.map(body ->{
Item item = Item.builder()
.status(body.getStatus())
.name(body.getName())
.title(body.getTitle())
.content(body.getContent())
.price(body.getPrice())
.brandName(body.getBrandName())
.registeredAt(LocalDateTime.now())
.partner(partnerRepository.getOne(body.getPartnerId()))
.build();
return item;
})
.map(newItem -> baseRepository.save(newItem))
.map(newItem -> response(newItem))
.orElseGet(()->Header.ERROR("데이터 없음"));
}
@Override
public Header<ItemApiResponse> read(Long id) {
return baseRepository.findById(id)
.map(item -> response(item))
.orElseGet(()-> Header.ERROR("데이터 없음"));
}
@Override
public Header<ItemApiResponse> update(Header<ItemApiRequest> request) {
return Optional.ofNullable(request.getData())
.map(body ->{
return baseRepository.findById(body.getId());
})
.filter(Optional::isPresent)
.map(Optional::get)
.map(item -> {
ItemApiRequest body = request.getData();
item.setStatus(body.getStatus())
.setTitle(body.getTitle())
.setContent(body.getContent())
.setName(body.getName())
.setPrice(body.getPrice())
.setBrandName(body.getBrandName())
.setPartner(partnerRepository.getOne(body.getPartnerId()))
.setStatus(body.getStatus())
.setRegisteredAt(body.getRegisteredAt())
.setUnregisteredAt(body.getUnregisteredAt())
;
return item;
})
.map(changeItem -> baseRepository.save(changeItem))
.map(newItem -> response(newItem))
.orElseGet(()->Header.ERROR("데이터 없음"));
}
@Override
public Header delete(Long id) {
return baseRepository.findById(id)
.map(item -> {
baseRepository.delete(item);
return Header.OK();
})
.orElseGet(()->Header.ERROR("데이터 없음"));
}
public Header<ItemApiResponse> response(Item item){
ItemApiResponse body = ItemApiResponse.builder()
.id(item.getId())
.status(item.getStatus())
.name(item.getName())
.title(item.getTitle())
.content(item.getContent())
.price(item.getPrice())
.brandName(item.getBrandName())
.registeredAt(item.getRegisteredAt())
.unregisteredAt(item.getUnregisteredAt())
.partnerId(item.getPartner().getId())
.build();
return Header.OK(body);
}
}
사용자 API CRUD 방식과 동일하다.
'Spring > Spring Boot (어드민 페이지)' 카테고리의 다른 글
Spring Boot - JPA Enum 형태의 값 관리 (0) | 2020.01.01 |
---|---|
Spring Boot - 주문내역 API CRUD (0) | 2020.01.01 |
Spring Boot - 사용자 API CRUD (0) | 2019.12.26 |
Spring Boot - CRUD 인터페이스 정의와 ResponseBody 공통부 작성 (0) | 2019.12.23 |
Spring Boot - JPA의 추가기능 (Builder, Chain) (0) | 2019.12.06 |
Comments