JAVA

[JAVA/SpringBoot] 회원별 상품 등록 및 조회 (2-10)

wonderson 2022. 5. 29. 18:39
반응형

[여기에 적은 거는 강의 내용을 다 적은게 아니라서 강의자료 보면서 이 게시글 참고하자.]

[스프링 심화 강의 2주차 10강 회원별 상품 등록 및 조회]

 

- springCore 프로젝트에서 실습

 

 

상품 등록 및 조회 (모든 회원)

- 상품 등록 API 가 처리되지 않고 있음

  • POST "/api/products" 요청 → HTTP 403 Forbidden
    403 Forbidden : 너가 요청한 것은 서버에서 너한테 허용하지 않은거야 라고 하는거다.

- POST 요청마다 처리해 주는 대신 ★ CSRF protection 을 disable

 

1) POST 요청마다 처리

http.csrf()
        .ignoringAntMatchers("/user/**")
				.ignoringAntMatchers("/api/products/**");

 

2) CSRF 를 disable

// CSRF protection 을 비활성화
http.csrf().disable();

 

이후 상품 등록 및 조회 동작 확인

🚨 [현재 문제점]
모든 회원에게 모든 관심상품이 보이고 있음

 


상품 등록 및 조회 (회원별)

  • 👉 회원 별 등록된 상품을 조회합니다.
    1. 상품 등록 시 누구의 상품인지 등록 필요
      • 관심 상품 등록 시, 등록을 요청한 "회원 정보" 추가 필요
        • 회원 (User) 테이블을 보고, 어떤 정보를 저장해야 좋을지 결정 필요
        • USER 테이블에 userid 변수 추가하자. (Product 클래스에)
컬럼명 컬럼타입 중복허용 설명
id Long X 테이블 ID (PK)
username String X 회원 ID
password String O 패스워드
email String X 이메일 주소
role String O 역할
1) 사용자: USER
2) 관리자: ADMIN

 

        • 각 회원마다 부여되어 있는 "회원 테이블 ID" (id) 를 저장하는 것으로 결정
          • 보통 테이블의 PK 를 사용함 ⇒ DB 입장에서 효율적
          • 4주차 수업에서 자세히 학습합니다. ("DB 연관관계")
    1. 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. 상품 등록 및 조회 구현
    • a. Controller 에서 로그인 회원 정보를 받아 Service 로 전달
      • [코드스니펫] controller > ProductController
더보기
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;
    }
}

 

  •  

b. 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);
    }
}

 

c. 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 가 잘 저장되는지도 확인
  •  
반응형