상품 등록
쇼핑몰이라면 관리자 혹은 운영자가 상품을 등록해야만 소비자들이 쇼핑몰에 접속하여 상품을 구입할 수 있을 것이다. 따라서 상품 등록 기능을 구현하는 것을 첫 번째 목표로 삼았다. 상품 등록 기능을 위해 어떤 것들을 해야할지 먼저 리스트를 만들어보았다.
상품 이미지에 관해 Entity를 만들고, Entity별로 Dto를 만드는 작업이 필요했다. 또한, ItemController에서 상품 등록 페이지로 이동할 수 있는 매핑 URL을 만들어주어야한다.
상품을 등록하였을 때, 상품의 이미지들을 보여주고, 대표 이미지가 있다면 메인 페이지에서 이를 보여줄 수 있는 상품 이미지 Entity를 먼저 구현하였다.
ItemImg.java
package com.shop.entity;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.*;
@Entity
@Table(name="item_img")
@Getter
@Setter
public class ItemImg {
@Id
@Column(name="item_img_id")
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String imgName; // 이미지 파일명
private String oriImgName; // 원본 이미지 파일명
private String imgUrl; // 이미지 조회 경로
private String repimgYn; // 대표 이미지 여부
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="item_id")
private Item item;
public void updateItemImg(String oriImgName, String imgName, String imgUrl) {
this.oriImgName = oriImgName;
this.imgName = imgName;
this.imgUrl = imgUrl;
}
}
public void updateItemImg
는 원본 이미지 파일명, 업데이트할 이미지 파일명, 이미지 경로를 파라미터로 입력 받아서 이미지 정보를 업데이트하는 메소드이다.
DTO(Data Transfer Object)
는 계층 간 데이터 교환을 하기 위해 사용하는 객체로 로직을 가지지 않는 순수한 데이터 객체(getter & setter 만 가진 클래스)
상품을 등록할 때는 화면으로부터 전달된 DTO 객체를 Entity 객체로, 상품을 조회할 때는 Entity 객체를 DTO 객체로 바꿔주기 위해서는 DTO를 먼저 생성해야한다. 이 작업이 상당히 반복적인 작업이었다. DTO에 대해서는 사실 지금까지는 아무 생각없이 만들곤 했는데 이번에 공부하면서 그 중요성을 제대로 알게 되었다.
(DTO에 관해 참고한 블로그 : https://studyandwrite.tistory.com/402)
ItemImgDto.java
package com.shop.dto;
import com.shop.entity.ItemImg;
import lombok.Getter;
import lombok.Setter;
import org.modelmapper.ModelMapper;
@Getter
@Setter
public class ItemImgDto {
private Long id;
private String imgName;
private String oriImgName;
private String imgUrl;
private String repImgYn;
private static ModelMapper modelMapper = new ModelMapper();
public static ItemImgDto of(ItemImg itemImg) {
return modelMapper.map(itemImg, ItemImgDto.class);
}
}
ModelMapper
객체를 추가ItemImg
Entity 객체를 파라미터로 받아서 ItemImg
객체의 자료형과 멤버변수의 이름이 같을 때, ItemImgDto
로 값을 복사해서 반환다음으로 상품 데이터 정보를 전달하는 DTO이다.
ItemFormDto
package com.shop.dto;
import com.shop.constant.ItemSellStatus;
import com.shop.entity.Item;
import lombok.Getter;
import lombok.Setter;
import org.modelmapper.ModelMapper;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.ArrayList;
import java.util.List;
@Getter
@Setter
public class ItemFormDto {
private Long id;
@NotBlank(message = "상품명은 필수 입력 값입니다.")
private String itemNm;
@NotNull(message = "가격은 필수 입력 값입니다.")
private Integer price;
@NotBlank(message = "이름은 필수 입력 값입니다.")
private String itemDetail;
@NotNull(message = "재고는 필수 입력 값입니다.")
private Integer stockNumber;
private ItemSellStatus itemSellStatus;
private List<ItemImgDto> itemImgDtoList = new ArrayList<>(); // 1.
private List<Long> itemImgIds = new ArrayList<>(); // 2.
private static ModelMapper modelMapper = new ModelMapper();
public Item createItem() {
return modelMapper.map(this, Item.class); // 3.
}
public static ItemFormDto of(Item item) {
return modelMapper.map(item, ItemFormDto.class); // 4.
}
}
ModelMapper
를 이용하여 Entity 객체와 DTO 객체 간의 데이터를 복사하여 복사한 객체를 반환해주는 메소드상품 등록 페이지로 접근할 수 있도록 ItemController
클래스도 수정하였다. ItemFormDto
를 model 객체에 담아서 뷰로 전달하도록 했다.
ItemController.java
@Controller
@RequiredArgsConstructor
public class ItemController {
private final ItemService itemService;
@GetMapping(value = "/admin/item/new")
public String itemForm(Model model) {
model.addAttribute("itemFormDto", new ItemFormDto());
return "item/itemForm";
}