본문 바로가기
개발서/ToyProject-Smart

[Toy - Smart] ProductInfoDto 리팩토링

by 사서T 2023. 2. 25.

ProductInfoDto 살펴보기

ProductInfoDto는 제품에 대한 정보를 응답에 맞게 변환하여 저장하는 클래스이다.

 

- DTO 클래스이다.

- 반환되는 데이터 형식으로 사용된다.

 

@Getter
@Setter
@ToString
@NoArgsConstructor
public class ProductInfoDto {

    private Long productId;
    private List<String> imgFiles;
    private String name;
    private Integer price;
    private String code;
    private String size;
    private String detailInfo;

    public ProductInfoDto(Product product, List<String> productAccessImgUrl, String detailInfoAccessImgUrl) {
        this.productId = product.getProductId();
        this.imgFiles = productAccessImgUrl;
        this.name = product.getName();
        this.price = product.getPrice();
        this.code = product.getCode();
        this.size = product.getSize();
        this.detailInfo = detailInfoAccessImgUrl;
    }
}

ProductInfoDto 분석하기

1. Anntation

 

- @Getter

기능 : 클래스에 선언된 필드에 대해 get 메서드를 자동 생성한다.

분석 : Entity 클래스의 경우 필드에 대한 접근 제한을 위해 private로 선언되었다. 따라서 필드 값에 접근하기 위한 별도의 방법이 필요하며 @Getter를 사용하는 방식을 채택하였다.

 

- @Setter

기능 : 클래스에 선언된 필드를 초기화하는 set 메서드를 자동 생성한다.

분석 : Product Entity의 toInfoDto에서 infoDto 생성시 builder를 이용하고 있다. 따라서 해당 annotation은 필요가 없어졌기에 제거하는 것이 적절하다.

 

- @ToString

기능 : 클래스에 선언된 필드를 '변수명=값' 형태의 문자열로 출력한다.

분석 : 해당 Annotation은 Test를 위해서만 사용되고 있다. 빌드시 파일의 용량을 굳이 키울 필요가 없기 때문에 Test에서 해당 기능을 대체할 수 있는 메서드를 구현하고 사용하는 것이 더 적합해 보인다.

 

- @NoArgsConstructor

기능 : 매개변수가 없는 생성자를 자동 생성한다.

분석 : 현재 사용되지 않고 있어 아무런 의미가 없어진 생성자이다. 따라서 제거하는 것이 적절하다.


2. Field

 

- private Long productId

기능 : 제품 기본키를 저장하기 위한 필드이다.

분석 : private는 필드에 대한 접근 제한을 위해 사용하였고, null을 확실히 구분하기 위해 Wrapper Long 사용하였다.

 

- private List<String> imgFiles

기능 : 제품 이미지에 대한 접근 url를 저장하는 필드이다.

분석 : 단순히 Product Entity의 데이터를 저장하는 필드이다. 

 

- private String name

기능 : 제품 이름을 저장하기 위한 필드이다.

분석 : 단순히 Product Entity의 데이터를 저장하는 필드이다.

 

- private Integer price

기능 : 제품 가격을 저장하기 위한 필드이다.

분석 : 단순히 Product Entity의 데이터를 저장하는 필드이다.

 

- private String code

기능 : 제품 분류코드를 저장하기 위한 필드이다.

분석 : 단순히 Product Entity의 데이터를 저장하는 필드이다.

 

- private String size

기능 : 제품 유효 사이즈를 저장하기 위한 필드이다.

분석 : 단순히 Product Entity의 데이터를 저장하는 필드이다.

 

- private String detailInfo

기능 : 제품 상세설명 이미지 경로를 저장하기 위한 필드이다.

분석 : 제품 상세이미지 url을 저장하는 필드이다.


3. Method

 

- public ProductInfoDto(Product product, List<String> productAccessImgUrl, String detailInfoAccessImgUrl)

기능 : 매개변수로 받은 값을 이용해 infoDto의 필드값을 초기화한다.

분석 : Product Entity에서 builder를 이용해 ProductInfoDto 인스턴스의 필드값을 초기화한다. 따라서 @Builder와 @AllArgsConstructor를 클래스 단위에 선언한 뒤 해당 메서드를 제거하는 것이 적절하다.


ProductInfoDto 리팩토링

수정된 경우  색, 추가된 경우  색, 삭제된 경우  색으로 표시하였다. 수정된 코드는 다음과 같다.

 

@Getter
@Builder
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class ProductInfoDto {

    private Long productId;
    private List<String> imgFiles;
    private String name;
    private Integer price;
    private String code;
    private String size;
    private String detailInfo;
}

 

1. Annotaion

 

- @Setter

builder 방식을 이용하기 때문에 해당 Annotation은 제거하는 것이 적절하다고 판단하였다.

 

- @ToString

해당 기능은 테스트에서만 사용되기 때문에 메인 코드에선 필요없다고 판단하여 제거하였다.

 

- @NoArgsConstructor

현재 사용하지 않아 의미없는 Annotation이라고 판단하여 제거하였다.

 

- @Builder

@Setter도 사용이 가능하지만 필드 초기화의 편의성과 안정성을 위해 선언하였다.

 

- @AllArgsConstructor(access = AccessLevel.PRIVATE)

ProductInfoDto의 모든 필드가 초기화되어야 하며 인스턴스 생성 방식은 builder로 통일하기 위해 PRIVATE 옵션을 설정하였다.


2. Field


3. Method

 

- public ProductInfoDto(Product product, List<String> productAccessImgUrl, String detailInfoAccessImgUrl)

@Builder와 @AllArgsConstructor를 사용하기 때문에 해당 생성자를 제거하였다.

 

 

 

Link

댓글