반응형
[여기에 적은 거는 강의 내용을 다 적은게 아니라서 강의자료 보면서 이 게시글 참고하자.]
[스프링 심화 강의 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();
이후 상품 등록 및 조회 동작 확인
🚨 [현재 문제점]
모든 회원에게 모든 관심상품이 보이고 있음
상품 등록 및 조회 (회원별)
- 👉 회원 별 등록된 상품을 조회합니다.
- 상품 등록 시 누구의 상품인지 등록 필요
- 관심 상품 등록 시, 등록을 요청한 "회원 정보" 추가 필요
- 회원 (User) 테이블을 보고, 어떤 정보를 저장해야 좋을지 결정 필요
- USER 테이블에 userid 변수 추가하자. (Product 클래스에)
- 관심 상품 등록 시, 등록을 요청한 "회원 정보" 추가 필요
- 상품 등록 시 누구의 상품인지 등록 필요
컬럼명 | 컬럼타입 | 중복허용 | 설명 |
id | Long | X | 테이블 ID (PK) |
username | String | X | 회원 ID |
password | String | O | 패스워드 |
String | X | 이메일 주소 | |
role | String | O | 역할 1) 사용자: USER 2) 관리자: ADMIN |
-
-
-
- 각 회원마다 부여되어 있는 "회원 테이블 ID" (id) 를 저장하는 것으로 결정
- 보통 테이블의 PK 를 사용함 ⇒ DB 입장에서 효율적
- 4주차 수업에서 자세히 학습합니다. ("DB 연관관계")
- 각 회원마다 부여되어 있는 "회원 테이블 ID" (id) 를 저장하는 것으로 결정
-
- 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
- a. Controller 에서 로그인 회원 정보를 받아 Service 로 전달
더보기
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 가 잘 저장되는지도 확인
반응형
'JAVA' 카테고리의 다른 글
[JAVA_Study] 스터디 2일차 (for-each문, 생성자, 상속, 인터페이스, 추상클래스 ) (0) | 2022.06.21 |
---|---|
[JAVA_Study] 스터디 1일차 (변수, 상수, 배열, 삼항연산자) (0) | 2022.06.20 |
[JAVA/SpringBoot] 로그인, 로그아웃 기능 구현 (2-9) 세번째 (0) | 2022.05.29 |
[JAVA/SpringBoot] 로그인, 로그아웃 기능 구현 (2-9) 두번째 (0) | 2022.05.29 |
[JAVA/SpringBoot] 로그인, 로그아웃 기능 구현 (2-9) 첫번째 (0) | 2022.05.29 |