스프링 DB 1편 - 데이터 접근 핵심 원리

JPA - Map 데이터를 List로 변환 해서 데이터 저장

샐님 2023. 7. 24. 03:43
728x90
반응형

인프런강의 JPA를 활용해서 연관된 테이블의 값을 저장하는 강의를 보다가 응용하고싶어서 Item에 color 필드를 추가했다.

 

내가 하고 싶은것 

 

JPA 에서 Item 엔티티에 item_id로 조인된 List<Color>colorList 에 화면에서 선택한 색상들을  item_id 를 외래키로 해서 데이터를 insert하고 싶었다. 

간단할 줄 알았는데 생각대로 구현하려다 보니까 복잡하게 구현한거 같다. 

좀더 간편한 방법이 있을 거 같기도하다. 

0. Item.java 

@Entity
@Getter
@Setter
public class Item {
.
.
.
.
 @Transient
 private List<String> colors;
 @OneToMany(mappedBy = "item",cascade = CascadeType.ALL)
 private List<Color> colorList = new ArrayList<>();
 .
 .
 
}

color.java

,,

public class Color{
    @Id
    @GeneratedValue
    @Column(name = "color_id")
        private Long id;
        private String name;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="item_id")
    private Item item ;
//연관관계 메서드
    public Color(Item item,String color) {
        this.setItem(item);
        this.setName(color);
    }

}

- 여기서 연관관계 메서드에서 item 을 setItem을 통해 넣어줘야지 생성될 color 데이터의 item_id에 값이 들어간다.

 

1. 화면에서 뿌려줄 색상 목록을 Map<String,String> 으로 작성

 - colors 이란 이름으로 model 에 담아서 화면에 넘긴다.

 @ModelAttribute("colors") public Map<String, String> Colors() {
       Map<String, String> colors = new LinkedHashMap<>();
           colors.put("red","red");
           colors.put("yellow","yellow");colors.put("blue","blue");
           colors.put("black","black");
           colors.put("white","white");return colors;
       }

2. add.html 화면에 thymleaf 로 foreach 를 활용해서 뿌리준다.

  <div class="form-group col-md-6 mb-3">
            <label for="Description" >상품 색상</label>
            <div th:each="color : ${colors}" class="form-check form-check-inline">
                <input type="checkbox" th:field="${item.colors}" th:value="${color.key}" class="form-check-input">
                <label th:text="${color.value}" class="form-check-label"></label>
            </div>
        </div>
th:each="color : ${colors}"   // 모델에 담은 map 데이터
th:field="${item.colors}"  // item 객체에서 임시 colors의 key값을 담아둘 List<String>  th:value="${color.key}" // Map의 key값을 value로 설정

 

th:text="${size.value}" // 화면에 보여질 문자열을 Map의 value로 설정 ** 여기서는 key와 value가 같음

3. controller 에서 model 에 담은 객체 리스트를 다시 color 객체로 변환한다. 그다음 service의 상품저장로직을 태워주기만 하면 된다.

 @PostMapping("/save")
    public String saveItem(@ModelAttribute("item") Item form, RedirectAttributes
            redirectAttributes, Model model) throws IOException {


        List<UploadFile> storeImageFiles = fileutils.storeFiles(form.getImageFiles());
        //데이터베이스에 저장
        Item item = new Item();

       ,,,
       List<Color> newcolor = new ArrayList<>();
  
        //색상
        for(String o : form.getColors()){
            Color  co  = new Color(item,o);
            newcolor.add(co);
        }
       
        item.setColorList(newcolor);
        itemService.saveItem(item);
       
    }

 

 

 

결과화면

상품 저장시 상품 색상을 선택한다.

순서대로 item/color 테이블에 데이터가 생성되는 것을 볼 수 있다. 

728x90
반응형