JPA
-
주문 기능 테스트JPA/JPA 활용 2023. 7. 11. 18:11
주문 기능을 테스트할 때 여러 테스트에서 공통으로 사용될 Item, Member 엔티티 생성을 공통으로 묶어서 private으로 선언했다. private Item createBook(String name, int price, int stockQuantity) { Item book = new Book(); book.setName(name); book.setPrice(price); book.setStockQuantity(stockQuantity); em.persist(book); return book; } private Member creatMember() { Member member = new Member(); member.setName("회원1"); member.setAddress(new Address(..
-
주문 리포지토리, 서비스 개발JPA/JPA 활용 2023. 7. 11. 18:11
주문 도메인을 이용해서 repository와 service를 개발할 것이다. OrderRepository class @Repository @RequiredArgsConstructor public class OrderRepository { private final EntityManager em; public void save(Order order) { em.persist(order); } public Order findOne(Long id) { return em.find(Order.class, id); } // public List findAll(OrderSearch orderSearch) {} // 검색 기능은 나중에 작성 } repository는 save와 findOne을 해주는 것 말고 특별한 기능을..
-
주문 도메인 개발 - 주문 로직 추가JPA/JPA 활용 2023. 7. 11. 18:10
지금까지 한 것들은 전부 주문을 위한 개발이고, 비즈니스 로직들이 어떻게 JPA를 통해서 동작하는지 알 수 있기 때문에 주문 도메인 개발이 가장 중요한 도메인이다. 주문 엔티티 Order class // 생성 메서드 // 주문을 생성을 할 때부터 createOrder이 호출 됨 public static Order createOrder(Member member, Delivery delivery, OrderItem... orderItems) { Order order = new Order(); order.setMember(member); order.setDelivery(delivery); for (OrderItem orderItem : orderItems) { order.addOrderItem(orderIte..
-
상품 리포지토리, 서비스 개발JPA/JPA 활용 2023. 7. 11. 18:10
ItemRepository class @Repository @RequiredArgsConstructor public class ItemRepository { private final EntityManager em; public void save(Item item) { if (item.getId() == null) { em.persist(item); // 새로 생성된 객체는 persist (신규로 등록) } else { em.merge(item); // update 비슷한건데 나중에 공부하고 일단 넘어가기 } } public Item findOne(Long id) { return em.find(Item.class, id); } public List findAll() { return em.createQuer..
-
상품 엔티티 개발(비즈니스 로직)JPA/JPA 활용 2023. 7. 11. 18:09
item entity에 stockQuantity를 이용해서 수량을 계산하는 로직을 만든다. // 비즈니스 로직 // // 데이터를 가지고 있는 곳 쪽에 수량 비즈니스 로직이 있는 것이 객체지향 관점에서 좋다. /** * stock 증가 */ public void addStock(int quantity) { this.stockQuantity += quantity; } /** * stock 감소 */ public void removeStock(int quantity) { int restStock = this.stockQuantity - quantity; if (restStock < 0 ) { throw new NotEnoughStockException("need more stock"); } this.stoc..
-
회원 가입, 조회 기능 테스트JPA/JPA 활용 2023. 7. 11. 18:09
테스트코드에서 service의 기능들을 테스트해 볼 것이다. @RunWith(SpringRunner.class) // 스프링이랑 같이 엮어서 junit을 실행하는 것 @SpringBootTest // 스프링부트를 띄운 상태로 테스트(이게 없으면 Autowired가 다 실패) @Transactional // 트랜잭션 class MemberServiceTest { @Autowired MemberService memberService; @Autowired MemberRepository memberRepository; @Test public void 회원가입() throws Exception { // given Member member = new Member(); member.setName("kim"); // ..
-
회원 리포지토리, 서비스 개발JPA/JPA 활용 2023. 7. 11. 18:08
MemberRepository class @Repository // Repository로 스프링 빈 등록(컴포넌트 스캔의 대상) @RequiredArgsConstructor public class MemberRepository { // @Autowired -> @RequiredArgsConstructor로 대체 // 원래는 @PersistenceContext인데 스프링 데이터 JPA에서 @Autowired를 지원해주는 것 private EntityManager em; /* public MemberRepository(EntityManager em) { this.em = em; } */ // -> @RequiredArgsConstructor로 대체 public void save(Member member) {..
-
엔티티 설계시 주의점JPA/JPA 활용 2023. 7. 11. 18:08
1. 엔티티에는 Setter를 되도록 사용하지 않아야한다. - 공부를 할 때에는 Setter를 사용했지만 실제로 Setter가 모두 열려있으면, 유지 보수가 어렵다. 2. 모든 연관관계는 지연로딩으로 설정 모든 연관관계는 지연로딩(LAZY)로 설정해야 한다. 즉시로딩(EAGER)은 예측이 어렵고 JPQL을 실행할 때 N+1 문제 등이 자주 발생한다. 데이터 하나를 가져올 때 그 데이터 뿐만 아니라 연관된 모든 데이터를 가져오기때문에 에러가 빈번하게 발생한다. 만약에 연관된 엔티티를 함께 DB에서 조회해야할 상황이면 fetch join 또는 엔티티 그래프 기능을 사용하면 된다. OneToMany는 기본이 LAZY지만, OneToOne, ManyToOne은 기본이 EAGER이기때문에 필수로 LAZY로 변경해..