인프런 커뮤니티 질문&답변
작성자 없음
작성자 정보가 삭제된 글입니다.
db가 바로 휘발됩니다?
작성
·
185
0
우선 기존의 기능에서
장바구니 기능을 추가하려다가 이 사단이 났습니다..
코드는 아래와 같습니다.
@PostMapping("/basket")
public String order(@RequestParam("memberId") Long memberId, @RequestParam("itemId") Long itemId, RedirectAttributes redirect){
memberService.addBasket(memberId, itemId);
List<MemberItem> memberItems = memberService.getMemberItems(memberId);
log.info("휘발 되기 전 사이즈: "+memberItems.size());
redirect.addAttribute("memberId",1L);
return "redirect:/baskets";
}
@GetMapping(value = "/baskets")
public String orderList(@RequestParam("memberId") Long memberId, Model model) {
Member member = memberService.findOne(memberId);
List<MemberItem> memberItems = memberService.getMemberItems(memberId);
log.info("휘발 되고 나서의 사이즈: "+memberItems.size());
List<Item> items = memberService.getItems(memberItems);
model.addAttribute("items", items);
return "basket/basketList";
}
위에서 휘발 되기 전 사이즈 로그를 출력하기 전에
memberService.addBasket(memberId, itemId);
위와 같은 코드를 작성하였기에, 사이즈가 1 나오는걸 예상했습니다.
다행히 휘발되기 전 사이즈는 1이 나왔습니다.
하지만, redirect하고나서.. 똑같이 memberItems.size()를 로그로 찍어보니까 사이즈가 0이 나옵니다.
즉, "휘발 되고 나서의 사이즈:"가 1이 뜰걸 생각했는데 0이 뜹니다.. 미치겠네요.
보아하니 H2로 db출력해보니 다른건 다 잘 출력되는데 제가 출력하고자하는것만 테이블에 아예 입력이 안됩니다.
ㅠㅠㅠㅠ
아래 소스코드는 addBasket 코드입니다.
@Transactional
public void addBasket(Long memberId, Long ItemId){
Member member = memberRepository.findOne(memberId);
Item item =itemRepository.findOne(ItemId);
MemberItem memberItem = MemberItem.createMemberItem(member, item);
memberItem.addMemberItem();
}
참고로 영속성으로 잘 하기 위해서 findOne도 잘 했고.. 그랬는데 왜 뭐가 잘못된지 도저히 모르겠어요 6시간째 해매고있어요.
선생님.. 제발 살려주세요.
2시간 뒤에 출근하러 가야는데 이거 해결하려다가 잠도 못자고..
저는 너무 답답합니다. 살려주세요 선생님 제발요.
답변 1
0
안녕하세요. MINSANG KIM님
역시 음주 코딩과 밤중 코딩은 개발자에게 해롭습니다 ㅎㅎ
아마 푹 자고 일어나시면 바로 딱 보이실거에요!
memberItem을 데이터베이스에 저장해야 하는데 관련 코드가 없네요.
결과적으로 다음 코드가 없습니다.
em.persisit(memberItem);
이런 시도는 너무 좋습니다. 하지만 최소한 기본편을 모두 듣고 나서 내공이 쌓인 다음에 활용을 하시는 것을 추천합니다.
화이팅!






존경하는 선생님, 무슨 말씀인지는 잘 알겠습니다!
그것도 한참 해매일때 생각은 해본 것이였는데요.
마지막으로 딱 한가지만 더 질문 드리겠습니다.
이후의 궁금증은 기본편 다 듣고나서도 이해가 안간다면 그때 다시 질문드리겠습니다.
em.persisit(memberItem);
를 안해줬다고 하셨는데요. 저도 이걸 할까 생각했지만..
orderItem에서는 persist가 없었잖아요?
단지 em.persist를 통해 order를 persist 해주고,
persist된 order안의 orderItem리스트인 orderItems를 이용해 값을 저장하면,
db에서 영속성에 의해? 자동 저장되는걸로 알고 있었습니다.
그래서 orderItem을 따로 persist를 해줄 필요가 없었던거구요.
(심지어 orderItem은 persist를 해주는 repository도 없지요..)
마찬가지로 제가 만든
memberItem도
persist된 member안에 있는 memberItems에 값을 저장하니까.
db에 자동 저장되는걸로 알고있었습니다.
제가 볼땐 orderItem이나 memberItem이나 똑같이 persist안해줘도 되는것 같은데
왜 memberItem에는 persist를 하라고 말씀해준지 궁금해요