상품 등록 기능 구현 -1-

jihan kong·2023년 2월 17일
0
post-thumbnail
post-custom-banner

상품 등록

상품 등록 기능

쇼핑몰이라면 관리자 혹은 운영자가 상품을 등록해야만 소비자들이 쇼핑몰에 접속하여 상품을 구입할 수 있을 것이다. 따라서 상품 등록 기능을 구현하는 것을 첫 번째 목표로 삼았다. 상품 등록 기능을 위해 어떤 것들을 해야할지 먼저 리스트를 만들어보았다.

상품 이미지에 관해 Entity를 만들고, Entity별로 Dto를 만드는 작업이 필요했다. 또한, ItemController에서 상품 등록 페이지로 이동할 수 있는 매핑 URL을 만들어주어야한다.

1. 상품 이미지 Entity 구현

상품을 등록하였을 때, 상품의 이미지들을 보여주고, 대표 이미지가 있다면 메인 페이지에서 이를 보여줄 수 있는 상품 이미지 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;
    }
}
  • 상품 Entity 와 다대일 단방향 관계로 매핑하였고, 지연 로딩을 설정해 매핑된 상품 Entity 정보가 필요한 경우 데이터를 조회하도록 했다.
  • public void updateItemImg 는 원본 이미지 파일명, 업데이트할 이미지 파일명, 이미지 경로를 파라미터로 입력 받아서 이미지 정보를 업데이트하는 메소드이다.

2. DTO 생성

DTO(Data Transfer Object) 는 계층 간 데이터 교환을 하기 위해 사용하는 객체로 로직을 가지지 않는 순수한 데이터 객체(getter & setter 만 가진 클래스)

상품을 등록할 때는 화면으로부터 전달된 DTO 객체를 Entity 객체로, 상품을 조회할 때는 Entity 객체를 DTO 객체로 바꿔주기 위해서는 DTO를 먼저 생성해야한다. 이 작업이 상당히 반복적인 작업이었다. DTO에 대해서는 사실 지금까지는 아무 생각없이 만들곤 했는데 이번에 공부하면서 그 중요성을 제대로 알게 되었다.

(DTO에 관해 참고한 블로그 : https://studyandwrite.tistory.com/402)

2-1. ItemImgDto

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 로 값을 복사해서 반환

2-2. ItemFormDto

다음으로 상품 데이터 정보를 전달하는 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.
    }
}
  1. 상품 저장 후 수정할 때 상품 이미지 정보를 저장하는 리스트
  2. 상품의 이미지 아이디를 저장하는 리스트 (수정 시에 이미지 아이디를 담아둘 용도)
  3. ModelMapper 를 이용하여 Entity 객체와 DTO 객체 간의 데이터를 복사하여 복사한 객체를 반환해주는 메소드

3. ItemController

상품 등록 페이지로 접근할 수 있도록 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";
    }
profile
학습하며 도전하는 것을 즐기는 개발자
post-custom-banner

0개의 댓글