- JPA(Java Persistence API)
- 자바 어플리케이션에서 관계형 DB를 사용하는 방식을 정의한 인터페이스
- JPA는 인터페이스이기 때문에 Hibernate 등이 JPA를 구현한다.
- Spring에서는 Spring Data JPA 모듈을 이용한다.
- CRUD SQL을 처리해주지만 수정 메소드를 제공하지 않는다.
- Spring Data JPA
- Spring Data JPA 사용하기
- 의존성 추가하기
- spring-boot-starter-data-jpa: 스프링 부트 pring Data JPA 추상화 라이브러리
- h2: 인메모리 관계형 데이터베이스, 재시작할 때마다 데이터 유지되지 않고 초기화
- 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' }
- 코드 작성
- BaseEntity 생성
- Repository 인터페이스 생성
- JpaRepository 상속 받기 (JpaRepository<Entity 클래스, Pk 타입(ex. Long)>)
- 상속하면 CRUD 메소드 자동 생성
@Repository public interface OwnerRepository extends JpaRepository<Owner, Long>{ /* * JpaRepository - CRUD + 페이징 처리 기능을 제공하는 인터페이스 * CrudRepository - 기본적인 Crud 기능을 제공하는 인터페이스 */ List<Owner> findAllByLastNameLike(String lastName); }
- 정의한 메소드 사용
- Service 클래스 생성 후 해당 클래스에서 Repository 가져와서 사용
- 이후 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; }
- 의존성 추가하기
- Spring Data JPA 사용하기
- 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()
- 레코드 삭제
- save()
- 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)
- And
- 쿼리문 사용 가능
- 메소드 이름만으로 해결이 안될떄는 직접 쿼리문 작성도 가능하다
728x90
'Back-end > Spring Boot' 카테고리의 다른 글
스프링부트3 백엔드개발자되기 / 2장 스프링 부트 3 시작하기 (0) | 2023.11.18 |
---|---|
스프링부트3 백엔드개발자되기 / 1장 자바 백엔드 개발자가 알아두면 좋은 지식 (0) | 2023.11.18 |
[Spring DB] Annotation (0) | 2023.11.06 |
[Spring Boot] Thymeleaf (0) | 2023.11.03 |
[Spring DB] BaseEntity (0) | 2023.11.03 |