회원별 상품 등록 및 조회

송영재·2022년 10월 23일

Spring

목록 보기
11/45
  • 21) 상품 등록 및 조회 (모든 회원)
    • 상품 등록 API 가 처리되지 않고 있음
      • POST "/api/products" 요청 → HTTP 403 Forbidden
    • POST 요청마다 처리해 주는 대신 CSRF protection 을 disable 1) POST 요청마다 처리
      http.csrf()
              .ignoringAntMatchers("/user/**")
      				.ignoringAntMatchers("/api/products/**");
      2) CSRF 를 disable
      // CSRF protection 을 비활성화
      http.csrf().disable();
      
    • 이후 상품 등록 및 조회 동작 확인 🚨 [현재 문제점]
      모든 회원에게 모든 관심상품이 보이고 있음
  • 22) 상품 등록 및 조회 (회원별)
    1. 상품 등록 시 누구의 상품인지 등록 필요
      • 관심 상품 등록 시, 등록을 요청한 "회원 정보" 추가 필요
        • 회원 (User) 테이블을 보고, 어떤 정보를 저장해야 좋을지 결정 필요
        • 각 회원마다 부여되어 있는 "회원 테이블 ID" (id) 를 저장하는 것으로 결정
          • 보통 테이블의 PK 를 사용함 ⇒ DB 입장에서 효율적
          • 4주차 수업에서 자세히 학습합니다. ("DB 연관관계")
    2. Product 테이블에 "회원 테이블 ID" 추가
      • 관심 상품 (Product) 테이블에 "회원 테이블 ID" 저장을 위한 컬럼 "userId" 추가
      • [코드스니펫] model > Product
        import com.sparta.springcore.dto.ProductRequestDto;
        import lombok.Getter;
        import lombok.NoArgsConstructor;
        import lombok.Setter;
        
        import javax.persistence.*;
        
        @Setter
        @Getter // get 함수를 일괄적으로 만들어줍니다.
        @NoArgsConstructor // 기본 생성자를 만들어줍니다.
        @Entity // DB 테이블 역할을 합니다.
        public class Product {
        
            // ID가 자동으로 생성 및 증가합니다.
            @GeneratedValue(strategy = GenerationType.AUTO)
            @Id
            private Long id;
        
            // 반드시 값을 가지도록 합니다.
            @Column(nullable = false)
            private String title;
        
            @Column(nullable = false)
            private String image;
        
            @Column(nullable = false)
            private String link;
        
            @Column(nullable = false)
            private int lprice;
        
            @Column(nullable = false)
            private int myprice;
        
            @Column(nullable = false)
            private Long userId;
        
            // 관심 상품 생성 시 이용합니다.
            public Product(ProductRequestDto requestDto, Long userId) {
                // 관심상품을 등록한 회원 Id 저장
                this.userId = userId;
                this.title = requestDto.getTitle();
                this.image = requestDto.getImage();
                this.link = requestDto.getLink();
                this.lprice = requestDto.getLprice();
                this.myprice = 0;
            }
        }
    3. 상품 등록 및 조회 구현
      1. Controller 에서 로그인 회원 정보를 받아 Service 로 전달
        • [코드스니펫] controller > ProductController
          import com.sparta.springcore.dto.ProductMypriceRequestDto;
          import com.sparta.springcore.dto.ProductRequestDto;
          import com.sparta.springcore.model.Product;
          import com.sparta.springcore.security.UserDetailsImpl;
          import com.sparta.springcore.service.ProductService;
          import org.springframework.beans.factory.annotation.Autowired;
          import org.springframework.security.core.annotation.AuthenticationPrincipal;
          import org.springframework.web.bind.annotation.*;
          
          import java.util.List;
          
          @RestController // JSON으로 데이터를 주고받음을 선언합니다.
          public class ProductController {
          
              private final ProductService productService;
          
              @Autowired
              public ProductController(ProductService productService) {
                  this.productService = productService;
              }
          
              // 신규 상품 등록
              @PostMapping("/api/products")
              public Product createProduct(@RequestBody ProductRequestDto requestDto,
                                           @AuthenticationPrincipal UserDetailsImpl userDetails) {
                  // 로그인 되어 있는 회원 테이블의 ID
                  Long userId = userDetails.getUser().getId();
          
                  Product product = productService.createProduct(requestDto, userId);
          
                  // 응답 보내기
                  return product;
              }
          
              // 설정 가격 변경
              @PutMapping("/api/products/{id}")
              public Long updateProduct(@PathVariable Long id, @RequestBody ProductMypriceRequestDto requestDto) {
                  Product product = productService.updateProduct(id, requestDto);
          
                  // 응답 보내기 (업데이트된 상품 id)
                  return product.getId();
              }
          
              // 로그인한 회원이 등록한 관심 상품 조회
              @GetMapping("/api/products")
              public List<Product> getProducts(@AuthenticationPrincipal UserDetailsImpl userDetails) {
                  // 로그인 되어 있는 회원 테이블의 ID
                  Long userId = userDetails.getUser().getId();
          
                  return productService.getProducts(userId);
              }
          }
      2. Service 에서 회원별 상품 등록 및 조회 구현
        • [코드스니펫] service> ProductService
          import com.sparta.springcore.dto.ProductMypriceRequestDto;
          import com.sparta.springcore.dto.ProductRequestDto;
          import com.sparta.springcore.model.Product;
          import com.sparta.springcore.repository.ProductRepository;
          import org.springframework.beans.factory.annotation.Autowired;
          import org.springframework.stereotype.Service;
          
          import java.util.List;
          
          @Service
          public class ProductService {
          
              private final ProductRepository productRepository;
          
              @Autowired
              public ProductService(ProductRepository productRepository) {
                  this.productRepository = productRepository;
              }
          
              public Product createProduct(ProductRequestDto requestDto, Long userId ) {
                  // 요청받은 DTO 로 DB에 저장할 객체 만들기
                  Product product = new Product(requestDto, userId);
          
                  productRepository.save(product);
          
                  return product;
              }
          
              public Product updateProduct(Long id, ProductMypriceRequestDto requestDto) {
                  Product product = productRepository.findById(id)
                          .orElseThrow(() -> new NullPointerException("해당 아이디가 존재하지 않습니다."));
          
                  int myprice = requestDto.getMyprice();
                  product.setMyprice(myprice);
                  productRepository.save(product);
          
                  return product;
              }
          
              // 회원 ID 로 등록된 상품 조회
              public List<Product> getProducts(Long userId) {
                  return productRepository.findAllByUserId(userId);
              }
          }
      3. Repository 에 회원별 상품 조회하는 함수 추가
        • [코드스니펫] repository > ProductRepository
          import com.sparta.springcore.model.Product;
          import org.springframework.data.jpa.repository.JpaRepository;
          
          import java.util.List;
          
          public interface ProductRepository extends JpaRepository<Product, Long> {
              List<Product> findAllByUserId(Long userId);
          }
    4. UI 동작 테스트!!
      • H2 Console 통해 회원 ID 가 잘 저장되는지도 확인

0개의 댓글