스프링데이터 + JPA/웹 애플리케이션 개발 27

27. 주문 목록 검색, 취소

@GetMapping("/orders") public String orderList(@ModelAttribute("orderSearch")OrderSearch orderSearch, Model model){ List orders = orderService.findOrders(orderSearch); model.addAttribute("orders",orders); return "order/orderList"; } public List findOrders(OrderSearch orderSearch){ return orderRepository.findAllString(orderSearch); } 이 부분은 일단 넘어가겠다. 나중에 QueryDSL 배울거기 때문에. 주문취소 @PostMapping("/orde..

26. 상품 주문

일반적인 예제는 아니다. 상품 주문할 멤버를 선택하고, 주문할 상품을 선택하고 수량을 입력하는 그런 식이다. 보통은 로그인 하고, 세션을 통해 서버의 세션저장소에서 서버가 어떤 member인지 계속 가져오고, 그 member가 상품을 주문하고 그런 식임. 지금은 좀 관리자가 상품 주문 시켜주는 느낌임. @Controller @RequiredArgsConstructor public class OrderController { private final OrderService orderService; private final MemberService memberService; private final ItemService itemService; @GetMapping("/order") public String c..

25. 변경감지와 병합

준영속 엔티티 영속성 컨테스트가 더는 관리하지 않는 엔티티 임의로 만들어낸 엔티티도 기존 식별자(id)를 가지고 있으면 그냥 준영속 엔티티로 봄. 준영속 엔티티 수정방법 2가지 변경 감지 기능 사용 병합 사용 변경감지기능 @Transactional public void updateItem(Long itemId, Book param){ Item findItem = itemRepository.findOne(itemId); findItem.setPrice(param.getPrice()); findItem.setName(param.getName()); findItem.setStockQuantity(param.getStockQuantity()); } 이렇게 영속성 컨텍스트로 관리하게끔 만들어서, 값을 변경한다. ..

24. 상품 수정

@GetMapping("/items/{itemId}/edit") public String updateItemForm(@PathVariable("itemId") Long itemId, Model model){ BookForm form = new BookForm((Book) itemService.findOne(itemId)); model.addAttribute("form", form); return "items/updateItemForm"; } 그냥 폼. 생성자는 그냥 내가 만들어 봤음. Book을 BookForm으로. 그걸 템플릿에 뿌려줌. 글번호/edit 이런 형식은 자주 있는 형식인듯. 아무 사이트 글에서 저렇게 edit 붙였더니 로그인 페이지로 이동되었음. 그 후 내 아이디로 로그인 하고 다시 edi..

22. 회원 목록 조회

회원 목록 조회는 간단하다. 주문조회 처럼 따로 조건도 없고, 그냥 조회해 오는거다. @GetMapping("/members") public String list(Model model){ List members = memberService.findMembers(); model.addAttribute("members", members); return "members/memberList"; } 저렇게 list 넘기고 # 이름 도시 주소 우편번호 이렇게 하면, th:each는 반복문, forEach랑 같다. ${members}의 각각의 원소들을 member라는 이름으로 member.address?.city는 address가 있냐? 그러면 찍고 없으면 안 찍는다. 엔티티는 최대한 순수하게, 그러니까, 로직도 비..

21. 회원 등록

회원 등록 부분의 컨트롤러, 문서를 개발할 것이다. @Controller @RequiredArgsConstructor public class MemberController { private final MemberService memberService; @GetMapping("/members/new") public String createForm(Model model){ model.addAttribute("memberForm", new MemberForm()); return "members/createMemberForm"; } } 보통 컨트롤러에서 service를 쓰니 일단 주입받는다. (@RequiredArgsCons~~ 저걸로 final 인자로 있는 생성자 생성해주고, 그럼 알아서 빈에서 주입됨.) /..

20. 웹 계층 개발

여기선 일단 SSR인 타임리프를 쓸 것이다. 웹계층 홈 화면, 레이아웃 회원 등록 회훤 조회 상품등록 상품 목록 상품 수정 변경 감지와 병합(merge) 상품 주문 주문 목록 검색, 취소 변경 감지와 병합은. 어떻게 데이터를 수정하는 것이 올바른 방법인가. 이제 컨트롤러와 문서이다. 먼저 화면을 그냥 가져왔다. 스프링 위주로 배울거기 때문에 그냥 화면은 가져왔다. thymeleaf 템플릿이며, fragment로 공통적인 부분들은 따로 빼서 그걸 가져오는 형식으로 템플릿을 구성했다. 화면 꾸미는 건 그냥 bootstrap 써서 기본적인걸로.. static에 접근할 때는 그냥 /css/css파일 이렇게 루트로 접근하면 되는 듯. 일단 홈화면만 만들어 놨음. 컨트롤러 @Slf4j @Controller publ..

19. 주문 검색 기능 개발

이것도 오더 서비스의 기능이긴 한데, 동적 쿼리가 필요한 부분이라 다른 것들 먼저 개발했다. 조회를 할 때 서비스에서, public List findOrders(OrderSearch orderSearch){ return orderRepository.findAll(orderSearch); } 저렇게 특정 조건을 넣어 검색하면, 그 조건에 맞는 쿼리만 가져올 것이다. 그래서 조회해올 때 동적쿼리가 필요하다. 조건은 어떤회원이 주문했는지, 또 어떤 주문상태인지 조건에 맞는 것만 조회할 수 있도록 그렇게 쿼리를 짜게끔 할 것이다. public List findAll(OrderSearch orderSearch){ em.createQuery("select o from Order o join o.member m", ..

18. 주문 기능 테스트

@Test public void 상품주문(){ Member member = new Member(); member.setUsername("회원1"); member.setAddress(new Address("서울", "강가", "123-123")); em.persist(member); Item book = new Book(); book.setName("시골 JPA"); book.setPrice(10000); book.setStockQuantity(10); em.persist(book); int orderCount = 2; Long orderId = orderSerivce.order(member.getId(), book.getId(), orderCount); Item findBook = itemService...