스프링 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
반응형