diff --git a/.github/workflows/dev_deply.yml b/.github/workflows/dev_deply.yml index 2049509..0d2d6aa 100644 --- a/.github/workflows/dev_deply.yml +++ b/.github/workflows/dev_deply.yml @@ -89,6 +89,12 @@ jobs: -e CLOUD_AWS_STACK_AUTO=false \ -e SPRING_SERVLET_MULTIPART_MAXFILESIZE=${{secrets.SPRING_SERVLET_MULTIPART_MAXFILESIZE}} \ -e SPRING_SERVLET_MULTIPART_MAXREQUESTSIZE=${{secrets.SPRING_SERVLET_MULTIPART_MAXREQUESTSIZE}} \ + -e KAKAO_CLIENT_ID=${{secrets.KAKAO_CLIENT_ID}} \ + -e KAKAO_REDIRECT_URI=${{secrets.KAKAO_REDIRECT_URI}} \ + -e KAKAO_PROVIDER_AUTHORIZATION_URI=${{secrets.KAKAO_PROVIDER_AUTHORIZATION_URI}} \ + -e KAKAO_PROVIDER_TOKEN_URI=${{secrets.KAKAO_PROVIDER_TOKEN_URI}} \ + -e KAKAO_PROVIDER_USER_INFO_URI=${{secrets.KAKAO_PROVIDER_USER_INFO_URI}} \ + -e PORTONE_API_SECRET=${{secrets.PORTONE_API_SECRET}} \ ${{ secrets.DOCKERHUB_USERNAME }}/bill-api:latest sudo docker rm $(sudo docker ps --filter 'status=exited' -a -q) diff --git a/src/main/java/site/billbill/apiserver/api/borrowPosts/controller/PostsController.java b/src/main/java/site/billbill/apiserver/api/borrowPosts/controller/PostsController.java new file mode 100644 index 0000000..3d02cfa --- /dev/null +++ b/src/main/java/site/billbill/apiserver/api/borrowPosts/controller/PostsController.java @@ -0,0 +1,34 @@ +package site.billbill.apiserver.api.borrowPosts.controller; + +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jboss.logging.MDC; +import org.springframework.web.bind.annotation.*; +import site.billbill.apiserver.api.borrowPosts.dto.request.PostsRequest; +import site.billbill.apiserver.api.borrowPosts.dto.response.PostsResponse; +import site.billbill.apiserver.api.borrowPosts.service.PostsService; +import site.billbill.apiserver.common.response.BaseResponse; +import site.billbill.apiserver.common.utils.jwt.JWTUtil; + +@Slf4j +@RestController +@Tag(name = "borrowPosts", description = "대여 게시물 관련") +@RequestMapping("/api/v1/posts/borrowPosts") +@RequiredArgsConstructor +public class PostsController { + private final PostsService postsService; + @PostMapping("") + public BaseResponse uploadPostsController(@RequestBody @Valid PostsRequest.UploadRequest request){ + + String userId = ""; + if(MDC.get(JWTUtil.MDC_USER_ID) != null) { + userId= MDC.get(JWTUtil.MDC_USER_ID).toString(); + } + + return new BaseResponse<>(postsService.uploadPostService(request,userId)); + + } + +} diff --git a/src/main/java/site/billbill/apiserver/api/borrowPosts/converter/PostsConverter.java b/src/main/java/site/billbill/apiserver/api/borrowPosts/converter/PostsConverter.java new file mode 100644 index 0000000..ca79324 --- /dev/null +++ b/src/main/java/site/billbill/apiserver/api/borrowPosts/converter/PostsConverter.java @@ -0,0 +1,46 @@ +package site.billbill.apiserver.api.borrowPosts.converter; + +import site.billbill.apiserver.api.borrowPosts.dto.request.PostsRequest; +import site.billbill.apiserver.api.borrowPosts.dto.response.PostsResponse; +import site.billbill.apiserver.common.enums.items.PriceStandard; +import site.billbill.apiserver.model.post.ItemsBorrowJpaEntity; +import site.billbill.apiserver.model.post.ItemsBorrowStatusJpaEntity; +import site.billbill.apiserver.model.post.ItemsJpaEntity; +import site.billbill.apiserver.model.user.UserJpaEntity; +import site.billbill.apiserver.repository.borrowPosts.ItemsBorrowStatusRepository; + +public class PostsConverter { + + public static PostsResponse.UploadResponse toUploadResponse(String id){ + return PostsResponse.UploadResponse.builder(). + postId(id). + build(); + } + public static ItemsJpaEntity toItem(String postId,PostsRequest.UploadRequest request, UserJpaEntity user){ + return ItemsJpaEntity.builder() + .id(postId) + .title(request.getTitle()) + .content(request.getContent()) + .delYn(false) + .owner(user) + .viewCount(0) + .images(request.getImages()) + .itemStatus(request.getItemStatus()).build(); + } + public static ItemsBorrowJpaEntity toItemBorrow(ItemsJpaEntity item, PostsRequest.UploadRequest request){ + return ItemsBorrowJpaEntity.builder() + .item(item) + .priceStandard(request.getPriceStandard()) + .price(request.getPrice()) + .deposit(request.getDeposit()) + .build(); + } + public static ItemsBorrowStatusJpaEntity toItemBorrowStatus(ItemsJpaEntity item, String status, PostsRequest.NoRentalPeriod noRentalPeriod){ + return ItemsBorrowStatusJpaEntity.builder().startDate(noRentalPeriod.getStartDate()) + .endDate(noRentalPeriod.getEndDate()) + .borrowStatusCode(status) + .item(item) + .build(); + } + +} diff --git a/src/main/java/site/billbill/apiserver/api/borrowPosts/dto/request/PostsRequest.java b/src/main/java/site/billbill/apiserver/api/borrowPosts/dto/request/PostsRequest.java new file mode 100644 index 0000000..ece6993 --- /dev/null +++ b/src/main/java/site/billbill/apiserver/api/borrowPosts/dto/request/PostsRequest.java @@ -0,0 +1,32 @@ +package site.billbill.apiserver.api.borrowPosts.dto.request; + +import lombok.Getter; +import lombok.Setter; +import site.billbill.apiserver.common.enums.items.PriceStandard; +import site.billbill.apiserver.common.validation.EnumValidator; + +import java.time.LocalDate; +import java.util.List; + +public class PostsRequest { + @Getter + @Setter + public static class UploadRequest { + private String title; + private int price; + @EnumValidator(enumClass = PriceStandard.class, message = "priceStandard 값은 DAY, MONTH, YEAR 중 하나여야 합니다.") + private PriceStandard priceStandard; + private int deposit; + private int itemStatus; + private String content; + private List images; + private List noRental; + + } + @Getter + @Setter + public static class NoRentalPeriod{ + private LocalDate startDate; + private LocalDate endDate; + } +} diff --git a/src/main/java/site/billbill/apiserver/api/borrowPosts/dto/response/PostsResponse.java b/src/main/java/site/billbill/apiserver/api/borrowPosts/dto/response/PostsResponse.java new file mode 100644 index 0000000..e5ad9c5 --- /dev/null +++ b/src/main/java/site/billbill/apiserver/api/borrowPosts/dto/response/PostsResponse.java @@ -0,0 +1,14 @@ +package site.billbill.apiserver.api.borrowPosts.dto.response; + +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + + +public class PostsResponse { + @Builder + @Getter + public static class UploadResponse { + private String postId; + } +} diff --git a/src/main/java/site/billbill/apiserver/api/borrowPosts/service/PostsService.java b/src/main/java/site/billbill/apiserver/api/borrowPosts/service/PostsService.java new file mode 100644 index 0000000..d2e6db5 --- /dev/null +++ b/src/main/java/site/billbill/apiserver/api/borrowPosts/service/PostsService.java @@ -0,0 +1,8 @@ +package site.billbill.apiserver.api.borrowPosts.service; + +import site.billbill.apiserver.api.borrowPosts.dto.request.PostsRequest; +import site.billbill.apiserver.api.borrowPosts.dto.response.PostsResponse; + +public interface PostsService { + PostsResponse.UploadResponse uploadPostService(PostsRequest.UploadRequest request,String userId); +} diff --git a/src/main/java/site/billbill/apiserver/api/borrowPosts/service/PostsServiceImpl.java b/src/main/java/site/billbill/apiserver/api/borrowPosts/service/PostsServiceImpl.java new file mode 100644 index 0000000..5740fe9 --- /dev/null +++ b/src/main/java/site/billbill/apiserver/api/borrowPosts/service/PostsServiceImpl.java @@ -0,0 +1,68 @@ +package site.billbill.apiserver.api.borrowPosts.service; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import site.billbill.apiserver.api.borrowPosts.controller.PostsController; +import site.billbill.apiserver.api.borrowPosts.converter.PostsConverter; +import site.billbill.apiserver.api.borrowPosts.dto.request.PostsRequest; +import site.billbill.apiserver.api.borrowPosts.dto.response.PostsResponse; +import site.billbill.apiserver.common.utils.ULID.ULIDUtil; +import site.billbill.apiserver.model.post.ItemsBorrowJpaEntity; +import site.billbill.apiserver.model.post.ItemsBorrowStatusJpaEntity; +import site.billbill.apiserver.model.post.ItemsJpaEntity; +import site.billbill.apiserver.model.user.UserJpaEntity; +import site.billbill.apiserver.repository.borrowPosts.ItemsBorrowRepository; +import site.billbill.apiserver.repository.borrowPosts.ItemsBorrowStatusRepository; +import site.billbill.apiserver.repository.borrowPosts.ItemsRepository; +import site.billbill.apiserver.repository.user.UserRepository; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +@org.springframework.stereotype.Service +@RequiredArgsConstructor + +@Slf4j + +public class PostsServiceImpl implements PostsService { + + private final UserRepository userRepository; + private final ItemsRepository itemsRepository; + private final ItemsBorrowRepository itemsBorrowRepository; + private final ItemsBorrowStatusRepository itemsBorrowStatusRepository; + public PostsResponse.UploadResponse uploadPostService(PostsRequest.UploadRequest request,String userId){ + //먼저 item 생성, + Optional isUser=userRepository.findById(userId); + String postsId = ULIDUtil.generatorULID("BORROW"); + + UserJpaEntity user=new UserJpaEntity(); + if(isUser.isPresent()){ + user=isUser.get(); + } + //Item 생성 + ItemsJpaEntity newItem= PostsConverter.toItem(postsId,request,user); + itemsRepository.save(newItem); + ItemsJpaEntity item=itemsRepository.findById(postsId).orElse(newItem); + //BorrowItem 생성 + ItemsBorrowJpaEntity newBorrowItem= PostsConverter.toItemBorrow(item,request); + itemsBorrowRepository.save(newBorrowItem); + //대여 불가 기간 생성 + if (request.getNoRental() != null && !request.getNoRental().isEmpty()) { + List itemsBorrowStatusList = request.getNoRental().stream() + .map(status -> PostsConverter.toItemBorrowStatus(item, "RENTAL_NOT_POSSIBLE", status)) + .toList(); + itemsBorrowStatusRepository.saveAll(itemsBorrowStatusList); + } + + + + return PostsConverter.toUploadResponse(postsId); + + + + + + } +} diff --git a/src/main/java/site/billbill/apiserver/api/s3/Service/S3Service.java b/src/main/java/site/billbill/apiserver/api/s3/Service/S3Service.java index b44ebe9..42e1eea 100644 --- a/src/main/java/site/billbill/apiserver/api/s3/Service/S3Service.java +++ b/src/main/java/site/billbill/apiserver/api/s3/Service/S3Service.java @@ -7,7 +7,7 @@ import java.util.List; public interface S3Service { - S3Response.uploadResponse uploadPostsFiles(List files, String userId, long id); + S3Response.uploadResponse uploadPostsFiles(List files, String userId); S3Response.uploadResponse uploadChatFiles(List files,String userId,long id); S3Response.uploadResponse uploadUserFiles(List files); diff --git a/src/main/java/site/billbill/apiserver/api/s3/Service/S3ServiceImpl.java b/src/main/java/site/billbill/apiserver/api/s3/Service/S3ServiceImpl.java index d33584e..547bad7 100644 --- a/src/main/java/site/billbill/apiserver/api/s3/Service/S3ServiceImpl.java +++ b/src/main/java/site/billbill/apiserver/api/s3/Service/S3ServiceImpl.java @@ -34,14 +34,14 @@ public class S3ServiceImpl implements S3Service { private String CHATS_IMG_DIR="chats/"; private String USERS_IMG_DIR="users/"; @Override - public S3Response.uploadResponse uploadPostsFiles(List files, String userId, long id){ + public S3Response.uploadResponse uploadPostsFiles(List files, String userId){ StringBuilder imgDir= new StringBuilder(); imgDir.append(Posts_IMG_DIR) .append(File.separator) // 운영 체제에 맞는 구분자를 추가 .append(userId) .append(File.separator) - .append(id); + .append("posts"); Listlist= files.stream() .map(file->{ try { diff --git a/src/main/java/site/billbill/apiserver/api/s3/controller/S3Controller.java b/src/main/java/site/billbill/apiserver/api/s3/controller/S3Controller.java index d972f63..4088273 100644 --- a/src/main/java/site/billbill/apiserver/api/s3/controller/S3Controller.java +++ b/src/main/java/site/billbill/apiserver/api/s3/controller/S3Controller.java @@ -35,7 +35,7 @@ public BaseResponse upload(@Valid List } return switch (option) { - case "post" -> new BaseResponse<>(s3Service.uploadPostsFiles(images, userId,id)); + case "post" -> new BaseResponse<>(s3Service.uploadPostsFiles(images, userId)); case "chat" -> new BaseResponse<>(s3Service.uploadChatFiles(images, userId,id)); case "user" -> new BaseResponse<>(s3Service.uploadUserFiles(images)); default -> null; diff --git a/src/main/java/site/billbill/apiserver/common/validation/EnumValidator.java b/src/main/java/site/billbill/apiserver/common/validation/EnumValidator.java new file mode 100644 index 0000000..9698f8d --- /dev/null +++ b/src/main/java/site/billbill/apiserver/common/validation/EnumValidator.java @@ -0,0 +1,18 @@ +package site.billbill.apiserver.common.validation; + + +import jakarta.validation.Constraint; +import jakarta.validation.Payload; + +import java.lang.annotation.*; + +@Documented +@Constraint(validatedBy = EnumValidatorImpl.class) +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface EnumValidator { + String message() default "유효하지 않은 ENUM 값입니다."; + Class[] groups() default {}; + Class[] payload() default {}; + Class> enumClass(); +} diff --git a/src/main/java/site/billbill/apiserver/common/validation/EnumValidatorImpl.java b/src/main/java/site/billbill/apiserver/common/validation/EnumValidatorImpl.java new file mode 100644 index 0000000..329a681 --- /dev/null +++ b/src/main/java/site/billbill/apiserver/common/validation/EnumValidatorImpl.java @@ -0,0 +1,24 @@ +package site.billbill.apiserver.common.validation; + +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; + +import java.util.Arrays; + +public class EnumValidatorImpl implements ConstraintValidator> { + private Class> enumClass; + + @Override + public void initialize(EnumValidator constraintAnnotation) { + this.enumClass = constraintAnnotation.enumClass(); + } + + @Override + public boolean isValid(Enum value, ConstraintValidatorContext context) { + if (value == null) { + return true; // null 허용 (Optional) + } + return Arrays.stream(enumClass.getEnumConstants()) + .anyMatch(enumValue -> enumValue.equals(value)); + } +} diff --git a/src/main/java/site/billbill/apiserver/exception/advice/ExceptionControllerAdvice.java b/src/main/java/site/billbill/apiserver/exception/advice/ExceptionControllerAdvice.java index d2b9e27..7de8499 100644 --- a/src/main/java/site/billbill/apiserver/exception/advice/ExceptionControllerAdvice.java +++ b/src/main/java/site/billbill/apiserver/exception/advice/ExceptionControllerAdvice.java @@ -3,6 +3,7 @@ import jakarta.servlet.http.HttpServletRequest; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.http.converter.HttpMessageConversionException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.client.HttpServerErrorException; @@ -28,7 +29,13 @@ public ResponseEntity handleIllegalArgumentException(IllegalA exceptionResult.setMessage(ex.getMessage()); return new ResponseEntity<>(exceptionResult, HttpStatus.BAD_REQUEST); } - + @ExceptionHandler(HttpMessageConversionException.class) + public ResponseEntity handleHttpMessageConversionException(HttpMessageConversionException ex) { + ExceptionResponse exceptionResult = new ExceptionResponse(); + exceptionResult.setCode("400"); + exceptionResult.setMessage("입력값이 잘못되었습니다. ENUM으로 들어가는 값이나 필수 값을 잘 입력했는지 확인해보세요.: "+ ex.getMessage()); + return new ResponseEntity<>(exceptionResult, HttpStatus.BAD_REQUEST); + } @ExceptionHandler(HttpServerErrorException.class) public ResponseEntity handlerHttpServerErrorException(HttpServerErrorException ex) { ExceptionResponse exceptionResult = new ExceptionResponse(); diff --git a/src/main/java/site/billbill/apiserver/model/post/ItemsBorrowJpaEntity.java b/src/main/java/site/billbill/apiserver/model/post/ItemsBorrowJpaEntity.java index ae8a6b8..4753808 100644 --- a/src/main/java/site/billbill/apiserver/model/post/ItemsBorrowJpaEntity.java +++ b/src/main/java/site/billbill/apiserver/model/post/ItemsBorrowJpaEntity.java @@ -27,7 +27,8 @@ public class ItemsBorrowJpaEntity extends BaseTime { private String id; @OneToOne @MapsId - private ItemsJpaEntity items; + @JoinColumn(name="item_id") + private ItemsJpaEntity item; @Enumerated(EnumType.STRING) @Column(name = "price_standard") private PriceStandard priceStandard; @@ -35,10 +36,5 @@ public class ItemsBorrowJpaEntity extends BaseTime { private int price; @Column(name="deposit",nullable = false) private int deposit; - @Column(name="start_date",nullable = false) - private LocalDate startDate; - @Column(name = "end_date", nullable = false) - private LocalDate endDate; - @Column(name ="borrow_satus_code") - private String borrowStatusCode; + } diff --git a/src/main/java/site/billbill/apiserver/model/post/ItemsBorrowStatusJpaEntity.java b/src/main/java/site/billbill/apiserver/model/post/ItemsBorrowStatusJpaEntity.java new file mode 100644 index 0000000..2e50a32 --- /dev/null +++ b/src/main/java/site/billbill/apiserver/model/post/ItemsBorrowStatusJpaEntity.java @@ -0,0 +1,31 @@ +package site.billbill.apiserver.model.post; + +import jakarta.persistence.*; +import lombok.*; +import org.hibernate.annotations.DynamicUpdate; +import site.billbill.apiserver.model.BaseTime; + +import java.time.LocalDate; +@DynamicUpdate +@Entity +@Builder +@Table(name = "items_borrow_status") +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class ItemsBorrowStatusJpaEntity extends BaseTime { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name="status_seq") + private String id; + @ManyToOne + @JoinColumn(name="item_id") + private ItemsJpaEntity item; + @Column(name="start_date",nullable = false) + private LocalDate startDate; + @Column(name = "end_date", nullable = false) + private LocalDate endDate; + @Column(name ="borrow_status_code") + private String borrowStatusCode; +} diff --git a/src/main/java/site/billbill/apiserver/model/post/ItemsExchangeJpaEntity.java b/src/main/java/site/billbill/apiserver/model/post/ItemsExchangeJpaEntity.java index 77e4c48..fcc0e14 100644 --- a/src/main/java/site/billbill/apiserver/model/post/ItemsExchangeJpaEntity.java +++ b/src/main/java/site/billbill/apiserver/model/post/ItemsExchangeJpaEntity.java @@ -21,7 +21,8 @@ public class ItemsExchangeJpaEntity extends BaseTime { @ManyToOne @MapsId - private ItemsJpaEntity items; + @JoinColumn(name="item_id") + private ItemsJpaEntity item; @Convert(converter = StringListConverter.class) @JoinColumn(name="wisiList",nullable = false) String wishList; diff --git a/src/main/java/site/billbill/apiserver/model/post/ItemsJpaEntity.java b/src/main/java/site/billbill/apiserver/model/post/ItemsJpaEntity.java index efda4de..84f2a3a 100644 --- a/src/main/java/site/billbill/apiserver/model/post/ItemsJpaEntity.java +++ b/src/main/java/site/billbill/apiserver/model/post/ItemsJpaEntity.java @@ -2,10 +2,7 @@ import io.micrometer.core.annotation.Counted; import jakarta.persistence.*; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; +import lombok.*; import site.billbill.apiserver.common.converter.BooleanConverter; import site.billbill.apiserver.common.converter.StringListConverter; import site.billbill.apiserver.model.BaseTime; @@ -20,6 +17,7 @@ @Setter @NoArgsConstructor @AllArgsConstructor +@Builder public class ItemsJpaEntity extends BaseTime { @Id @Column(name = "item_id", nullable = false) @@ -39,5 +37,7 @@ public class ItemsJpaEntity extends BaseTime { @Column(name = "del_yn", nullable = false) @Convert(converter = BooleanConverter.class) private boolean delYn; + @Column(name="item_status",nullable = false) + private int itemStatus; } diff --git a/src/main/java/site/billbill/apiserver/model/post/ItemsLocationJpaEntity.java b/src/main/java/site/billbill/apiserver/model/post/ItemsLocationJpaEntity.java index 34bc234..478d7f1 100644 --- a/src/main/java/site/billbill/apiserver/model/post/ItemsLocationJpaEntity.java +++ b/src/main/java/site/billbill/apiserver/model/post/ItemsLocationJpaEntity.java @@ -20,9 +20,10 @@ public class ItemsLocationJpaEntity extends BaseTime { @Column(name="item_id") private String id; - @MapsId @ManyToOne - private ItemsJpaEntity items; + @MapsId + @JoinColumn(name="item_id") + private ItemsJpaEntity item; @Column(name="address",nullable = false) private String address; diff --git a/src/main/java/site/billbill/apiserver/repository/borrowPosts/ItemsBorrowRepository.java b/src/main/java/site/billbill/apiserver/repository/borrowPosts/ItemsBorrowRepository.java new file mode 100644 index 0000000..af47d56 --- /dev/null +++ b/src/main/java/site/billbill/apiserver/repository/borrowPosts/ItemsBorrowRepository.java @@ -0,0 +1,7 @@ +package site.billbill.apiserver.repository.borrowPosts; + +import org.springframework.data.jpa.repository.JpaRepository; +import site.billbill.apiserver.model.post.ItemsBorrowJpaEntity; + +public interface ItemsBorrowRepository extends JpaRepository { +} diff --git a/src/main/java/site/billbill/apiserver/repository/borrowPosts/ItemsBorrowStatusRepository.java b/src/main/java/site/billbill/apiserver/repository/borrowPosts/ItemsBorrowStatusRepository.java new file mode 100644 index 0000000..f01ff5f --- /dev/null +++ b/src/main/java/site/billbill/apiserver/repository/borrowPosts/ItemsBorrowStatusRepository.java @@ -0,0 +1,7 @@ +package site.billbill.apiserver.repository.borrowPosts; + +import org.springframework.data.jpa.repository.JpaRepository; +import site.billbill.apiserver.model.post.ItemsBorrowStatusJpaEntity; + +public interface ItemsBorrowStatusRepository extends JpaRepository { +} diff --git a/src/main/java/site/billbill/apiserver/repository/borrowPosts/ItemsRepository.java b/src/main/java/site/billbill/apiserver/repository/borrowPosts/ItemsRepository.java new file mode 100644 index 0000000..9557f82 --- /dev/null +++ b/src/main/java/site/billbill/apiserver/repository/borrowPosts/ItemsRepository.java @@ -0,0 +1,9 @@ +package site.billbill.apiserver.repository.borrowPosts; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +import site.billbill.apiserver.model.post.ItemsJpaEntity; + +@Repository +public interface ItemsRepository extends JpaRepository { +}