OrderServiceTest package com.jpabook.service; import com.jpabook.domain.Address; import com.jpabook.domain.Member; import com.jpabook.domain.Order; import com.jpabook.domain.OrderStatus; import com.jpabook.domain.item.Book; import com.jpabook.domain.item.Item; import com.jpabook.exception.NotEnoughStockException; import com.jpabook.repository.OrderRepository; import org.junit.Test; import org.ju..
Order package com.jpabook.domain; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import javax.persistence.*; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; @Entity @Table(name = "orders") @Setter @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Order { @Id @GeneratedValue @Column(n..
Order package com.jpabook.domain; import lombok.Getter; import lombok.Setter; import javax.persistence.*; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; @Entity @Table(name = "orders") @Setter @Getter public class Order { @Id @GeneratedValue @Column(name="order_id") private Long id; @ManyToOne @JoinColumn(name = "member_id") private Member member; @OneToMany(m..
ItemRepository package com.jpabook.repository; import com.jpabook.domain.item.Item; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; import javax.persistence.EntityManager; import java.util.List; @Repository @RequiredArgsConstructor public class ItemRepository { private final EntityManager em; public void save(Item item) { if(item.getId() == null) { em.per..
package com.jpabook.service; import com.jpabook.domain.Member; import com.jpabook.repository.MemberRepository; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.transaction.annotat..
MemberRepository package com.kyhslam.repository; import com.kyhslam.domain.Member; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; import javax.persistence.EntityManager; import java.util.List; @Repository @RequiredArgsConstructor public class MemberRepository { private final EntityManager em; public void save(Member member){ em.persist(member); } public ..
도메인 @Entity @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name = "dtype") @Setter @Getter public 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 ArrayList(); } @Entity @DiscriminatorValue("A") @Setter @Getter pub..
엔티티는 가급적 Setter를 사용하지 말자 - 변경포인트가 많아서 유지보수가 어렵다 모든 연관관계는 지연로딩으로 설정 - 즉시로딩(EAGER)은 예측이 어렵다. 특히, JPQL은 실행할 때 N+1문제가 자주 발생한다 - ManyToOne 은 Default가 EAGER 이기 때문에 안정성을 위해서 LAZY 로 바꿔야 된다.
@Query에는 JPQL(객체 쿼리)을 이용한다. JPQL은 쉽게 말해서 JPA에서 사용하는 Query Language이다. package com.kyhslam.persistence; import java.util.Collection; import java.util.List; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; import com.kyhslam.domain.Board; pub..
Page는 단순 데이터만의 추출하는 용도가 아니라, 웹에서 필요한 데이터들을 추가적으로 처리해 준다. package com.kyhslam.persistence; import java.util.Collection; import java.util.List; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.repository.CrudRepository; import com.kyhslam.domain.Board; public interface BoardRepository extends CrudRepository { public Page ..
package com.kyhslam.persistence; import java.util.Collection; import java.util.List; import org.springframework.data.domain.Pageable; import org.springframework.data.repository.CrudRepository; import com.kyhslam.domain.Board; public interface BoardRepository extends CrudRepository { // bno > ? ORDER BY bno DESC limit ?,? public List findByBnoGreaterThanOrderByBnoDesc(Long bno, Pageable paging); ..
쿼리 메소드는 스프링데이터 JPA의 핵심적인 기능 중 하나로 메소드 이름으로 쿼리를 생성할 수 있다는 장점이 있다. 메소드 이름으로 쿼리를 생성하기 위해 인터페이스에서 사용할 사용자 쿼리 메소드를 정의해 준다. 방식 : Collection findBy + 속성이름(속성타입) 기존의 Board 를 활용한 데이터 조회 예제 fidBy를 이용한 컬럼 조회 like 구문 and or 처리 부등호 order by package com.kyhslam.persistence; import java.util.Collection; import java.util.List; import org.springframework.data.repository.CrudRepository; import com.kyhslam.domain...