๐Ÿ˜Ž

์ƒํ’ˆ ์กฐํšŒ ๋กœ์ง ๊ตฌํ˜„ํ•˜๊ธฐ

ๅๆœˆ 2024. 8. 3. 13:46

 

ProductController

    @Operation(summary = "์ƒํ’ˆ ์กฐํšŒ", description = "์ƒํ’ˆ ์กฐํšŒ์ž…๋‹ˆ๋‹ค")
    @GetMapping("/{id}")
    public @ResponseBody ApiResponse<ProductSelectResponseDto> selectProduct(@PathVariable(name = "id") long id) throws Exception{
        return ApiResponse.OK(productService.selectProduct(id));
    }

 

ProductService

// ์ƒํ’ˆ ์กฐํšŒ
    public ProductSelectResponseDto selectProduct(Long id) {

        Product product = productRepository.findById(id)
                .orElseThrow( ()-> new CustomException(PRODUCT_NOT_FOUND));

        List<ProductSelectResponseDto.productOptionSelectResponseDto> optionDtoList = new ArrayList<>();

        // Option Entity List ๋ฅผ Option Dto List๋กœ ๋ฐ”๊พธ๋Š” ๊ณผ์ • (๊บผ๋‚ด๋Š” ๊ฑฐ)
        for(ProductOption productOption : product.getProductOptionList()){
            // Entity List → Entity

            // Option ํ•˜๋‚˜์— ์—ฐ๊ฒฐ๋œ Option detail Entity List๋ฅผ ๊ฐ€์ ธ์™€ String ํƒ€์ž…์˜ List detail์— ๋„ฃ์–ด์คŒ
            // ๊ฒฐ๊ตญ์€ ์ด ๊ณผ์ •์ด optionDto์˜ optionDetails ์ž๋ฆฌ์— ๋„ฃ๊ธฐ ์œ„ํ•จ.
            List<String> detail = new ArrayList<>();
            for(ProductOptionDetail d : productOption.getProductOptionDetailList()){
                detail.add(d.getOptionContent());
            }

            ProductSelectResponseDto.productOptionSelectResponseDto optionDto = new ProductSelectResponseDto.productOptionSelectResponseDto(productOption.getOptionEx(), detail);
            // ์œ„์˜ optionDtoList๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ optionDto๋ฅผ ๋„ฃ๊ธฐ ์œ„ํ•ด ๋งŒ๋“ฆ
            optionDtoList.add(optionDto);
        }

        return new ProductSelectResponseDto(product.getProductNo(), product.getProductCategory().getProductCategoryNo(), product.getProductName(), product.getProductContent(),
                product.getPrice(), product.getProductQuantity(), optionDtoList);
    }

 

ProductSelectResponseDto

package com.example.bluesyroom.dto.product;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.List;

@AllArgsConstructor
@NoArgsConstructor
@Getter
public class ProductSelectResponseDto {
    // โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…โ˜…
    // optionEx๋ฅผ List๋กœ ๋ฐ”๊ฟ”์„œ innetClass ๋ณ€๊ฒฝ ํ•˜๊ณ  ~~~~

    private long productNo;
    private Long productCategoryNo;
    private String productName;
    private String productContent;
    private int price;
    private int productQuantity;
    private List<productOptionSelectResponseDto> optionDtoList;

    @NoArgsConstructor
    @AllArgsConstructor
    @Getter
    public static class productOptionSelectResponseDto {
        private String optionEx;
        private List<String> optionDetails;
    }

}

 

Product

package com.example.bluesyroom.entity;

import java.util.*;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import com.example.bluesyroom.entity.ProductImage;

@Entity
@NoArgsConstructor
@Getter
@Setter         // ์ƒํ’ˆ
@Table(name = "PRODUCT")
public class Product {
    @Id // ๊ธฐ๋ณธํ‚ค
    @GeneratedValue(strategy = GenerationType.IDENTITY) // auto_increament
    @Column(name = "PRODUCT_NO", nullable = false)
    private long productNo;

    // DB ์ปฌ๋Ÿผ์€ _ ์‚ฌ์šฉ
    @Column(name = "PRODUCT_NAME", nullable = false)
    private String productName;

    @Column(name = "PRODUCT_CONTENT", nullable = false)
    private String productContent;

    @Column(name = "PRICE", nullable = false)
    private int price;

    @Column(name = "PRODUCT_QUANTITY", nullable = false)
    private int productQuantity;

    // ํ…Œ์ด๋ธ” ์ƒ์„ฑ๊ณผ ์กฐ์ธ์€ ์ดํ›„์— ๋”ฐ๋กœ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ

    @OneToOne
    @JoinColumn(name = "PRODUCT_CATEGORY_NO")
    private ProductCategory productCategory;

    @OneToMany(mappedBy = "product")
    private List<ProductImage> productImageList = new ArrayList<ProductImage>();

	// โ˜… โ˜…
    @OneToMany(mappedBy = "product")
    private List<ProductOption> productOptionList = new ArrayList<>();

    public Product(String productName, String productContent, int price, int productQuantity, ProductCategory productCategory) {
        this.productName = productName;
        this.productContent = productContent;
        this.price = price;
        this.productQuantity = productQuantity;
        this.productCategory = productCategory;
    }
}

 

ProductOption

package com.example.bluesyroom.entity;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.util.ArrayList;
import java.util.List;

@Entity
@NoArgsConstructor
@Getter
@Setter         // ์ƒํ’ˆ ์˜ต์…˜
@Table(name = "PRODUCT_OPTION")
public class ProductOption {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "OPTION_NO", nullable = false)
    private long optionNo;

    @Column(name = "OPTION_EX", nullable = false)
    private String optionEx;

    @ManyToOne
    @JoinColumn(name = "PRODUCT_NO")
    private Product product;
    
	// โ˜… โ˜…
    @OneToMany(mappedBy = "productOption")
    private List<ProductOptionDetail> productOptionDetailList = new ArrayList<>();

    public ProductOption(String optionEx) {
        this.optionEx = optionEx;
    }
}

 

ProductOptionDetail

package com.example.bluesyroom.entity;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Entity
@NoArgsConstructor
@Getter
@Setter         // ์ƒํ’ˆ ์˜ต์…˜ ์ƒ์„ธ
@Table(name = "PRODUCT_OPTION_DETAIL")
public class ProductOptionDetail {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "OPTION_DETAIL_NO", nullable = false)
    private long optionDetailNo;

    @Column(name = "OPTION_CONTENT", nullable = false)
    private String optionContent;

    @ManyToOne
    @JoinColumn(name = "OPTION_NO")
    private ProductOption productOption;

    public ProductOptionDetail(String optionContent, ProductOption productOption) {
        this.optionContent = optionContent;
        this.productOption = productOption;
    }
}