JPA/JPA 활용
-
주문 도메인 개발 - 주문 로직 추가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로 변경해..
-
회원 도메인 개발JPA/JPA 활용 2023. 7. 11. 18:07
위의 사진과 같이 상품을 주문하는 도메인을 개발할 것이다. 각각의 Entity들을 살펴보면 관계형 데이터베이스의 의존관계를 통해 필요한 관계형 db들끼리 연관이 되어있다. 코드로 작성을 하기 전에 어떤 변수들이 필요한지, FK(foreign key)는 어떤 db의 변수로 지정할 지 등을 먼저 정리하고 코드로 작성하는 것이 좋다. 관계형 데이터 베이스는 3가지 형태가 있다. ManyToOne : 여러개와 하나의 관계를 나타냄 order에서 member와의 관계 OneToMany : 하나와 여러개의 관계를 나타냄 member에서 order의 관계 ManyToMany : 여러개 사이의 관계를 나타냄(사용 되도록 하지 않기) 일대 다 관계에서는 FK를 다수쪽에 넣기(Member와 Order가 있으면 Order에..