스프링데이터 + JPA 112

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...

17. 주문 리포지토리, 서비스

리포지토리 @Repository @RequiredArgsConstructor public class OrderRepository { private final EntityManager em; public void save(Order order){ em.persist(order); } public Order findOne(Long orderId){ return em.find(Order.class, orderId); } // public List findAll(OrderSearch orderSearch){} } 간단하게 주문 저장, 주문 하나 가져오기. 그런데 여러개 가져오는데, 검색 옵션에 따라 가져오기. 저건 동적 쿼리가 필요해서 나중에 따로 함. 서비스 기능 요구 사항은 주문 조회 주문 주문 취소 먼저 ..

16. 주문 도메인 개발

주문, 주문상품 엔티티 개발 주문 리포지토리 개발 주문 서비스 개발 주문 기능 테스트 주문 검색 기능 테스트 구현 기능 상품 주문 주문 내역 조회 주문 취소 일단 주문 엔티티 개발 public static Order createOrder(Member member, Delivery delivery, OrderItem... orderItems){ Order order = new Order(); order.changeMember(member); order.changeDelivery(delivery); for (OrderItem orderItem : orderItems) { order.addOrderItem(orderItem); } order.setStatus(OrderStatus.ORDER); order.se..

15. 상품 개발

상품 엔티티 개발(비즈니스 로직) 상품 리포지토리 개발 상품 서비스 개발 상품 등록 상품 목록 조회 상품 수정 @Entity @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name = "dtype") @Getter public abstract class Item { @Id @GeneratedValue @Column(name = "item_id") private Long id; private String name; private int price; private int stockQuantity; @ManyToMany(mappedBy = "items") private List categories = new ArrayLis..

14. 회원 테스트

테스트 요구사항 회원가입 성공 회원가입 시 같은 이름이 있을 시 예외 발생 @SpringBootTest @Transactional class MemberServiceTest { @Autowired MemberService memberService; @Test public void 회원가입(){ Member member = new Member(); member.setName("memberA"); Long savedMemberId = memberService.join(member); Member findMember = memberService.findOne(savedMemberId); assertThat(member).isEqualTo(findMember); } @Test public void 중복_회원_예..