반응형
250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- sort
- 비주얼스튜디오
- 인프런무료강좌
- 인프런
- slice
- Blazor
- 인프런인강
- c#
- 객체의비교
- .NET
- 인프런강좌
- 제로초
- 자바스크립트recude
- 이벤트리스너
- 인터넷프로토콜
- 자바스크립트파라미터
- 틱택토구현
- 자바스크립트
- 코딩
- 객체리터럴
- 콜백함수
- 고차함수
- NPM
- 인프런강의
- 자바스크립트함수
- EntityFramework
- HTTP
- 인프런자바스크립트
- 자바스크립트틱택토
- 자바스크립트객체리터럴
Archives
- Today
- Total
샐님은 개발중
JPA - Map 데이터를 List로 변환 해서 데이터 저장 본문
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
반응형
'스프링 DB 1편 - 데이터 접근 핵심 원리' 카테고리의 다른 글
ItemController 에서 save 로직 리팩토링 (0) | 2023.07.24 |
---|---|
트랜잭션 문제 해결 - 트랜잭션 템플릿 (0) | 2023.07.21 |
스프링과 문제 해결 - 트랜잭션 - 트랜잭션 매니저 (0) | 2023.07.21 |
트랜잭션 이해 (0) | 2023.07.20 |
커넥션 풀과 데이터 소스 이해 (0) | 2023.07.20 |