ProductUpdateDto 살펴보기
ProductUpdateDto는 클라이언트 요청에 담긴 제품 정보를 저장하고 Product Entity를 업데이트하기 위한 클래스이다.
- DTO 클래스이다.
- ProductDto 인터페이스를 상속받고 있다.
- getDirectoryPath, getViewPath 메서드가 구현되어 있다.
@Getter
@Builder
@AllArgsConstructor
@ToString(callSuper = true)
public class ProductUpdateDto implements ProductDto {
private Long productId;
private List<MultipartFile> imgFiles;
@NotBlank(message = "제품 이름이 필요합니다.")
private String name;
@PositiveOrZero(message = "가격은 0원 이상이어야 합니다.")
private Integer price;
@NotBlank(message = "제품 분류번호가 필요합니다.")
private String code;
@NotBlank
private String size;
private MultipartFile detailInfo;
public String getDirectoryPath() {
return "products/" + this.code + "/" + this.name + "/";
}
public String getViewPath() {
return getDirectoryPath() + "view/";
}
}
Product 분석하기
1. Anntation
- @Getter
기능 : 클래스에 선언된 필드에 대해 get 메서드를 자동 생성한다.
분석 : Entity 클래스의 경우 필드에 대한 접근 제한을 위해 private로 선언되었다. 따라서 필드 값에 접근하기 위한 별도의 방법이 필요하며 @Getter를 사용하는 방식을 채택하였다.
- @Builder
기능 : 클래스에 선언하는 경우 모든 필드를 포함하는 builder를 생성하며 매개변수가 선언된 메서드에 선언하면 해당하는 매개변수만을 초기화할 수 있는 builder를 생성한다. 매개변수 순서에 상관없이 필드의 초기화를 진행할 수 있다.
분석 : @Setter도 사용이 가능하지만 필드 초기화의 편의성과 안정성을 위해 @Builder를 이용하여 초기화를 진행하였다.
- @AllArgsContructor
기능 : 클래스의 필드 전체를 매개변수로 받는 생성자를 자동 생성한다.
분석 : updateDto는 클라이언트의 요청에서 추출한 데이터를 저장하기 위해 구현한 클래스이다. 따라서 모든 필드를 매개변수로 받아 처리하는 것이 적절하다. @Builder 를 사용해 인스턴스를 생성하므로 생성자는 private로 접근 제어자를 설정하여 생성 방식을 통일해야 한다.
- @ToString(callSuper = ture)
기능 : 클래스에 선언된 필드를 '변수명=값' 형태의 문자열로 출력한다.
분석 : 해당 Annotation은 Test를 위해서만 사용되고 있다. 빌드시 파일의 용량을 굳이 키울 필요가 없기 때문에 Test에서 해당 기능을 대체할 수 있는 메서드를 구현하고 사용하는 것이 더 적합해 보인다.
- @NotBlank(message = "~~")
기능 : 데이터 바인딩 시점에 필드 값이 최소한 white-space 하나라도 포함되었는 지 유효성을 검증한다. 유효하지 않은 경우 message 옵션으로 설정한 에러 메시지를 예외에 담아 전달한다.
분석 : 바인딩 시점에 유효성을 검증하는 것은 적절하지만 현재 각 필드 적합한 유효성 검증 과정이 필요하다. @Pattern을 이용하거나 다른 유용한 Annotation 확인 필요하다.
- @PositiveOrZero
기능 : 필드의 갑이 0이상의 정수인지 유효성을 검증한다. 유효하지 않은 경우 message 옵션으로 설정한 에러 메시지를 예외에 담아 전달한다.
분석 : 가격이 음수가 나오는 상태를 방지한다는 점에선 적절하다. 제품의 최대 가격에 대한 기준이 마련된 뒤에 다시 확인해볼 필요가 있다.
2. Field
- private List<MultipartFile> imgFiles
기능 : 클라이언트 요청 데이터 중 이미지 파일을 저장하기 위한 필드이다.
분석 :
- List 타입 안에 파일에 대한 정보를 쉽게 취급할 수 있도록 MultipartFile을 사용하여 저장된다.
- @Valid를 이용한 유효성 검증이 불가하기 때문에 따로 유효성 검증이 필요하다.
- private String name
기능 : 제품의 이름을 저장하기 위한 필드이다.
분석 : 필수적으로 입력해야 하는 정보이며 null과 blank가 들어올 수 없다. 이미지 저장 경로 생성시 사용되는 데이터로 중복 검사가 실시되어야 한다.
- private Integer price
기능 : 제품 가격을 저장하기 위한 필드이다.
분석 : 필수적으로 입력해야 하는 정보이며 0이상의 정수가 입력되어야 한다. 이후 제품 최대 가격 기준이 구체화됨에 따라 타입이 수정될 수 있다.
- private String code
기능 : 제품 분류코드를 저장하기 위한 필드이다.
분석 : 필수적으로 입력해야 하는 정보이며 null과 blank가 들어올 수 없다. 프로젝트에서 설정한 분류코드를 지켰는지 패턴 검사가 필요하다.
- private String size
기능 : 제품 유효 사이즈를 저장하기 위한 필드이다.
분석 : 필수적으로 입력해야 하는 정보이며 null과 blank가 들어올 수 없다. 's,m,l,xl,xxl'과 같은 패턴을 입력받아 저장하고 있지만 String 타입으로 저장하는 것은 DB에서 메모리 효율이 떨어질 수 있다. 타입을 변경하는 것을 고려할 필요가 있다.
- private MultipartFile detailInfo
기능 : 제품 상세설명 이미지 경로를 저장하기 위한 필드이다.
분석 : @Valid를 이용한 유효성 검증이 불가하기 때문에 따로 유효성 검증이 필요하다.
3. Method
- public String getDirectoryPath()
기능 : detatilInfo와 imgFolderPath의 공통된 경로를 반환한다.
분석 : 제품 정보로 부터 유일한 이미지 저장 경로를 생성하여 반환한다. 메서드의 이름을 변경하여 기능을 좀 더 구체화하는 것이 필요하다.
- public String getViewPath()
기능 : 제품 이미지가 저장된 경로를 반환한다.
분석 : imgFolderPath가 제거되는 지금 해당 메서드는 제거돼야 한다.
ProductUpdateDto 리팩토링
수정된 경우 ■ 색, 추가된 경우 ■ 색, 삭제된 경우 ■ 색으로 표시하였다. 수정된 코드는 다음과 같다.
@Getter
@Builder
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class ProductUpdateDto implements ProductDto {
private Long productId;
private List<MultipartFile> imgFiles;
@NotBlank(message = "제품 이름이 필요합니다.")
private String name;
@PositiveOrZero(message = "가격은 0원 이상이어야 합니다.")
private Integer price;
@Pattern(regexp = "[A-Z][0-9]{2}[MW]", message = "제품 분류번호의 형식이 유효하지 않습니다.")
private String code;
@NotBlank(message = "제품 유효 사이즈가 필요합니다.")
private String size;
private MultipartFile detailInfo;
public String getImgSavePath() {
return "products/" + code + "/" + name;
}
}
1. Annotaion
- @AllArgsContructor(access = AccessLevel.PRIVATE)
builder 사용으로 생성자를 이용한 인스턴스 생성 방식에 제한을 두기위해 private 접근 제어자로 설정하였다.
- @ToString
해당 기능은 테스트에서만 사용되기 때문에 메인 코드에선 필요없다고 판단하여 제거하였다.
- @Pattern(regexp = "[A-Z][0-9]{2}[MW]", message = "제품 분류번호의 형식이 유효하지 않습니다.")
기존 @NotBlank 만으로는 분류코드 유효성 검증이 불가능하다고 판다하여 @Pattern을 사용하였다.
2. Field
3. Method
- public String getImgSavePath()
기존 getDirectoryPath 메서드의 이름을 기능의 의미를 더 잘 나타내도록 수정하였다.
- public String getViewPath()
imgFolderPath와 detailInfo가 제거되어 하나의 경로만 필요해졌기 때문에 해당 메서드를 제거하였다.
'개발서 > ToyProject-Smart' 카테고리의 다른 글
| [Toy - Smart] ProductDao 구현 (0) | 2023.02.25 |
|---|---|
| [Toy - Smart] ProductInfoDto 리팩토링 (0) | 2023.02.25 |
| [Toy - Smart] ProductSaveDto 리팩토링 (0) | 2023.02.25 |
| [Toy - Smart] Product 리팩토링 (0) | 2023.02.25 |
| [Toy - Smart] CategoryItem 리팩토링 (0) | 2023.02.24 |
댓글