분류 전체보기 191

사용자 정의 리포지토리 구현

화면 조회시 사용되는 복잡한 쿼리들은 기존 리포지토리를 사용하지 말고, 새로운 리포지토리를 생성하여 사용 권장 // 기능 인터페이스 생성 public interface MemberRepositoryCustom { List findMemberCustom(); } // 인터페이스 구현 @RequiredArgsConstructor public class MemberRepositoryImpl implements MemberRepositoryCustom { // 이름을 맞춰야함 class명 + impl private final EntityManager em; // 주입 권장방식 @Override public List findMemberCustom() { return em.createQuery("select m f..

JPA/JPA 2020.06.09

페이징 처리

**페이지수는 0부터 시작한다 public interface MemberRepository extends JpaRepository { // 기본 페이징 처리(totalcnt 조회 가능) Page findByAge(int age, Pageable pageable); // 가져오려는 수보다 +1 더 가져와 구현 가능(totalcnt 없음), 모바일 device에서 구현할때 사용함.(미리 로딩 가능) Slice findByAge(int age, Pageable pageable); // 카운트 쿼리를 분리해서 사용이 가능하다. @Query(countQuery = "") ... } // 구현부 int page = 0; int limit = 3; PageRequest pageRequest = PageRequest...

JPA/JPA 2020.06.09

Auditing

엔티티 생성, 변경할 때 변경한 사람과 시간을 알고 싶은 경우 Main class에 @EnableJpaAuditing 추가 등록일 수정일 등록자 수정자 @EntityListeners(AuditingEntityListener.class) @MappedSuperclass public class JpaBaseEntity { @CreatedDate @Column(updatable = false) private LocalDateTime createdDate; @LastModifiedDate private LocalDateTime lastModifiedDated; @CreatedBy @Column(updatable = false) private String createdBy; @LastModifiedBy priva..

JPA/JPA 2020.06.09

컬렉션 조회(OneToMany)

Fetch 조인 사용시 페이징 처리는 하지 말것. 모든 데이터 조회 이후 메모리에서 페이징 처리하므로 큰 장애가 발생할 수 있음. Fetch 조인 페이징 처리 방법 XtoOne 관계는 모두 Fetch 조인 컬렉션은 지연 로딩으로 조회 fetch 조인 로딩값 개수 설정 spring: jpa: properties: hibernate: default_batch_fetch_size: 100 // in 쿼리 갯수 lazy 로딩 값 한번에 호출 복합키는 복합키 클래스를 생성해서 처리해야함.

JPA/JPA 2020.06.09

OneToOne Entity

부모 Entity 조회 // OneToOne 관계의 경우 Lazy 로딩이 정상 동작하지 않는 경우가 많다. // lazy 로딩이 정상동작하기 위해선 특정 조건을 충족해야한다. // lazy 로딩 발생 jpaUserRepository.findAll() .stream() .map(user -> // Model 데이터 매핑 User.builder() .userId(user.getId()) .name(user.getName()) .build(); ).forEach(user -> System.out.println(user.toString())); // Lazy 로딩이 발생하지 않는다.(JPQL 사용) em.createQuery( "select new com.test.react.Model.User(u.id, u.n..

JPA/JPA 2020.06.09

변경 감지와 병합(merge)

준영속 엔티티 영속성 컨텍스트가 관리하지 않는 엔티티로 update해도 데이터는 변경되지 않음. 임의로 만들어낸 엔티티 Book book = new Book(); book.setId(form.getId()); book.setName(form.getName()); 준영속 엔티티 수정하는 방법(병합 사용은 추천하지 않음) 변경 감지 기능 사용(Dirty Checking), setter 대신 함수를 이용해서 변경하도록 하라 tem findItem = itemRepository.findOne(itemId); findItem.setPrice(bookParam.getPrice()); findItem.setName(bookParam.getName()); findItem.setStockQuantity(bookParam..

JPA/JPA 2020.06.09

JPA에서 사용하는 다양한 API

JPA에서 사용하는 다양한 API JPQL QueryDSL 네이티브 SQL JDBC API 직접 사용, MyBatis, SpringJdbcTemplate 함께 사용 JPQL(객체 지향 SQL) 엔티티 중심으로 개발 검색에도 테이블이 아닌 엔티티 객체를 대상으로 검색 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL 필요 EntityManager.find() 객체 그래프 탐색(a.getB().getC()) ANSI 표준 문법은 모두 지원 동적 쿼리 생성이 매우 어려움 JPQL은 엔티티 객체를 대상으로 쿼리 List resultList = em.createQuery( "select m from Member m where m.username like '%kim%'", // 테이..

JPA/JPA 2020.06.09

JPA 의 데이터 타입 분류

엔티티 타입 @Entity로 정의하는 객체 데이터가 변해도 식별자로 추적 가능 값 타입 int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 식별자가 없으므로 변경시 추적 불가 불변 객체로 만들어야 부작용을 피할수 있다. 값 타입은 공유하면 안됨 기본 타입(primitive type) 자바 기본 타입(int, double) 래퍼 클래스(Integer, Long) String 생명주기를 엔티티에 의존 회원을 삭제하면 이름, 나이 필드도 함께 삭제 회원 이름 변경시 다른 회원의 이름도 함께 변경되면 안됨 기본 타입은 항상 '값'을 복사므로, 공유되지 않음 임베디드 타입(embedded type, 복합 값 타입) 새로운 값 타입을 직접 정의할 수 있음. 주로 기본 값 타입을..

JPA/JPA 2020.06.09

영속성 전이(CASCADE)

영속성 전이(CASCADE) ** 특정 엔티티가 개인 소유일 때 사용 자동 영속 상태 변환을 하려는 엔티티가 다른 연관관계가 있을 경우 사용하면 안된다. 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 변환 ALL, PERSIST 위주로 사용함. @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL) private List childList = new ArrayList(); Child child1 = new Child(); Child child2 = new Child(); Parent parent = new Parent(); parent.addChild(child1); parent.addChild(child2); // em.persi..

JPA/JPA 2020.06.09