Back-end/Spring Boot

[Spring DB] JpaRepository

Bay Im 2023. 11. 3. 14:01
  • JPA(Java Persistence API)
    • 자바 어플리케이션에서 관계형 DB를 사용하는 방식을 정의한 인터페이스
    • JPA는 인터페이스이기 때문에 Hibernate 등이 JPA를 구현한다.
    • Spring에서는 Spring Data JPA 모듈을 이용한다.
    • CRUD SQL을 처리해주지만 수정 메소드를 제공하지 않는다.

 

  • Spring Data JPA
    • Spring Data JPA 사용하기
      1. 의존성 추가하기
        1. spring-boot-starter-data-jpa: 스프링 부트 pring Data JPA 추상화 라이브러리
        2. h2: 인메모리 관계형 데이터베이스, 재시작할 때마다 데이터 유지되지 않고 초기화
        3. build.gradle
        dependencies {
            **implementation 'org.springframework.boot:spring-boot-starter-data-jpa'**
            implementation 'org.springframework.boot:spring-boot-starter-web'
            compileOnly 'org.projectlombok:lombok'
            **runtimeOnly 'com.h2database:h2'**
            annotationProcessor 'org.projectlombok:lombok'
            testImplementation 'org.springframework.boot:spring-boot-starter-test'
        }
        
      2. 코드 작성
        1. BaseEntity 생성
        2. Repository 인터페이스 생성
          1. JpaRepository 상속 받기 (JpaRepository<Entity 클래스, Pk 타입(ex. Long)>)
          2. 상속하면 CRUD 메소드 자동 생성
          @Repository
          public interface OwnerRepository extends JpaRepository<Owner, Long>{
              
              /*
               * JpaRepository - CRUD + 페이징 처리 기능을 제공하는 인터페이스
               * CrudRepository - 기본적인 Crud 기능을 제공하는 인터페이스
               */
          
              List<Owner> findAllByLastNameLike(String lastName);
          }
          
        3. 정의한 메소드 사용
          1. Service 클래스 생성 후 해당 클래스에서 Repository 가져와서 사용
          2. 이후 Controller 클래스 생성 후 Service 클래스 가져와서 사용
          @Service
          @RequiredArgsConstructor
          public class OwnerServiceImpl implements OwnerService {
          
              private final OwnerRepository ownerRepository;
          
              @Override
              public Owner save(Owner owner) {
                  // DB 등록 처리 로직 구현
                  return ownerRepository.save(owner);
              }
          }
          
          // -------------------------------------------------
          
          @RequestMapping("/owners") // baseUrl(기본 URL)
          @Controller  // bean으로 등록시키기 위한 annotation 추가
          @RequiredArgsConstructor
          public class OwnerController {
              private static final String VIEWS_OWNER_CREATE_OR_UPDATE_FORM = "owners/createOrUpdateOwnerForm";
              private final OwnerService ownerService;
          
          }
          
  •  JpaRepository
    • JPA는 메소드 이름 만으로 쿼리 생성 가능
    • Method
      • save()
        • 레코드 저장(insert, update)
        @Override
            public Owner save(Owner owner) {
                // DB 등록 처리 로직 구현
                return ownerRepository.save(owner);
            }
        
      • findOne()
        • Primary key로 레코드 한 건 찾기
      • findAll()
        • 전체 레코드 불러오기
        • 정렬, 페이징 가능
        @Override
            public List<Owner> findAll() {
                return ownerRepository.findAll();
            }
        
      • findById()
        • Id 값을 파라미터로 select
        @Override
            public Owner findById(Long id) {
                Optional<Owner> optionalOwner = ownerRepository.findById(id);
        
                if (optionalOwner.isPresent()) {  // optionalOwner 내부의 값이 유효하면
                    return optionalOwner.get();  // optionalOwner 내부에서 해당 객체를 꺼냄
                } else {
                    // 예외 던지기
                    return null;
                }
                // 위의 if 문 한줄로 표현
                // ownerRepository.findById(id).orElse(null); // orElseThrow(람다 형태) 활용 권장
            }
        
      • count()
        • 레코드 개수
      • delete()
        • 레코드 삭제
    • Keyword
      • And
        • 여러 필드를 and로 검색
        • ex) findByEmailAndUserId(String email, String userId)
      • Or
        • 여러 필드를 or로 검색
        • ex) findByEmailOrUserId(String email, String userId)
      • Between
        • 필드의 두 값 사이에 있는 항목 검색
        • ex) findByCreatedAtBetween(Date fromDate, Date toDate)
      • LessThan
        • 작은 항목 검색
        • ex) findByAgeLessThanEqual(int age)
      • GreaterThanEqual
        • 크거나 같은 항목 검색
        • ex) findByAgeGraterThanEqual(int age)
      • Like
        • like 검색
        • ex) findByNameLike(String name)
      • IsNull
        • null인 항목 검색
        • ex) findByJobIsNull()
      • In
        • 여러 값 중에 하나인 항목 검색
        • ex) findByJob(String … jobs)
      • OrderBy
        • 검색 결과를 정렬하여 전달
        • ex) findByEmailOrderByNameAsc(String email)
    • 쿼리문 사용 가능
      • 메소드 이름만으로 해결이 안될떄는 직접 쿼리문 작성도 가능하다
728x90