Java/Spring

스프링 프로젝트 코드 리뷰

SeungbeomKim 2022. 8. 23. 22:27
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 같은 정보는 숨겨주는게 좋다.

postman으로 보여지는 MyPage Response

=>비밀번호, 주소 등은 유출되서는 안되는 중요한 정보들이다. 비록 암호화된 코드일지라도, 사람들이 해킹을 하거나 암호화된 코드를 해독할 수 있을 우려가 있기 때문에 주의해야 한다. 이러한 변수들을 아까 배웠던 @JsonIgnore를 사용하면 좋을 것 같다. 

8. 전체적인 url 체계만 나중에 공부 후 바꿔주는게 좋을 것 같다.

=>url 체계는 각 packege의 기능들마다 체계가 비슷해야 하기에, 이를 고려해서 url체계를 작성해주면 좋을 것 같다고 생각했다.

9. CartService 같이 결제 코드가 있는 부분은 꼭 트랜잭션 달아줘야함. 혹시나 결제 진행 중에 서버 장애가 생긴다면, 트랜잭션이 있어야지 롤백이 됨

=>데이터베이스에서 상태가 변화되기 위한 각 기능의 단위인데, 앞에 @Transaction이라는 어노테이션을 달아줘서, 오류 발생 시 롤백연산을 처리할 수 있게 된다.