ORM이 DB의 TABLE과 매칭하는 자바 객체
- @Entity를 통해 선언가능 ( PK 반드시 필요 )
- @GeneratedValue 를 통해 ID 값 자동 증가 설정
Entity를 조회, 저장 등 컨트롤하는 주체
- JpaRepository를 상속받아야함
👉 이를 통해 다양한 JPA 메서드를 활용 가능- Entity 타입과 ID 타입을 필요
findAll()
모든 정보를 리스트로 받아서 힙메모리에 저장 후 가져옴
- 성능 이슈때문에 실제 잘 사용하지 않음
CrudRepository
우리가 사용하는 대부분의 JPA 메서드들이 존재
- save, delete 등..
JPA가 본격적인 실행전에 실행시켜 사전에 데이터 등록 가능
call next value for hibernate_sequence:
- ID 값을 자동적으로 증가 명령, 이거 없으면 save 할 때, 에러발생 -> 이미 있는 id = 1 에 집어넣어서
- spring.jpa.show-sql: true
jpa의 명령이 sql로 변환된 모습을 log로 보여줌- spring.jpa.properties.hibernate.format_sql: true
이쁘게 보여줌(한줄씩)
userRepository.findAll().forEach(System.out::println); // 동일한 의미, 편리하게 작성 가능 for(User user : userRepository.findAll()){ System.out.println(user); }List<User> users = userRepository.findAllById(Lists.newArrayList(1L, 2L, 3L)); // 동일한 의미, 편리하게 작성 가능 List<Long> ids = new ArrayList<>(); ids.add(1L); ids.add(2L); ids.add(3L); List<User> users = userRepository.findAllById(ids);
- Java 8 에서 추가된 stream 과 lamda 를 공부할 필요성
@Transactional 필요 -> lazy.fetch 라서
리턴을 Optional<> 로 함
저장된 총 데이터 갯수 반환
- long 형식으로 반환
userRepository.delete(userRepository.findById(1L).orElseThrow(RuntimeException::new));
- delete 의 인자는 Optional<>이어야함
- select 쿼리 날리고 delete 쿼리 각각 날림( for문 느낌 )
select 하지 않고 바로 delete 쿼리 날림( 사전 확인 x )
Page<User> users = userRepository.findAll(PageRequest.of(1, 3));
- PageRequest : Page 를 실제로 구현한 구현체
- of 의 첫번째 인자 : page 번호 ( 0부터 시작, zero based )
- of 의 두번째 인자 : 한 page 당 사이즈
ExampleMatcher matcher = ExampleMatcher.matching() .withIgnorePaths("name") .withMatcher("email", endsWith()); // 색인 기능 : 검색 Example<User> example = Example.of(new User(ma, "fastcampus.com"), matcher);
- withIgnorePaths() : 인자는 색인에서 무시함
- Example.of( Entity, matcher ) : matcher 에 맞는 값들이 필터되서 example 에 저장됨
- 실제로는 제약이 많아서( 문자열만 가능 ) example 보다 querydsl을 더 많이 사용, 실제로 많이 안쓰임
jpa 의 세부적인 부분에 대한 이해를 한층 높일 수 있었고 다양한 메서드로 편리하게 db를 관리할 수 있다는 점이 인상깊었다. 마지막으로 stream 과 lamda 에 대한 추가적인 학습이 필요할 것으로 보인다.