[Fast Campus] 한번에 끝내는 Java/Spring : SpringData JPA 기초

Player-Geun·2022년 1월 21일
0

✨ Repository Interface 계층

Entity

ORM이 DB의 TABLE과 매칭하는 자바 객체

  • @Entity를 통해 선언가능 ( PK 반드시 필요 )
  • @GeneratedValue 를 통해 ID 값 자동 증가 설정

Repository

Entity를 조회, 저장 등 컨트롤하는 주체

  • JpaRepository를 상속받아야함
    👉 이를 통해 다양한 JPA 메서드를 활용 가능
  • Entity 타입과 ID 타입을 필요

findAll()

모든 정보를 리스트로 받아서 힙메모리에 저장 후 가져옴

  • 성능 이슈때문에 실제 잘 사용하지 않음

CrudRepository

우리가 사용하는 대부분의 JPA 메서드들이 존재

  • save, delete 등..

✨ Repository Interface 메소드 실습 (1)

data.sql

JPA가 본격적인 실행전에 실행시켜 사전에 데이터 등록 가능

call next value for hibernate_sequence:
  • ID 값을 자동적으로 증가 명령, 이거 없으면 save 할 때, 에러발생 -> 이미 있는 id = 1 에 집어넣어서

SQL Log

  • spring.jpa.show-sql: true
    jpa의 명령이 sql로 변환된 모습을 log로 보여줌
  • spring.jpa.properties.hibernate.format_sql: true
    이쁘게 보여줌(한줄씩)

stream & lamda

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 를 공부할 필요성

getOne()

@Transactional 필요 -> lazy.fetch 라서

findById()

리턴을 Optional<> 로 함


✨ Repository Interface 메소드 실습 (2)

count()

저장된 총 데이터 갯수 반환

  • long 형식으로 반환

delete

userRepository.delete(userRepository.findById(1L).orElseThrow(RuntimeException::new));
  • delete 의 인자는 Optional<>이어야함
  • select 쿼리 날리고 delete 쿼리 각각 날림( for문 느낌 )

deleteInBatch() & deleteAllInBatch()

select 하지 않고 바로 delete 쿼리 날림( 사전 확인 x )

Page

Page<User> users = userRepository.findAll(PageRequest.of(1, 3));
  • PageRequest : Page 를 실제로 구현한 구현체
  • of 의 첫번째 인자 : page 번호 ( 0부터 시작, zero based )
  • of 의 두번째 인자 : 한 page 당 사이즈

ExampleMatcher

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 에 대한 추가적인 학습이 필요할 것으로 보인다.

profile
주니어 개발자

0개의 댓글