Review review = Review.builder()
.comment(reviewRequestDto.getComment())
.rate(reviewRequestDto.getRate())
.product(product)
.user(writer)
.build();
return reviewRepository.save(review);
1.빌더(Builder)로 구현해보고자 한 건 좋지만, 생성자의 장점을 놓친 것 같다. 둘의 차이를 알고 어떨 때에는 빌더를 쓰고, 어떨 때에는 생성자를 쓰는지 차이점을 알면 더 좋을 것 같다.
빌더와 생성자에 대해서 각 상황에 맞게 적용하는 방안을 생각해봐야 겠다.
@JoinColumn(name = "User_id")
@ManyToOne(fetch = FetchType.LAZY)
@OnDelete(action = OnDeleteAction.NO_ACTION)
@JsonIgnore
private User user;
@JoinColumn(name = "Product_id")
@ManyToOne(fetch = FetchType.LAZY)
@OnDelete(action = OnDeleteAction.CASCADE)
@JsonIgnore
private Product product;
2. @JsonIgnore -> product 와 user는 리뷰에서 숨길 필요가 없다. // 실제로 대부분 쇼핑몰에서는 사용자에게 상품명과 작성자가 보이는 경우가 많기 때문 (박** 같은 암호화는 프론트에서 진행)
프로젝트를 만들기 전, 보안이 필요한 것들에 대해 생각한 후 변수들을 선언해주고, 필요한 연관관계를 맺어줘야겠다.
4. 추후에 Role은 Enum 타입 클래스로 따로 빼주는게 좋음
=>쇼핑몰 프로젝트에서 관리자, 판매자, 구매자 등등 다양한 역할이 있는데, 쇼핑몰에서는 역할이 한정적이다.
Enum class를 사용하는 이유 :
코드가 단순해지며 가독성이 좋습니다. 인스턴스 생성과 상속을 방지합니다. 키워드 enum을 사용하기 때문에 구현의 의도가 열거임을 분명하게 나타낼 수 있습니다.
5. ReviewResponseDto 에서 사용자를 User 객체로 빼지 않고, username으로 파싱해서 주는 건 아주 좋음
package com.studyProjectA.ShoppingMall.dto;
import com.studyProjectA.ShoppingMall.entity.Review;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.time.LocalDate;
/*
Client에게 Review 객체정보를 다 주지않고
원하는 데이터만 줄 수 있게 하는 Dto
user 이름
review 평점
product 판매자 회사이름 or 개인이름
review 작성날짜
product 상품 이름
review 리뷰멘트
이렇게만 페이지에 표시해주면 된다.
*/
@Data
public class ReviewResponseDto {
@NotBlank
private String buyerName;
@NotNull
private Integer rate;
@NotBlank
private String sellerName;
@NotBlank
private LocalDate date;
@NotBlank
private String productName;
@NotBlank
private String comment;
// Constructor
public ReviewResponseDto(String buyerName, int rate, String sellerName, LocalDate date, String productName, String comment) {
this.buyerName = buyerName;
this.rate = rate;
this.sellerName = sellerName;
this.date = date;
this.productName = productName;
this.comment = comment;
}
// toDto
public static ReviewResponseDto toDto(Review review) {
return new ReviewResponseDto(
review.getUser().getUsername(),
review.getRate(),
review.getProduct().getSeller().getUsername(),
review.getCreateDate(),
review.getProduct().getProductName(),
review.getComment()
);
}
}
6. 결제시 전처리를 해주는게 좋음 (구매 신청시, 수량이 부족하거나, 금액이 부족한 경우 사전 차단)
=> 이 부분에 대해서는 조금 더 공부해야봐야 알 것 같다.
7. 회원가입 혹은 MyPage Response 결과에서는 password 같은 정보는 숨겨주는게 좋다.
=>비밀번호, 주소 등은 유출되서는 안되는 중요한 정보들이다. 비록 암호화된 코드일지라도, 사람들이 해킹을 하거나 암호화된 코드를 해독할 수 있을 우려가 있기 때문에 주의해야 한다. 이러한 변수들을 아까 배웠던 @JsonIgnore를 사용하면 좋을 것 같다.
8. 전체적인 url 체계만 나중에 공부 후 바꿔주는게 좋을 것 같다.
=>url 체계는 각 packege의 기능들마다 체계가 비슷해야 하기에, 이를 고려해서 url체계를 작성해주면 좋을 것 같다고 생각했다.
9. CartService 같이 결제 코드가 있는 부분은 꼭 트랜잭션 달아줘야함. 혹시나 결제 진행 중에 서버 장애가 생긴다면, 트랜잭션이 있어야지 롤백이 됨
=>데이터베이스에서 상태가 변화되기 위한 각 기능의 단위인데, 앞에 @Transaction이라는 어노테이션을 달아줘서, 오류 발생 시 롤백연산을 처리할 수 있게 된다.
'Java > Spring' 카테고리의 다른 글
스프링 쇼핑몰 프로젝트 장바구니(cart) 기능 구현 (0) | 2022.09.14 |
---|---|
Gradle 환경에서 Swagger 사용 방법(API 문서 자동화) (0) | 2022.08.31 |
스프링부트 프로젝트 최종 결과물 (0) | 2022.08.22 |
스프링 프로젝트 리팩토링 전 코드(review) (0) | 2022.08.22 |
Junit5을 이용한 테스트코드 작성(단위 테스트 코드) (0) | 2022.08.15 |