diff --git a/src/main/java/potato/server/product/domain/Product.java b/src/main/java/potato/server/product/domain/Product.java index 3e11183..5445f29 100644 --- a/src/main/java/potato/server/product/domain/Product.java +++ b/src/main/java/potato/server/product/domain/Product.java @@ -7,6 +7,8 @@ import lombok.NoArgsConstructor; import potato.server.common.BaseTimeEntity; import potato.server.product.dto.request.ProductUpdateRequest; +import potato.server.town.domain.Town; + import java.math.BigDecimal; /** @@ -37,6 +39,10 @@ public class Product extends BaseTimeEntity { @Column(length = 1000, nullable = false) private String description; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "town_id") + private Town town; + private Integer hit; private Integer stock; @@ -44,15 +50,15 @@ public class Product extends BaseTimeEntity { private Integer version; @Builder - public Product(Category category, String title, BigDecimal price, String description, Integer hit, Integer stock, Integer version) { + public Product(Category category, String title, BigDecimal price, String description, Town town, Integer stock, Integer version) { this.category = category; this.title = title; this.price = price; this.description = description; + this.town = town; this.hit = 0; this.stock = stock; this.version = 0; - } public void addHit(){ @@ -69,4 +75,4 @@ public void updateProduct(ProductUpdateRequest productUpdateRequest) { if (productUpdateRequest.getStock() != null) this.stock = productUpdateRequest.getStock(); } -} \ No newline at end of file +} diff --git a/src/main/java/potato/server/product/dto/request/ProductCreateRequest.java b/src/main/java/potato/server/product/dto/request/ProductCreateRequest.java index c256685..0979c56 100644 --- a/src/main/java/potato/server/product/dto/request/ProductCreateRequest.java +++ b/src/main/java/potato/server/product/dto/request/ProductCreateRequest.java @@ -28,5 +28,9 @@ public class ProductCreateRequest { @NotNull private Integer stock; + + @NotNull + private String townName; + private List productImageIds = new ArrayList<>(); -} \ No newline at end of file +} diff --git a/src/main/java/potato/server/product/dto/response/ProductResponse.java b/src/main/java/potato/server/product/dto/response/ProductResponse.java index 3f792e5..dbbb341 100644 --- a/src/main/java/potato/server/product/dto/response/ProductResponse.java +++ b/src/main/java/potato/server/product/dto/response/ProductResponse.java @@ -21,15 +21,17 @@ public class ProductResponse { private String description; private Integer hit; private Integer stock; + private String townName; private Integer version; @QueryProjection - public ProductResponse(String title, BigDecimal price, String description, Integer stock, Integer version, Integer hit) { + public ProductResponse(String title, BigDecimal price, String description, Integer stock, Integer version, String townName, Integer hit) { this.title = title; this.price = price; this.description = description; this.stock = stock; this.version = version; + this.townName = townName; this.hit = hit; } @@ -51,6 +53,7 @@ public static ProductResponse of(Product product) { product.getDescription(), product.getStock(), product.getVersion(), + product.getTown().getName(), product.getHit()); } -} \ No newline at end of file +} diff --git a/src/main/java/potato/server/product/repository/ProductRepositoryImpl.java b/src/main/java/potato/server/product/repository/ProductRepositoryImpl.java index 712bf23..d70c2a4 100644 --- a/src/main/java/potato/server/product/repository/ProductRepositoryImpl.java +++ b/src/main/java/potato/server/product/repository/ProductRepositoryImpl.java @@ -4,8 +4,11 @@ import lombok.RequiredArgsConstructor; import potato.server.product.dto.response.ProductResponse; import potato.server.product.dto.response.QProductResponse; + import java.util.List; + import static potato.server.product.domain.QProduct.product; +import static potato.server.town.domain.QTown.town; /** * @author: 박건휘 @@ -28,10 +31,12 @@ public List findAllProducts() { product.description, product.hit, product.stock, + product.town.name, product.version )) .from(product) + .join(product.town, town) .orderBy(product.createdDate.asc()) .fetch(); } -} \ No newline at end of file +} diff --git a/src/main/java/potato/server/product/service/ProductService.java b/src/main/java/potato/server/product/service/ProductService.java index 321de82..700573a 100644 --- a/src/main/java/potato/server/product/service/ProductService.java +++ b/src/main/java/potato/server/product/service/ProductService.java @@ -1,5 +1,6 @@ package potato.server.product.service; +import jakarta.persistence.EntityNotFoundException; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import org.springframework.http.HttpStatus; @@ -15,6 +16,8 @@ import potato.server.product.dto.response.ProductResponse; import potato.server.product.repository.ProductImageRepository; import potato.server.product.repository.ProductRepository; +import potato.server.town.domain.Town; +import potato.server.town.repository.TownRepository; import java.util.List; @@ -28,14 +31,19 @@ public class ProductService { private final ProductRepository productRepository; private final ProductImageRepository productImageRepository; + private final TownRepository townRepository; @Transactional public void createProduct(ProductCreateRequest request) { + Town town = townRepository.findByName(request.getTownName()) + .orElseThrow(() -> new EntityNotFoundException("마을 정보가 없습니다")); + Product product = Product.builder() .price(request.getPrice()) .title(request.getTitle()) .description(request.getDescription()) .stock(request.getStock()) + .town(town) .build(); productRepository.save(product); @@ -89,4 +97,4 @@ public ProductResponse updateProduct(ProductUpdateRequest productUpdateRequest) public List getAllProducts() { return productRepository.findAllProducts(); } -} \ No newline at end of file +} diff --git a/src/main/java/potato/server/town/domain/Town.java b/src/main/java/potato/server/town/domain/Town.java new file mode 100644 index 0000000..30fc8f3 --- /dev/null +++ b/src/main/java/potato/server/town/domain/Town.java @@ -0,0 +1,22 @@ +package potato.server.town.domain; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.NoArgsConstructor; + +/** + * @author 허석문 + * @since 2024-02-22 + */ +@Entity +@Getter +@NoArgsConstructor +public class Town { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "town_id") + private Long id; + + private String name; +} diff --git a/src/main/java/potato/server/town/repository/TownRepository.java b/src/main/java/potato/server/town/repository/TownRepository.java new file mode 100644 index 0000000..46d86a0 --- /dev/null +++ b/src/main/java/potato/server/town/repository/TownRepository.java @@ -0,0 +1,10 @@ +package potato.server.town.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import potato.server.town.domain.Town; + +import java.util.Optional; + +public interface TownRepository extends JpaRepository { + Optional findByName(String name); +} diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml index c883555..fff16cf 100644 --- a/src/main/resources/logback-spring.xml +++ b/src/main/resources/logback-spring.xml @@ -1,6 +1,6 @@ - + ${SLACK_WEBHOOK_URI} @@ -28,4 +28,4 @@ - \ No newline at end of file +