inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

Book 이외의 아이템 구현 질문입니다.

해결된 질문

261

이지훈

작성한 질문수 17

0

우선 강의 정말 유익했으며 친절한 답변도 항상 감사하고 있습니다~
강의가 진심으로 재미있어요!

제가 강의를 마치고 이것저것 해보고 싶어서 시도중입니다.(JPA 기본강의 잘듣고있습니당)
해보고싶은건 많지만 우선 Book 말고 Album과 Movie도 사용해보고 싶었습니다.

현재상황
- Item 엔티티에 itemType 변수추가(어떤 item인지 식별하기 위해서)
- Album,Movie의 Form객체,컨트롤러, 뷰(html)파일 등 생성
-서비스는 따로 구현x ItemService만 사용



주문 목록에 올리는것까진 금방했는데 수정에서 좀 걸렸습니다. 
삽질하다가 결국 생각해낸게 조금지저분하지만.. ItemType으로 어떤 아이템인지 if문으로 식별해서
각 아이템에 맞는 수정페이지를 매핑하는 방법으로 했습니다. updateItem 메서드에서 파라미터로 받기위한 ItemForm 객체를 하나 만들어서 업데이트 했습니다.

--------------- ItemController

package jpabook.jpashop.controller;

import jpabook.jpashop.domain.item.Album;
import jpabook.jpashop.domain.item.Book;
import jpabook.jpashop.domain.item.Item;
import jpabook.jpashop.service.ItemService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;

import java.util.List;

@Controller
@RequiredArgsConstructor
public class ItemController {

private final ItemService itemService;

// 아이템 선택 페이지로 매핑
@GetMapping("/items/new")
public String createForm(Model model) {
//model.addAttribute("form", new BookForm());
return "items/createItemFormAll";
}

// Book 클릭시 등록 페이지로 매핑
@GetMapping("/items/createItemForm")
public String CreateBook(Model model){
model.addAttribute("form", new BookForm());
return "items/createItemForm";
}

// 등록 페이지에서 버튼 클릭시 Book 생성 후 목록화면으로 매핑
@PostMapping("items/new/Book")
public String create(BookForm form) {
Book book = new Book();
book.setName(form.getName());
book.setPrice(form.getPrice());
book.setStockQuantity(form.getStockQuantity());
book.setAuthor(form.getAuthor());
book.setIsbn(form.getIsbn());
book.setItemType("Book");

itemService.saveItem(book);
return "redirect:/items";
}

// 상품 목록 클릭시 리스트 화면으로 매핑
@GetMapping("/items")
public String list(Model model) {
List<Item> items = itemService.findItems();
model.addAttribute("items", items);
return "items/itemList";
}

//상품 수정 화면 렌더링
@GetMapping("items/{itemId}/edit")
public String updateItemForm(@PathVariable("itemId") Long itemId, Model model) {
Item item = itemService.findOne(itemId);

if(item.getItemType() == "Book"){
BookForm form = new BookForm();
form.setId(item.getId());
form.setName(item.getName());
form.setPrice(item.getPrice());
form.setStockQuantity(item.getStockQuantity());
model.addAttribute("form", form);
return "items/updateItemForm";

}else if(item.getItemType() == "Movie"){
MovieForm form = new MovieForm();
form.setId(item.getId());
form.setName(item.getName());
form.setPrice(item.getPrice());
form.setStockQuantity(item.getStockQuantity());

model.addAttribute("form", form);
return "items/updateItemFormMovie";

}else if(item.getItemType() == "Album"){
AlbumForm form = new AlbumForm();
form.setId(item.getId());
form.setName(item.getName());
form.setPrice(item.getPrice());
form.setStockQuantity(item.getStockQuantity());

model.addAttribute("form", form);
return "items/updateItemFormAlbum";
}else {
//에러처리..
}

return null;
}

//상품 수정
@PostMapping("items/{itemId}/edit")
public String updateItem(@ModelAttribute("form") ItemForm form) {

itemService.updateItem(form.getId(), form.getName(), form.getPrice(), form.getStockQuantity());
return "redirect:/items";
}
}

--------------- ItemForm

package jpabook.jpashop.controller;

import lombok.Getter;
import lombok.Setter;

@Getter @Setter
public class ItemForm {
private Long id;
private String name;
private int price;
private int stockQuantity;
}

문제는 ItemForm을 이용하다보니 각 아이템의 고유필드값(Book-isbn,author Movie-director,actor 등)을 수정 못합니다.
Category객체를 이용해야 되나 싶었는데 손을 못대겠더라구요ㅠ

결국 제가 궁금한것은 이거입니다.
실무에선 어떤 방식으로 여러 item들을 사용하나요??
어떤식으로 코드를 짜야하는지 궁급합니다

spring spring-boot java JPA 웹앱

답변 1

0

김영한

안녕하세요. 지훈님

생각해보면 책을 등록하기 위한 화면과, 영화를 등록하기 위한 화면은 완전히 다른 화면일 가능성이 매우 높습니다.

여러가지 방법이 있지만 가장 단순하면서 실용적인 방법은 수정화면을 출력하기 위한 컨트롤러, view, 수정 처리를 하기 위한 컨트롤러까지 각각 따로 만드는 방법을 추천합니다.

감사합니다.

sdk 설정 오류

0

48

2

오탈자 - @Transactional

0

53

1

src/test/resources 테스트 경로 문제

0

49

1

상품 등록후 H2 db 출력 순서 바꿀 수 있나요?

0

62

1

MemberRepositoryTest 실행오류

0

77

1

boot 4.x >>> trasasction rolled back log & p6spy(영한님, 수업 자료 업데이트 해주시면 감사하겠습니다!!)

1

183

2

강의 마지막 QueryDSL 사용 부분 질문있습니다

1

137

2

클라이언트에서 isbn과 author 수정 요청을 한 경우에 대해 질문드립니다.

0

50

1

도메인 모델 패턴 vs 트랜잭션 스크립트 패턴

0

71

1

기본 생성자

0

59

1

h2 DB 연결시 jdbc url 변경 이유가 궁금합니다.

0

100

1

멤버서비스테스트 부분에서 막힙니다.

0

163

4

실무에서도 EntityManager를 이용해서 많이 작업하는 편일까요?

0

115

1

초반에 h2 다운로드 과정 꼭 필요한가요?

0

117

2

자신 필드에도 get으로 접근하는 이유가 있을까요?

0

111

1

24분 27초 연관관계 편의 메서드 위치

0

112

1

단건 주문만 가능하게 한건 의도한 부분이신가요?

0

107

2

빌드 툴, Gradle

0

57

1

h2연결은 된 것 같은데 엔티티 테이블까지 작성 후 확인해보아도 테이블이 안보입니다

0

73

2

Repository에서 EntityManager 주입 방식 차이

0

87

1

롬복과 사용자 정의 setter 메서드

0

70

1

주문 목록 조회 fetch join 질문드립니다

0

80

1

dirty checking 질문드립니다.

0

80

1

동시성 관련 질문입니다

0

72

1